我在我的嵌入式固件中使用了很多volatile
个变量,但大部分时间我只需要一个函数中的一个点,我需要确定该值是最近的(在开始时)。但是函数的其余部分引用了相同的变量名,并且值可以在平均时间内更改,从而产生非常意外的代码流/结果。我知道这可以通过在函数内部使用临时变量来解决,但我一直在寻找更好的解决方案。
现在我想知道,而不是将整个变量标记为volatile
,是否有一种方法可以指示编译器(gcc)使用特殊关键字,我想要读取变量,就像它被标记为volatile一样,所以我只能在函数开头使用该关键字一次?
答案 0 :(得分:0)
我对这个场景感到有点困惑 - 如果你希望一个特定的访问变量被视为volatile
,请使用
dest = *(volatile TYPE *)&src;
其中TYPE是src
的类型。您可能还需要
asm volatile ("" ::: "memory");
在精心控制的位置,以防止编译器在易失性读取中移动其他内存位置的加载/存储。
同时调查C11的_Atomic
类型。 (我不确定GCC是否支持这些。)
答案 1 :(得分:0)
如果您的变量在内存中并且您的嵌入式系统支持它,则可以使用内存屏障。确保在读取值时不会访问内存。