打印
[开发工具]

代码中类型修饰符 volatile 的作用

[复制链接]
372|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maqianqu|  楼主 | 2024-2-29 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
没有用volatile关键字声明的变量在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快)。
然而在 串口中断里 Uart2_Get_Data 的值可能被“以外修改”而CPU寄存器的值没变所以出问题了。volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:中断、system、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

按理说凡是在中断里等频繁更新而外部频繁调用的值都应当用volatile进行修饰 .

使用特权

评论回复
沙发
heisexingqisi| | 2024-2-29 21:27 | 只看该作者
还没主动用过这个关键字。

使用特权

评论回复
板凳
Henryko| | 2024-2-29 21:30 | 只看该作者
这个也得看编译器吧

使用特权

评论回复
地板
yangjiaxu| | 2024-2-29 21:39 | 只看该作者
这个一般就C语言中会用到这个语句,不过确实挺好用的

使用特权

评论回复
5
结合国际经验| | 2024-8-31 20:21 | 只看该作者
ST有IPM模块吗?

使用特权

评论回复
6
发给她更好fh| | 2024-8-31 21:16 | 只看该作者
在嵌入式编程中,特别是在处理硬件寄存器和中断时,volatile 关键字非常重要

使用特权

评论回复
7
发给她更好fh| | 2024-8-31 21:16 | 只看该作者
编译器在优化过程中可能会将变量值缓存到寄存器中,以减少对内存的访问次数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

2454

帖子

2

粉丝