【问题标题】:is volatile keyword really needed when variable changed in interrupt routine在中断例程中更改变量时确实需要 volatile 关键字
【发布时间】:2016-11-23 09:22:03
【问题描述】:

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

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

    • 执行条件码

    • 将变量设置为假

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

没有volatile 关键字,代码似乎无法正常工作,但是当我将变量设置为volatile 时,它似乎可以工作,但我不相信,因为:

  1. 首先我认为 cortex M4f 不包含数据缓存内存
  2. second : 这种情况由编译器处理 (arm keil)

请回答;

如果为真则执行正文代码 2. 列表项

【问题讨论】:

  • @dkolmakov :这或多或少是重复的,但关键可能没有解决 cache memory 的硬件功能和 的软件技术之间的误解>“在寄存器中缓存一个值”.
  • 如果编译器很好并且意识到它不能到处乱跑并假设与 ISR/回调共享的变量有关,则不需要它。然而,许多嵌入式系统编译器并不是那么好。

标签: c embedded volatile interrupt-handling


【解决方案1】:

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

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

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

您可能会从 Embedded.com 上的 Introduction to the volatile keyword 中受益。它正好涵盖了这个问题。

【讨论】:

    【解决方案2】:

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

    volatile const char *const ptr = 0x4000;

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

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2013-08-06
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2020-08-24
      • 2015-10-10
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多