易失性不会阻止变量进行优化

时间:2019-07-18 14:44:32

标签: c memory volatile

据我所知,“ volatile”关键字用于防止编译器优化未使用的变量。我正在使用STM32开发板,并且按如下所示声明和初始化变量;

volatile uint32_t errorCallbackCounter = 24 ;

再也不用了。

在调试时,看不到此变量。我正在使用STMStudio(实时变量观察器)进行检查,当我要导入变量时,errorCallbackCounter的地址被视为0x0。

但是当我在任何地方使用它时,它都变得可见。

所以volatile关键字没有发挥作用,或者-可能我知道它有问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

volatile表示每次访问时,系统将从内存中加载此变量。 不允许编译器将数据直接存储到寄存器中。

  

volatile关键字阻止编译器对涉及易失性对象的代码执行优化,从而确保每个易失性变量分配和读取都具有相应的内存访问权限。如果没有volatile关键字,编译器将知道每次使用时都不需要从内存中重新读取变量,因为不应从任何其他线程或进程对其内存位置进行任何写操作。

答案 1 :(得分:1)

链接器可以删除从未使用过的变量

volatile关键字会影响访问变量的代码,从而防止 access 被编译器重新排列或删除。上面的行是带有初始化程序的变量 definition ,它不算作访问,而是在main()开始之前进行排列的。但是,如果可访问程序代码未对其进行引用,甚至根本未对其进行访问,则链接器认为将其删除是安全的,没人会注意到。

不过,您可以使用

将变量标记为“无论如何都需要”
__attribute__((used))

放在定义的末尾。这适用于gcc,其他编译器可能有另一个指令。还有一个链接器选项,我现在不记得要在可执行文件中包括所有未使用的数据部分。

相关问题