我使用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'预选赛?如果是这样,我认为这太难了。有没有简单的解决方案?
答案 0 :(得分:0)
您似乎知道volatile
的含义
你的问题主要是你是否应该有意识地考虑所有变量
答案是:是的。
如果这看起来太困难,或者意外,只需离开volatile
,只有当某些东西无法正常工作时才开始考虑它。
然而,你可能最终发现这个解决方案实际上非常困难
也许你的问题是由这种经历引起的。
好消息是,经验会变得更容易 在某些时候,你会阅读代码,或者写下代码,然后感到一阵颤抖。凭借更多的经验,您将能够分辨出“挥发性失踪” - 与志愿者之间的区别。 “变量未初始化”-shiver。