我有一个小函数,使用volatile变量
将值写入HWvoid gige_rx_prepare(void) {
volatile uint hw_write;
// more code here
hw_write = 0x32;
}
gcc版本4.7.3(Altera 13.1 Build 162)将此变量标记为 set但未使用,即使它是易失性的,也有助于写入HW寄存器。
我仍然希望在任何其他变量上看到此警告。有没有办法在 volatile变量上避免这个警告,而不需要为代码中的每个volatile变量设置gcc属性?
答案 0 :(得分:5)
局部变量不是h / w寄存器的良好表示,这也是您看到警告的部分原因。
编译器抱怨(正确)因为hw_write是堆栈上的局部变量。在这种情况下,编译器确实有足够的数据来推断它是无意义的赋值。如果它是一个全局变量或一个指向volatile volatile的指针,那么就没有警告,因为变量生命周期不受函数范围的限制,因此它可能已被用于其他地方。
以下示例编译时没有任何警告:
volatile int hw_write2; // h/w register
void gige_rx_prepare2(void) {
// more code here
hw_write2 = 0x32;
}
void gige_rx_prepare3(void) {
volatile int *hw_write3 = (void*)0x1234; // pointer to h/w register.
// more code here
*hw_write3 = 0x32;
}