c - 易失性不会阻止变量被优化



据我所知,"volatile"关键字用于防止编译器优化未使用的变量。我正在使用STM32板,我声明并初始化一个变量,如下所示;

volatile uint32_t errorCallbackCounter = 24 ;

并且永远不要再使用它。

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

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

所以不稳定的关键字没有完成它的工作,或者 - 更有可能 - 我知道它有问题。

提前谢谢。

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

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

但是,您可以使用以下命令将变量标记为"无论如何都需要">

__attribute__((used))

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

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

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

最新更新