C语言中volatile关键字的作用,c语言volatile
在C语言中,还有一个不常用但非常有用的关键字volatile。那么你能用volatile关键字做什么呢?接下来我就来讨论这个问题。
用volatile关键字定义的变量实际上告诉编译器该变量可能会被意外更改。然后在编译的时候,编译器不会假设这个变量的值,而是优化代码。具体来说,编译器编译代码时,优化器每次遇到这个变量,都会在内存中重新读取,而不是使用寄存器中存储的备份来优化代码。
我们已经学习了volatile关键字的基本功能。那么,在什么情况下使用volatile关键字呢?一般来说,volatile关键字通常用于以下情况:
在中断服务程序中为被其他程序检测而修改的变量通常需要被定义为volatile;在多任务环境中,任务间共享的logo通常需要定义为volatile。内存的映射硬件寄存器通常需要定义为volatile,因为每次读取或写入都可能有不同的含义。(1)使用中断来改变对象值。
我们在中断服务程序中操作了一个对象,比如谁改变了一个变量的值。在其他程序中,我们想通过改变这个变量来做一些操作。这个时候,无论我们是否使用volatile关键字,都可能得到完全不同的结果。
如果我们将变量定义为:static int var=0;然后在中断服务成勋中将其修改为:var=1,但在另一个函数中使用而不修改,那么编译器会认为它没有改变,直接使用寄存器中的副本。
如果我们将变量定义为:volatile int var=0;那么结果就完全不一样了。每次在函数中使用var变量时,都会在不使用寄存器中副本的情况下重新读取。
(2)多任务共享标志
多任务共享的时候,其实也是一样的。一个对象在一个任务中被修改后,应用到另一个对象中,但是编译器没有发现它在这个任务中被修改过。因为访问寄存器的速度比RAM快,所以编译器通常会进行优化,减少对外部RAM的访问。因此不能响应另一个任务下的变化。
在这种情况下,我们通常需要使用volatile关键字来定义共享任务的身份。
(3)硬件寄存器的存储器映射
内存映射的情况有很多,比如我们把外设的寄存器映射到内存的某个区域;例如,我们使用DMA将数据直接写入内存中的某个区域。
因为我们的外部数据是直接进入内存区的,而程序知识指的是它的值。优化时,编译器可以直接使用寄存器中的副本。显然,这不是我们需要的结果。这个时候,把这个内存对应的变量声明为volatile,就可以保证我们的需求。
综上所述,我们已经解释了volatile关键字的一般用法。当然,我们也可以发现,volatile关键字虽然可以减少编译器的优化,但是可以保证程序的正确性,所以在适当的地方使用volatile关键字是很有必要的。但是,能不能用好,还是要看程序员的基本功。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。