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

Mak*_*RBI 1 c embedded volatile interrupt-handling

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

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

    • 执行条件代码

    • 将变量设置为false

  2. 定时器中断例程每10 ms将变量设置为true

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

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

任何答案,请;

if true执行正文代码2.列出项目

Cli*_*ord 10

你对这个volatile关键词有误解; 具体地说,它是相关的缓存-缓存的一致性是由硬件完全处理,volatile对没有效果.

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

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

您可以从Embedded.com上的volatile关键字简介中获益.它涵盖这个问题.