飞卡日常进度之volatile的学习

举报
ReCclay 发表于 2022/02/22 01:57:40 2022/02/22
【摘要】 volatile 英[ˈvɒlətaɪl] 本意是易变的。在C语言中是一种类型修饰符。 寄存器的读/写速度是远大于内存单位的读写的,编译器一般会选择把数据放在寄存器中二减少对内存单位的读写,从而可能读取...

volatile 英[ˈvɒlətaɪl] 本意是易变的。在C语言中是一种类型修饰符。

寄存器的读/写速度是远大于内存单位的读写的,编译器一般会选择把数据放在寄存器中二减少对内存单位的读写,从而可能读取到脏数据,即错误数据。

volatile 本质来说就是为了防止编译器对代码进行优化而没有执行指令或者执行有误!


单纯这样说,可能还是不够直观,举个例子,比如说我们常用到的IO口模拟单片机时序,来看一下下面的伪代码:

/*volatile*/ int *pPTA0_OUT = 0x400FF000u;

*pPTA0_OUT = 1;
*pPTA0_OUT = 0;
  
 

看第一句,如果不加volatile修饰的时候,编译器会认为两次对地址0x400FF000u进行写操作,而两次写入之间没有读取该地址的数据,认为第一次写入是无效的,故而忽略第一次的写入指令!

对于时序,这样的忽略也许就是致命的。

所以这种时候就很有必要加入volatile关键字了!

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/79525657

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。