当变量在中断例程中改变时,是否真的需要 volatile 关键字

is volatile keyword really needed when variable changed in interrupt routine

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

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

    • 执行条件代码

    • 将变量设置为 false

  2. 定时器中断例程每 10 毫秒将变量设置为真

没有 volatile 关键字,代码似乎不起作用,但是当我将变量设置为 volatile 时它似乎起作用但我不相信因为:

  1. 首先我认为cortex M4f不包含数据缓存
  2. 其二:本案例由编译器(arm keil)处理

请回答任何问题;

if true 执行主体代码 2.列表项

您对volatile关键字有误解;具体来说,它 与缓存无关 - 缓存一致性完全由硬件处理,volatile 对此没有影响。

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

您的 main() 函数中的代码是 "unaware" 读取之间可能会发生中断,因此可以优化读取。 volatile 关键字指示编译器生成代码以显式读取内存。无论读取结果是缓存命中还是未命中,还是根本没有缓存,这都无关紧要 - 这是硬件问题。

阅读 Introduction to the volatile keyword 上的 Embedded.com,您可能会受益匪浅。它完全涵盖了这个问题。

除上述评论外,大多数应用程序开发人员对以下声明的有效性感到困惑。声明中同时存在 volatile 和 const 关键字会引起混淆,即变量怎么可能是 const 又是 volatile?

volatile const char *const ptr = 0x4000;

了解 volatile 表示变量可以在程序范围之外更改很重要。以上 statement/similar 语句对于映射设备的硬件寄存器很有用。