volatile上的gcc unused-but-set-variable警告

时间:2014-02-10 21:15:13

标签: c gcc

我有一个小函数,使用volatile变量

将值写入HW
void 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属性?

1 个答案:

答案 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;
}