2

volatile在我的嵌入式固件中使用了很多变量,但大多数时候,函数中只有一个点我需要确保值是最近的(在开始时)。但是该函数的其余部分引用了相同的变量名,并且值可以同时更改,从而产生非常意外的代码流/结果。我知道这可以通过在函数内使用临时变量来解决,但我一直在寻找更好的解决方案。

现在我想知道,不是将整个变量标记为volatile,而是有一种方法可以使用特殊关键字指示编译器(gcc),我想读取变量,就好像它被标记为 volatile 一样,所以我只能使用该关键字一次在函数的开头?

4

2 回答 2

0

如果您的变量在内存中并且您的嵌入式系统支持它,您可以使用内存屏障。确保在读取值时没有任何内容访问内存。

于 2013-10-04T20:06:09.963 回答
0

我对这种情况有点困惑-如果您希望对变量的特定访问被视为volatile,请使用

dest = *(volatile TYPE *)&src;

其中 TYPE 是 的类型src。您可能还需要

asm volatile ("" ::: "memory");

在仔细控制的位置,以防止编译器在易失性读取中移动其他内存位置的加载/存储。

还要调查 C11 的_Atomic类型。(我不确定 GCC 是否支持这些。)

于 2013-10-04T19:58:13.233 回答