0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中volatile关键字的使用

电子工程师 2018-03-17 11:55 次阅读

volatile的意思是易变的、可变的,作用是限制编译器优化某些变量。首先看一段C51程序:

Keil在优化级别是为8时得到如下汇编代码(部分未列出):

可以看到,变量d的值赋给x,y,z时,只有x中是直接读取的d中数值,而y=d,z=d则直接将寄存器中的数值赋给y,z。若在此过程中,变量d的值被改变(比如d是一个硬件寄存器),则y,z变量中得到的数据将是错误的,因此在某些应用中程序存在隐患。

这类问题并不是编译器的问题。由于访问内部寄存器比访问RAM速度块,因此编译器在编译类似程序时,会对程序进行优化,除第一次编译变量所在在连续读取一个变量时,编译器为了简化程序,只要有可能就会把第一次读取的值放在ACC或Rx中,在以后的读取该变量的值时就直接使用第一次的读取值。如果该变量的值在此过程中已经被外设(如读取外部设备端口时经常将外设端口看作一外部RAM地址)或其他程序(如中断服务程序)所改变,可能就会出错。为了解决这类问题,常用的方法就是降低编译器的优化级别或者使用volatile关键字。显然降低优化级别不是所期望的,因此用volatile关键字修饰相关变量很有必要。

上文中的例子将d加上volatile关键字后,如下:

重新编译得到的代码(部分未列出)如下:

可以看这此y,z变量的值是从d的存储区中读取的。这主要是由编译器的优化早成的,而不是编译器的错误。用volatile变量对变量d修饰后,编译器不对这个变量的操作进行优化,代码的执行达到期望的目的。

一般说来,volatile关键字用在如下的几个地方。

(1)中断服务程序中修改的供其他程序检测的变量需要加volatile。

(2)多任务环境下各任务间共享的标志应该加volatile。

(3)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • volatile
    +关注

    关注

    0

    文章

    44

    浏览量

    13007
收藏 人收藏

    评论

    相关推荐

    教科书不会讲的C语言关键字volatile用法

    许多程序员都无法正确理解C语言关键字 volatile,这并不奇怪。因为大多数C语言书籍通常都是
    发表于 02-02 10:14 476次阅读

    C语言关键字volatile的用法

    许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一
    发表于 04-11 09:35 2575次阅读

    c语言中 volatile _Bool 关键字说明

    volatile 关键字呢?volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码
    发表于 01-06 10:46

    C语言volatile关键字详解 精选资料分享

    1.volatile和什么有关百度翻译是这样子翻译volatile的:图1-1 百度翻译volatile截图volatile属于C
    发表于 07-22 07:20

    C语言volatile关键字之间有什么关系?

    C语言volatile关键字之间有什么关系?
    发表于 11-11 07:01

    C语言中关键字static的作用是什么

    C语言中关键字static的作用是什么?用预处理指令#define 声明一个函数,输入天数得到有多少秒?
    发表于 12-24 06:53

    STM32CubeMX的相关资料分享

    链接5中的代码)1.C语言中volatile关键字的学习2.【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)3.
    发表于 01-14 07:10

    c语言中volatile关键字作用

    一个定义为volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读
    发表于 06-22 17:04 46次下载

    C语言中volatile关键字

    volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。
    发表于 05-27 09:32 3264次阅读

    单片机C语言中常用到的关键字及数据类型

    单片机C语言中常用到的关键字及数据类型。
    发表于 11-03 10:57 13次下载

    【嵌入式】C语言中volatile关键字

    volatile06. 附录01. volatile概述volatileC语言中的一个关键字
    发表于 10-21 10:21 6次下载
    【嵌入式】<b class='flag-5'>C</b><b class='flag-5'>语言中</b><b class='flag-5'>volatile</b><b class='flag-5'>关键字</b>

    HAL库STM32串口DMA不定长收发,空闲中断

    参考了链接5中的代码)1.C语言中volatile关键字的学习2.【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)3.
    发表于 01-14 10:40 19次下载
    HAL库STM32串口DMA不定长收发,空闲中断

    C语言中volatile是什么

    C语言时有一个奇怪的关键字volatile,这到底有什么用呢?
    的头像 发表于 02-17 14:29 1198次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>volatile</b>是什么

    浅析C语言中的regiseter关键字

    C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。
    的头像 发表于 08-25 17:10 1083次阅读
    浅析<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的regiseter<b class='flag-5'>关键字</b>

    快速掌握C语言关键字

    C语言中的32个关键字你知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句关键字
    的头像 发表于 07-06 08:04 299次阅读
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键字</b>