当中断例程中的变量发生变化时,确实需要volatile关键字

时间:2016-11-23 09:22:04

标签: c embedded volatile interrupt-handling

我正在使用nrf52微控制器(CORTEX 34F)处理器。我对主循环进行了变量检查,在主循环和定时器中断程序中都进行了修改。

  1. 主循环检查变量是否为真:

    • 执行条件代码

    • 将变量设为false

  2. 定时器中断例程每10 ms将变量设置为true
  3. 没有nohup关键字,代码似乎无法正常工作,但当我将变量设置为volatile时,它似乎有效,但我不相信,因为:

    1. 首先我认为cortex M4f不包含数据缓存
    2. 第二:这个案例是编译器(arm keil)的handeld
    3. 任何答案,请

      如果为true则执行正文代码  2.列出项目

2 个答案:

答案 0 :(得分:10)

您对volatile关键字存在误解;特别是与缓存相关 - 缓存一致性完全由硬件处理,volatile对此没有影响。

volatile的目的是防止编译器生成假定值无法更改的代码。 C语言不提供对执行线程的支持,并且生成代码就好像有一个线程一样;如果编译器可以在单个执行线程中观察到某个变量尚未被显式修改,它可以删除显式读取并使用已知值(例如存储在寄存器中)。

main()函数中的代码“不知道”在读取之间可能发生中断,因此可以优化读取。 volatile关键字指示编译器生成代码以显式读取内存。无论这种方式或其他方式是否导致高速缓存命中或未命中,或者根本没有高速缓存 - 这都是硬件问题。

您可以从Embedded.com上阅读 Introduction to the volatile keyword 中受益。它涵盖完全这个问题。

答案 1 :(得分:0)

添加上述评论,大多数应用程序开发人员对以下语句的有效性感到困惑。在声明中存在volatile和const关键字时会产生混淆,即如何将变量变为const但不稳定?

volatile const char * const ptr = 0x4000;

重要的是要理解volatile表示变量可以在程序范围之外变化。上述语句/类似语句对于映射设备的硬件寄存器很有用。