gcc对volatile变量的unused-but-set-variable警告

6

我有一个小函数,使用volatile变量向硬件写入值。

void gige_rx_prepare(void) {

    volatile uint hw_write;

    // more code here

    hw_write = 0x32;
}

gcc版本4.7.3(Altera 13.1 Build 162)将此变量标记为已设置但未使用,尽管它是易失性的,但它有助于编写硬件寄存器。

我仍然希望在任何其他变量上看到这个警告。有没有办法避免在代码中对易失性变量发出此警告,而不必为每个易失性变量设置gcc属性?

1个回答

7

局部变量不是硬件寄存器的良好表示,这也是您看到警告的部分原因。

编译器正确地抱怨,因为hw_write是堆栈上的局部变量。在这种情况下,编译器确实有足够的数据来推断它是一个无意义的赋值。如果它是全局变量或指向易失性uint的指针,则不会发出警告,因为变量的生命周期不会受限于函数范围,因此它可以在其他地方使用。

以下示例编译时没有任何警告:

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

好的一般性回答。 对于我列出的问题,需要通过与硬件设计师的合作来调整原始代码,以解决硬件中的问题。 - ilya1725
请注意,将其设置为“static”(生命周期不受范围限制)也无法消除警告。 - Gauthier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接