我知道,“volatile”关键字用于防止编译器优化未使用的变量。我在一个STM32板工作,我声明并初始化一个变量如下;

volatile uint32_t errorCallbackCounter = 24 ;

再也不用了。
调试时,看不到此变量。我正在用STMStudio(一个实时变量观察程序)检查它,当我想导入变量时,errorCallbackCounter的地址被看作0x0。
但当我在任何地方使用它时,它就会变得清晰可见。
所以volatile关键字没有做好它的工作,或者更可能的是,我知道它有问题。
提前谢谢。

最佳答案

链接器可以删除从未使用过的变量
volatile关键字影响访问变量的代码,防止编译器重新排列或删除访问。上面的行是一个带有初始值设定项的变量定义,它不算作访问,而是在main()开始之前排列的。但是如果它没有被可访问的程序代码引用,或者根本没有被访问,链接器认为删除它是安全的,没有人会注意到。
但是,您可以使用

__attribute__((used))

放在定义的末尾。这与gcc一起工作,其他编译器可能有另一个指令。还有一个链接器选项,我现在想不起来是否在可执行文件中包含所有未使用的数据节。

08-06 00:36