当变量在中断例程中改变时,是否真的需要 volatile 关键字
is volatile keyword really needed when variable changed in interrupt routine
我正在使用 nrf52 微控制器 (CORTEX 34F) 处理器。我对主循环进行了变量检查,该检查在主循环和定时器中断例程中都进行了修改。
主循环检查变量是否为真:
执行条件代码
将变量设置为 false
- 定时器中断例程每 10 毫秒将变量设置为真
没有 volatile
关键字,代码似乎不起作用,但是当我将变量设置为 volatile
时它似乎起作用但我不相信因为:
- 首先我认为cortex M4f不包含数据缓存
- 其二:本案例由编译器(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 语句对于映射设备的硬件寄存器很有用。
我正在使用 nrf52 微控制器 (CORTEX 34F) 处理器。我对主循环进行了变量检查,该检查在主循环和定时器中断例程中都进行了修改。
主循环检查变量是否为真:
执行条件代码
将变量设置为 false
- 定时器中断例程每 10 毫秒将变量设置为真
没有 volatile
关键字,代码似乎不起作用,但是当我将变量设置为 volatile
时它似乎起作用但我不相信因为:
- 首先我认为cortex M4f不包含数据缓存
- 其二:本案例由编译器(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 语句对于映射设备的硬件寄存器很有用。