【发布时间】:2017-10-18 02:47:07
【问题描述】:
我使用 SES 导入我的 keil MDK 项目,我的 keil 项目运行良好。使用SES,我有一个问题,就是我有一个像这样的全局变量:
uint32_t g_ulMainLoopCounter = 0;
我在 timmer isr 中减少它:
if (g_ulMainLoopCounter > 0)
{
g_ulMainLoopCounter--;
}
在我的主函数中,我等到 'g_ulMainLoopCounter' 减少到 0:
int main(void)
{
system_init(); //init timer etc...
g_ulMainLoopCounter = 500;
while (g_ulMainLoopCounter)
{
}
....
}
现在的问题是,'while' 之后的代码永远不会被执行,甚至 'g_ulMainLoopCounter' 减少到 0。这在 keil 中运行良好。
然后,如果我对“g_ulMainLoopCounter”使用“volatile”限定符,它就可以工作,代码如下:
volatile uint32_t g_ulMainLoopCounter = 0;
我的优化级别设置为无,意味着不优化我的代码。
我知道使用 'volatile' 限定符是一个更好的方法,但 'g_ulMainLoopCounter' 只是一个例子,有很多变量使用像“g_ulMainLoopCounter”(表示多访问变量,更改函数中的值或isr 和其他函数中的比较)在我的程序中,我必须检查程序中的每个变量并确定是否需要使用“volatile”限定符的变量吗?如果是这样,我认为这太难了。有没有简单的解决方案?
【问题讨论】:
-
C11 标准草案 n1570:5.1.2.3 程序执行 5 当抽象机的处理因接收到信号而中断时,既不是无锁原子对象也不是无锁原子对象的对象的值volatile sig_atomic_t 类型的未指定,浮点环境的状态也是如此。当处理程序退出时,处理程序修改的任何对象(既不是无锁原子对象也不是 volatile sig_atomic_t 类型)的值变得不确定[...]