【问题标题】:volatile variable in segger embedded studio with gcc带有 gcc 的 segger 嵌入式工作室中的 volatile 变量
【发布时间】: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 类型)的值变得不确定[...]

标签: c gcc arm


【解决方案1】:

你好像知道volatile的意思。
您的问题主要是您是否应该有意识地考虑所有变量。
答案是:是的。

如果这看起来太困难或意外,请离开 volatile,仅在某些事情无法按预期工作时才开始考虑它。
然而,您最终可能会发现这个解决方案实际上非常困难。
也许您的问题是由这次经历引起的。

好消息是,有了经验,它会变得更容易。
在某些时候,您会阅读或编写代码,并感到后背不寒而栗。有了更多的经验,您将能够分辨出“volatile is missing”-颤抖和例如颤抖之间的区别。 “变量未初始化”-颤抖。

【讨论】:

  • 是的,我知道“易失性”是什么意思。我使用之前使用 ARM-CC 的 keil MDK,从不使用 GCC,并且我从不使用 'volatile' 限定符来进行多访问变量,因为 ARM-CC 没问题,程序运行良好。现在,我使用GCC,问题出现了,是ARM-CC不够严谨吗?我知道使用 'volatile' 限定符是一种更好的方法,我只是不想对所有全局变量或全局结构变量的成员使用 'volatile' 限定符,因为会有很多 [-Wdiscarded-qualifiers] 警告,所以我需要知道什么时候必须使用 'volatile' 限定符,什么时候不需要。
  • 当我在不同线程(包括 ISR)中访问变量时,我必须对变量使用 'volatile' 限定符,如果我在同一个线程的不同函数中访问变量,我不会需要使用 'volatile' 限定符,对吗?所以,如果系统不使用操作系统,意味着除了 ISR 只有一个线程,所以我只需要对 ISR 和主循环多访问的变量使用 'volatile' 限定符,是这样吗?
  • 何时可以安全地省略volatile 是一个独立且复杂的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多