专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

教科书没有讲的C语言volatile用法

  许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句一带而过,本文将告诉你如何正确使用它。
  在CC嵌入式代码中,你是否经历过以下情况:代码执行正常直到你打开了编译器优化代码执行正常直到打开了中断古怪的硬件驱动RTOS的任务独立运行正常直到生成了其他任务
  如果你的回答是yes,很有可能你没有使用C语言关键字volatile。你并不是唯一的,很多程序员都不能正确使用volatile。不幸的是,大多数c语言书籍对volatile的藐视,只是简单地一带而过。
  volatile用于声明变量时的使用的限定符。它告诉编译器该变量值可能随时发生变化,且这种变化并不是代码引起的。给编译器这个暗示是很重要的。在开始前,我们向来看一看volatile的语法。
  C语言关键字volatile语法
  声明一个变量为volatile,可以在数据类型之前或之后加上关键字volatile。下面的语句,把foo声明一个volatile的整型。volatileintfoo;intvolatilefoo;
  把指针指向的变量声明为volatile很常见,尤其是IO寄存器的地址映射。下面的语句,把pReg声明为一个指向8bit无符号指针,指针指向的内容为volatile。volatileuint8tpReg;uint8tvolatilepReg;
  volatile的指针指向非volatile的变量很少见(我只使用过一次),但我还是给出相应的语法。intvolatilep;
  顺便提一下,关于为什么要在数据类型前使用volatile关键字,请自行百度搜素。
  最后,如果你再struct或者union前使用volatile关键字,表明struct或者union的所有内容都是volatile。如果这不是你的本意,可以在struct或者union成员上使用volatile关键字。
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
  正确使用C语言关键字volatile
  只要变量可能被意外的修改,就需要把该变量声明为volatile。在实际应用中,只有三种类型数据可能被修改:外设寄存器地址映射在中断服务程序中修改全局变量在多线程、多任务应用中,全局变量被多个任务读写
  接下来,我们将分别讨论上述三种情况。
  外设寄存器
  嵌入式系统包含真正的硬件,通常会有复杂的外设。这些外设寄存器的值可能被异步的修改。举个简单的例子,我们要把一个8bit状态寄存器的地址映射到0x1234。在程序中循环查看该状态寄存器的值是否变为非0。C语言操作寄存器的手法,可以参考这篇文章:C语言操作寄存器的常见手法。
  下面是最容易想到,但错误的实现方法:
  当你打开编译器优化时,程序总是执行失败。因为编译器会生成下面的汇编代码:
  程序被优化的原因很简单,既然已经把变量的值读入累加器,就没有必要重新一遍,编译器认为值是不会变化的。就这样,在第三行,程序进入了无限死循环。为了告诉编译器我们的真正意图,我们需要修改函数的声明:
  编译器生成的汇编代码:
  像这样,我们得到了正确的动作。
  中断服务程序
  在中断服务程序中,经常会修改一些全局变量值,来作为主程序中的判断条件。例如,在串口中断服务程序中,可能会检测是否接收到了ETX(假如是消息的结束标识符)字符。如果接收到了ETX,ISR设置一个全局标志位。
  错误的做法:
  在关闭编译器优化的情况下,程序可能执行正常。然而,任何像样点而优化都会break这段程序。问题是编译器并不知道etxrcvd可能被ISR中被修改。编译器只知道,表达式!extrcvd始终为真,你讲用于无法退出循环。结果,循环后面的代码可能被编译器优化掉。
  幸运的话,你的编译器可能会发出警告;不幸的话,(或者你不认真的查看编译器警告),你的程序无法正常执行。当然,你可以责怪编译器执行了糟糕的优化。
  解决方式是,将变量etxrcvd声明为volatile,所有问题(当然,也可能是部分问题)就消失了。
  多线程应用
  在实时系统中,尽管有想queues,pipes等这些同步机制,使用全局变量实现两个任务共享信息的做法依然很常见。即使在你的程序中加入了抢占式调度器,你的编译器依然无法知道什么是上下文切换,或何时发生上下文切换。因此从概念上讲,多任务修改全局变量的的做法与中断服务程序中修改全局变量的做法是相同的。
  因此,所有这类全局变量都应该声明为volatile。
  例如下面的程序:
  当打开编译器优化时,这段程序可能执行失败。解决方法是将cntr声明为volatile。
  总结
  一些编译器允许你把所有的变量隐式的声明为volatile。请抵制这种诱惑,因为它会令你不再思考,当然也会导致生成低效的代码。
  另外,也不要责怪优化器或直接把它关掉。现代的优化器已经足够优秀,我已经记不清上次遇到优化bug是什么时候了。相反,我常常看到程序员们错误的使用volatile。
  如果你被要求去修改一个很古怪的代码,请在程序中查找一下volatile关键字;如果你什么也没有找到,上面讨论的例子可以向你提供一些解决问题的思路。
  原文链接:https:mp。weixin。qq。coms524Vb6r8Ayt21JAH164jsw
  转载自:STM32嵌入式开发
  原文链接:教科书没有讲的C语言volatile用法
  本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

