如果在AVR编程中将所有变量定义为volatile,那会不好?

时间:2013-07-17 19:43:21

标签: c volatile avr atmega

我读过在某些情况下(全局变量,或while(变量)等),如果变量未定义为volatile,则可能会导致问题。

如果我将所有变量定义为volatile?

会导致问题吗?

4 个答案:

答案 0 :(得分:11)

如果当前作用域之外的东西或任何后续的子作用域(想想:函数调用)可以修改你正在使用的变量(有一个定时器中断会增加你的变量,你给了一个其他的var的引用代码可能会响应中断等,然后变量应该声明为volatile。

volatile是对编译器的暗示,“其他东西可能会改变这个变量。”并且编译器的响应是,“哦。好的。我永远不会相信我在寄存器或堆栈中的这个变量的副本。每次我需要使用这个变量时我会从内存中读取它,因为我的副本在寄存器中可能已经过时了。“

声明一切易失性将使你的代码变慢很多并导致更大的二进制文件。而不是这样做,正确的答案是了解需要标记为volatile的内容,为什么需要,以及适当标记。

答案 1 :(得分:3)

一个volatile变量必须让编译器尊重它的内存访问。

这意味着:

  • 如果您读取变量的值,则不允许编译器重用已经“知道”的值。例如,它可能位于外部设备寄存器中,并且可能会被外围硬件更改。
  • 如果您对变量写了一些内容,编译器必须写入该内存。它不允许环顾四周并说“好吧,没有别的东西使用那个变量,所以我真的不需要写它”。例如,它可能再次是外部外设寄存器(可能是UART的Tx FIFO)。

请注意volatile并非(总是)足以进行线程之间的通信(或主循环和中断服务例程之间的通信:https://stackoverflow.com/a/2485177/106092。另请参阅https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt


只能使事情变得不稳定。如果你发现自己不得不让事情变得不稳定以使它们发挥作用,那么它就归结为以下两点之一:

  • 编译器错误
  • 您的代码不正确

根据我的经验,它几乎总是后者,但你可能需要咨询一位律师来解释原因!


但是在回答你的实际问题时,如果你让一切变得不稳定,那么代码仍然可以正常工作,尽管你可能有一些你不需要的性能限制!

答案 2 :(得分:1)

如果一个变量的值随时可以独立于程序而改变,那么它就是易变的。如果另一个程序(或线程)或外部事件(键盘,网络...)可以修改变量,这将非常有用。它告诉编译器每次访问变量时都会从其原始位置重新读取变量的值。它可以防止编译器优化内存访问。因此声明每个变量volatile可能会降低程序的速度。

顺便说一句:我知道没有关于AVR编程的特殊性。

答案 3 :(得分:1)

如果您需要将所有变量配置为volatile,那么您的软件存在一些根深蒂固的设计问题。是的,它会因性能而下降。但是多少钱?除非您提供CPU及其说明的规范,否则我们不知道。