使用gcc在segger嵌入式工作室中使用volatile变量

时间:2017-10-18 02:47:07

标签: c gcc arm

我使用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工作得很好。

然后,如果我使用' volatile'对于' g_ulMainLoopCounter'的限定符,它有效,代码就像这样:

volatile uint32_t g_ulMainLoopCounter = 0;

我的优化级别设置为none,表示不优化我的代码。

我知道使用' volatile'限定符是一种更好的方法,但是' g_ulMainLoopCounter'只是一个例子,有很多变量使用像" g_ulMainLoopCounter" (在我的程序中,表示多访问变量,更改函数或isr中的值以及其他函数中的比较),我必须检查程序中的每个变量并确定是否需要变量使用' volatile'预选赛?如果是这样,我认为这太难了。有没有简单的解决方案?

1 个答案:

答案 0 :(得分:0)

您似乎知道volatile的含义 你的问题主要是你是否应该有意识地考虑所有变量 答案是:是的。

如果这看起来太困难,或者意外,只需离开volatile,只有当某些东西无法正常工作时才开始考虑它。
然而,你可能最终发现这个解决方案实际上非常困难 也许你的问题是由这种经历引起的。

好消息是,经验会变得更容易 在某些时候,你会阅读代码,或者写下代码,然后感到一阵颤抖。凭借更多的经验,您将能够分辨出“挥发性失踪” - 与志愿者之间的区别。 “变量未初始化”-shiver。