哪里用volatile?

时间:2010-09-06 06:12:59

标签: c compiler-construction operating-system volatile linux-device-driver

我读过volatile关键字,但我不知道在什么情况下我应该使用它。

当内存(变量)得到更新并且进程没有意识到这一点?

在什么情况下驱动程序应该使用volatile变量?

6 个答案:

答案 0 :(得分:12)

我的世界中最常见的情况是编程使用内存映射I / O的微控制器。由于外部数字输入,寄存器中的值可能会发生变化,但如果您没有将变量声明为volatile,编译器可能会完全优化代码,您会想知道为什么没有任何作用。

Matt建议我修饰有关代码“优化”的声明。通过指针在代码中访问内存映射的I / O.当您想要检查按钮的状态时,通常会按位与按钮的位掩码对应寄存器的值。如果你没有指定volatile,编译器会说,“嘿,你的代码实际上永远不会改变那个指针的值,所以我只是删除那个你按位进行AND运算的语句,因为值总是一样!“。

希望这有点清楚我的陈述。谢谢你的建议,马特。

答案 1 :(得分:3)

正如您使用linux-device-driver标记标记的那样,在Linux内核中编码的一些具体建议可能是有序的。

通常,您不需要在Linux内核代码中编写volatile。在可能需要volatile的情况下,它的使用包含在您应该调用的核心内核函数中。例如,如果您正在进行内存映射I / O,那么您应该使用ioremap()writel()readl()等。

答案 2 :(得分:2)

除了别人所说的外,volatile关键字一般是为了防止编译器表单进行优化。 在某些存储器映射寄存器中,寄存器的值保持改变(例如,RTC时钟寄存器),使用易失性关键字。 看一下这个例子:

RTC_CLOCK _time;
TIME _currentTime = _time ;
while(_currentTime - _time >= 100)
{

//Do something

}

//rest of the code 

如果我们在TIME之前没有附加volatile关键字,那么这段代码就像_currentTime - _time = 0一样,编译器不会考虑它下面的while循环:

RTC_CLOCK _time;
TIME _currentTime = _time ;
//rest of the code

为了防止这种情况,我们必须将volatile关键字与TIME一起使用。

答案 3 :(得分:0)

这可能对您有所帮助

http://www.kcomputing.com/volatile.html

答案 4 :(得分:-1)

易失性变量是可以在任何时候改变的变量,而程序不知道它。

我想不出日常编程中volatile关键字的任何用处,但它可能会出现。

答案 5 :(得分:-2)

据我所知,在C中,应该使用volatile关键字,对来自多个源(进程)的变量执行并发的非同步操作。如果变量声明为volatile,那么所有进程将始终直接从其内存位置访问变量,而不是复制微处理器缓存中的变量并从那里访问它。
请注意,这将显着降低该特定变量的性能。内存中变量的访问时间大约是毫秒级,而对于第1级或2级级别的缓存变量,它大约是十分之几纳秒,所以只有在考虑了所有其他选项时才使用它们。