历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2018年03月06日 | C语言中volatile关键字的使用

2018-03-06 来源:eefocus

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

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关键字后,如下:

volatile关键字

volatile关键字

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

代码

  可以看这此y,z变量的值是从d的存储区中读取的。这主要是由编译器的优化早成的,而不是编译器的错误。用volatile变量对变量d修饰后,编译器不对这个变量的操作进行优化,代码的执行达到期望的目的。
  
  一般说来,volatile关键字用在如下的几个地方。
  
  (1)中断服务程序中修改的供其他程序检测的变量需要加volatile。
  
  (2)多任务环境下各任务间共享的标志应该加volatile。
  
  (3)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。


推荐阅读

史海拾趣

EUCHNER公司的发展小趣事

随着全球化的发展,EUCHNER公司开始实施国际化战略,加强在全球市场的布局。公司在世界各地设立了多个分销处和办事处,以便更好地满足不同国家和地区的市场需求。同时,公司还积极与国际知名企业建立合作关系,共同推动工业自动化领域的进步。通过国际化战略和全球布局,EUCHNER公司的品牌影响力得到了进一步提升。

爱特姆(ATOM)公司的发展小趣事

随着电子行业的快速发展,爱特姆不断加大对技术研发的投入,致力于推出更先进、更稳定的连接器产品。公司成功研发出一系列具有自主知识产权的新产品,不仅提升了产品的性能和质量,也进一步巩固了其在行业内的领先地位。

Gang Song Electronics Co Ltd公司的发展小趣事

随着物联网市场的快速发展,Telit作为全球领先的物联网模组和平台提供商,开始寻求通过并购来增强自身在低功耗WiFi技术领域的实力。2017年,Telit宣布收购GainSpan,这一举措不仅丰富了Telit的无线模组产品线,还进一步巩固了其在物联网市场的领先地位。GainSpan的技术与Telit的平台和服务相结合,为客户提供了更加全面的物联网解决方案。

e2v technologies公司的发展小趣事

随着电子行业的快速发展,e2v不断拓展其产品线,以满足市场的多样化需求。除了传统的图像传感器产品外,公司还开发了示波器数据转换器、高性能图像处理器等,广泛应用于科学、医学、工业、汽车和电信等领域。这些产品的推出,不仅拓展了e2v的市场空间,也为其带来了可观的经济效益。

B.B. Battery公司的发展小趣事

B.B. Battery公司成立之初,面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人凭借对电池行业的深刻理解和敏锐的市场洞察力,带领团队不断探索和积累。他们深入调研市场需求,研发出适应市场需求的电池产品,并通过优化生产流程、降低成本等方式,逐步在市场上获得了一席之地。

广东华裕(GDHY)公司的发展小趣事

随着科技的不断发展,电池行业也在经历着深刻的变革。B.B. Battery公司紧跟时代步伐,不断加大技术创新力度。他们引进先进的生产设备和技术,研发出更高效、更环保的电池产品。同时,公司还注重与高校、科研机构的合作,共同推动电池技术的创新与发展。这些努力使得B.B. Battery公司的产品在市场上具有更强的竞争力。

问答坊 | AI 解惑

紧急求教!如何进行信号分析

我是在一家有线电视机顶盒公司实习,公司给了一个毕业设计论题,是做IC卡与读卡器之间信号情况的反应(开始接受?故 障?开始复位应答?之类)显示在数码管上面。 个人理解是类似于饭堂打卡时候的显示。 不知道各位前辈无什么资料,或者可以给一 ...…

查看全部问答>

【诚聘】汇编开发兼职人员

【诚聘】汇编开发兼职人员 本公司常年为国内知名计算机图书出版社策划图书。现有汇编语言图书需要编写,现邀汇编语言开发人员参与图书写作。有兴趣者,请将姓名和联系方式(如QQ、MSN或者联系电话)发到本人邮箱gamelua@sina.com。谢谢合作。…

查看全部问答>

请高手点拨一下3-Wire Timing Diagram和3-Wire Control Registers List如何理解?

以下是LCD里的图表,有人说这个和LCD的初始化有关,看不懂,请高手指点一下。 …

查看全部问答>

hart协议实现

谁实现过hart协议啊,交流一下。…

查看全部问答>

关于射频测距的理想设计

1,射频 属于无线电 频率很高的无线电波   传输 传输速度快 为光速 目前 手机已经3G 还有普遍的 2.4赫兹 技术 2    目前已有射频识别技术 如身份证内被动识别芯片 3    多无线电信号之间会不会互相影响 ...…

查看全部问答>

STM32封装的问题

LQFP48封装:数据手册上说是7 × 7mm…

查看全部问答>

launchpad欢乐学习季

MSP挑战级(高级)通过了,呵呵,期待中。。。 …

查看全部问答>

YUV422信号输入DM814X后图像颜色不正常

使用DM814x 平台,从camera interface 端口输入BT1120,16bit ,YUV422的信号,图像颜色非常不正常,感觉上是黑的变绿了,白的地方变成紫色了,我相信应该是ISS的部分配置错误,也看到论坛上有人也在DM36X的平台上做同样的事情也碰到这样的现象,我 ...…

查看全部问答>

msp430f149使用TFT液晶屏自带字库

不晓得如何调用液晶屏自带字库,求帮助,液晶屏用的是FY43-4827-65K…

查看全部问答>