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

    浏览量

    12954
收藏 人收藏

    评论

    相关推荐

    c语言中 volatile _Bool 关键字说明

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

    【原创分享】单片机编程关键字volatile

    *volatilep1;对于这个关键字不仅C语言有,其他语言比如C++,JAVA其实都有。其他语言
    发表于 06-29 11:17

    c语言volatile关键字在单片机中有什么作用

    c语言volatile关键字在单片机中的作用volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由
    发表于 07-15 07:36

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

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

    volatile关键字应用场景及示例

    volatile关键字1.应用场景2.示例1.应用场景volatile关键字分析,往往应用在三种场合1)多线程编程共享全局变量的时候,该全局变量要加上
    发表于 08-24 07:21

    Volatile关键字对于嵌入式开发有什么作用呢

    前言在进行嵌入式开发中,我们往往会看到一个名为volatile或者__IO的关键字,那么,它们对于嵌入式开发有什么作用呢?浅析volatile数据类型实际上,__IO和volatile
    发表于 11-05 09:20

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

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

    嵌入式程序员常见的const、static、volatile关键字

    嵌入式程序员const、static、volatile三个关键字的朴素认识摘要:在C语言程序编写中,const、static关键字是比较熟悉
    发表于 12-21 06:08

    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 3181次阅读

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

    volatile06. 附录01. volatile概述volatile是C语言中的一个关键字。将变量定义为
    发表于 10-21 10:21 6次下载
    【嵌入式】C<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.C语言中
    发表于 01-14 10:40 18次下载
    HAL库STM32串口DMA不定长收发,空闲中断

    C语言中volatile是什么

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