gcc未使用,但在volatile上设置变量警告

gcc未使用,但在volatile上设置变量警告,c,gcc,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)将此变量标记为已设置但未使用的变量,尽管它是一个易失性变量,有助于HW寄存器的写入 我仍然希望在任何其他变量上看到此警告。有没有一种方法可以避免对易失性变量发出此警告

我有一个小函数,它使用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)将此变量标记为已设置但未使用的变量,尽管它是一个易失性变量,有助于HW寄存器的写入


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

局部变量不是h/w寄存器的良好表示形式,这也是您看到此警告的部分原因

编译器抱怨(正确),因为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;
}

回答得好。在我列出的问题中,必须在硬件设计师的帮助下调整原始代码,以解释硬件中的怪癖。请注意,将其设置为
静态(寿命不受范围限制)并不会删除警告。