我应该在哪里使用“易失性”? [重复]

问题描述 投票:0回答:6

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

是当内存(变量)正在更新而进程没有意识到的时候吗?

在什么情况下驱动程序应该使用“易失性”变量?

c operating-system linux-device-driver volatile
6个回答
13
投票

我的世界中最常见的情况是当您对使用内存映射 I/O 的微控制器进行编程时。 寄存器中的值可能会因外部数字输入而改变,但如果您不将变量声明为

volatile
,编译器可能会完全优化代码,您会想知道为什么没有任何效果。

Matt 建议我对有关代码“优化”的声明进行修饰。 内存映射 I/O 在代码中通过指针进行访问。 当您想要检查按钮的状态时,通常会将寄存器的值与按钮的位掩码按位与。 如果您不指定 volatile,编译器会说:“嘿,您的代码实际上从未更改该指针的值,因此我将删除您已对其进行按位与运算的语句,因为该值始终是一样!”。

希望这能让我的陈述更清楚一些。 谢谢你的建议,马特。


5
投票

由于您已使用

linux-device-driver
标签对其进行了标记,因此可能需要一些在 Linux 内核中进行编码的具体建议。

一般来说,您不需要在 Linux 内核代码中编写

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


4
投票

除了其他人所说的之外,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

为了防止这种情况,我们必须在 TIME 中使用 volatile 关键字。


0
投票

这可能对你有帮助

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


-1
投票

易失变量是可以在程序不知道的情况下随时更改的变量。

我想不出 volatile 关键字在日常编程中有何用途,但它可能会出现。


-3
投票

据我所知,在 C 中,当对来自多个源(进程)的变量执行并发非同步操作时,应使用

volatile
关键字。如果变量被声明为
volatile
,那么所有进程将始终直接从其内存位置访问该变量,而不是在微处理器的缓存中复制该变量并从那里访问它。
请注意,这将显着“降低该特定变量的性能”。内存中变量的访问时间约为毫秒,而对于一级或二级缓存变量,其访问时间约为十分之一纳秒,因此仅在考虑了所有其他选项后才使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.