C语言中volatile关键字的作用,c语言volatile

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: