我正在使用nrf52微控制器(CORTEX 34F)处理器。我对主循环进行了变量检查,在主循环和定时器中断程序中都进行了修改。
主循环检查变量是否为真:
执行条件代码
将变量设为false
没有nohup
关键字,代码似乎无法正常工作,但当我将变量设置为volatile
时,它似乎有效,但我不相信,因为:
任何答案,请
如果为true则执行正文代码 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表示变量可以在程序范围之外变化。上述语句/类似语句对于映射设备的硬件寄存器很有用。