如果清朝12位皇帝齐聚,皇太极最想骂谁?清朝(16361912)是中国历史上最后一个封建王朝,共传十二帝,从努尔哈赤建立后金,到皇太极改国号为清,一直到宣统溥仪,每一位皇帝都流传有许多传奇故事,以及足以影响后世发展的政績11岁女嫁28岁已婚男,原配提剑冲来,她的命运究竟会怎样1588年,努尔哈赤将十一岁的女儿东果格格,嫁给28岁的何和礼。当晚城内张灯结彩,热闹非凡,努尔哈赤看着只比自己小两岁的女婿,笑逐颜开,好像丈母娘看女婿,越看越欢喜。努尔哈赤为什么五十年前萧山知青往事农家昏黄的15瓦灯泡下如今的家庭,身处城市或乡村,只要你有一套自有房产,谁家没有20盏以上的灯具,如今富裕的萧山农家,有的家庭别墅或楼房装修考究,甚至有几十盏几百盏的各色灯具,金碧辉煌。走进百姓家,厅堂贵州省盘州市深山里的三线厂,代号671,现已打造成主题文化公园上世纪60年代中期在好人好马上三线备荒备战为人民,深挖洞广积粮不称霸的口号下,成千上万的热血青年背井离乡远离都市,来到山穷僻壤,条件及苦的大西南,进行一场轰轰烈烈的三线建设。90年明朝的正式国号是明还是大明?明朝是中国历史上的朝代,由明太祖朱元璋建立,初期建都南京,明成祖时期迁都北京,传十六帝,共计276年,不过它的国号却有争议,有人说是大明,有人说是明。那么,明朝的正式国号是明还是大西西里战争希腊公元前264年西西里战争,又称希腊布匿战争,指的是前600年至前264年之间古迦太基与古希腊围绕西西里岛霸权展开的争夺战。这场战争由古希腊城邦之一的叙拉古发起,是古代战争史上持续时间最长的战争。郑成功39岁病死,为何临终前下令杀死自己的妻子长子和孙子?郑成功39岁病死,为何临终前下令杀死自己的妻子长子和孙子?叱咤风云镇海涛,指挥若定阵云高。虫沙猿鹤有时尽,正气觥觥不可淘。这是民国时期北京大学校长蔡元培写的一首绝句,意在赞美民族英杜月笙三岁那年,亲妹妹被他人领养,杜后来找到自己妹妹了吗?杜月笙发达之后时常对人提起一件让他遗憾的事,那就是自己小时候有个妹妹被人领养走了,而杜月笙也一直在寻找自己的妹妹,甚至是不惜代价的去寻找,但是并没有找到自己的妹妹。母亲产后去世,妹一个不经意,造成中国文化浩劫,记被发配皇阿哥在新疆的荒淫生活爱新觉罗载澜,清末宗室。惇亲王爱新觉罗奕誴(道光第五子)的第三子,光绪帝堂兄,封辅国将军,晋辅国公。得罪八国联军,被流放新疆迪化(乌鲁木齐),永远监禁戊戌政变后,谭嗣同慷慨就义,维古代金国和古代的辽国位于现在的什么地方呢?大家国家有五千年的历史,在这个五千年里边,朝代一直在交替,许多领土也在不断的换名称,古代中国的辽国和金国是两宋时期大家我国北方地区的两个我国,辽国主要是契丹人创建的,这金国是女真人古人用银子消费如何找零简单来说分三步第一步称称重用的是一个叫戥子的工具,类似于现在药店用的小秤,可以精确到几钱几分。第二步鉴古代允许民间铸造银子,这就给了不法之徒可乘之机,往银子里灌铅就是常用的手段。所
史依弘我在美国演京剧霸王别姬,台下观众看哭了导读折腾,是外界对史依弘常有的印象。观众口中的史姐姐很早就摘得了戏曲界最高荣誉梅花奖,然而这并未止住她探索艺术的步伐。除了文武昆乱史依弘梅尚程荀史依弘等轰动全国的系列演出,她更是大三读风吹半夏原著你根本不知道,许半夏这一生有多野蛮文月半悦读乍一看,只觉得风吹半夏这名字挺俗的。可三读原著不得往生后才发现,剧名最终定为风吹半夏,其实很有深意。原著里面,最后一个章节就叫拥抱台风,台风来临前,所有人都远远避开,唯独主角定位古物修复绒花制作等职业都市偶像剧也追求国潮文化近日开播的都市偶像剧月里青山淡如画,开始聚焦古物修复师版画手艺人之间的爱情故事,将套路爱情故事与传统文化元素进行了结合,以吸引观众目光。为了让人物角色故事内容跳出既定套路,越来越多辽粤大战结束第二天,中国男篮洋帅相中5人,CBA官宣恢复观众入场辽粤大战结束第二天!中国男篮洋帅相中5人,姚明做出轰动决定北京时间12月15日,CBA第二阶段备受期待的辽粤大战结束的第二天,有媒体人透露消息,中国男篮主教练乔尔杰维奇相中了本场比京港爱情线播出25年,剧中演员境况不一,小配角逆袭成影帝为了庆祝香港回归,创作了多首脍炙人口的歌曲,拍摄了多部影视剧,从多个角度来讲述相关的故事。时任中国电影集团制作总监的香港导演李国立,执导了一部两岸青年的爱情电视剧京港爱情线。电视剧为什么征服里刘华强要杀瓜贩?补上这段被删剧情,理由通顺了还记得国产电视剧征服中,有一段刘华强买瓜的镜头曾备受网友热议,虽然对于网友来说,刘华强买瓜只是一个梗,但看过整部电视剧的观众们应该知道,刘华强当时根本就不是冲着买瓜去的,而是专门在陈道明,就是叔圈界的天菜,陈道明国家一级演员,颜值演技都在线的影帝视帝,每个扮相也给人一种一身正气的感觉。演技也确实好,他演的皇帝们已经深深刻入我们的心里了,无论是围城还是黑洞,以及康熙等塑造了众多经典的从爆红到销声匿迹,庞龙都经历了什么!前言有些歌星,一首歌就能吃一辈子。庞龙就是。当年那首两只蝴蝶唱遍了大街小巷,上到六七岁的老人,下到几岁的儿童,都能哼上几句。庞龙靠这首歌一夜爆红,挣得盆满钵满。从一名普通工人到炙手大宅门播出21年,8位主演今非昔比,二十年后都成老戏骨!文蘑菇花娱乐编辑蘑菇花娱乐前言说到大宅门这部电视剧,想必观众都不会感到陌生。当年播出时不说是万人空巷,也算是收视率优秀并多次重播的,并代表了一个时代的经典影视作品。如今21年过去了父母捧不红的星二代,像他们一样的星二代,你还知道有哪一些呢?第一位向佐无论是父亲向华强还是妻子郭碧婷在圈内的影响力和知名度都比他大向华强呢为了能让自己儿子出名啊可是花了不少心思出道至今他合作的演员全部都是圈内的一线演员投名状中的李连杰邹兆龙具俊晔患病实锤!大S换吻娃头像救口碑,广告牌被撤大S与汪小菲的闹剧落下帷幕,却将她与具俊晔这对恩爱夫妻推向幕前,被扒出各种黑料与丑闻,彻底沦为过街老鼠人人喊打,连引以为傲的恩爱夫妻人设,也被曝光真相,原来只是合约关系,目的是为塑
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网