OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6453|回复: 7

volatile 问题

[复制链接]

15

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2014-2-23
在线时间
0 小时
发表于 2014-4-15 21:37:35 | 显示全部楼层 |阅读模式
原子哥的例程里有些地方 使用了  __IO uint16_t  类型的变量,我搞了很久一直不明白  定义类型前面加 volatile  和不加volatile  的区别,我在例程里把 volatile  去掉 也没发现问题,这是为什么???
只要努力,一切皆有可能。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-4-15 21:44:43 | 显示全部楼层
回复【楼主位】xuhaibin:
---------------------------------
这个东西很神奇    据说是避免编译器优化代码 导致错误的   具体怎么用我也不是很清楚
回复 支持 反对

使用道具 举报

2

主题

1443

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2233
金钱
2233
注册时间
2010-12-16
在线时间
197 小时
发表于 2014-4-15 22:05:18 | 显示全部楼层
指示变量是可挥发的.

如果变量可能被外部修改,使用volatile关键字可以让编译器在每次访问都从源读取数据,并且回写到源,而不是缓存区.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2014-4-15 22:13:54 | 显示全部楼层
芯片内部寄存器都是volatile的  程序共享的变量用这个吧
努力努力
回复 支持 反对

使用道具 举报

6

主题

19

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-9-10
在线时间
0 小时
发表于 2014-4-15 22:15:34 | 显示全部楼层
我也查过关于volatile的解释,才开始不太容易理解,我觉得只要注意需要用volatile修饰的变量类型就可以了。
实在不太确定是不是要volatile修饰的时候,我就加上这个关键字,这样编译器不会优化,就不会出问题。
回复 支持 反对

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2014-4-15 23:00:02 | 显示全部楼层
当主程序访问某个变量频率很高时,编译器就会优化映射一个寄存器(新地址)去提高访问速度,而变量在中断里有对变量操作时,那么没有定义V变量就可能出现中断里改变了值,而MAIN函数里的值(原因是中断里操作的是实际地址,MAIN访问的是新映射的地址)不变的现象。当定义出V时MAIN函数访问变量时始终要到初始地址更新数据在执行。前后台系统公共操作同一个变量就很容易出现问题了。
让我们的思维驾驭在电的速度之上!
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2014-4-15 23:27:52 | 显示全部楼层
不加就不会每次都去查这个寄存器的值。加了说明是易变的,每次用这个值都要去寄存器查一次。
一直努力就很好。
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-4-17 10:53:20 | 显示全部楼层
对于 寄存器变量、 外设变量、多个任务共享的外部变量等 , 
如果不加 当然可能不会导致问题, 不过出了问题 你就哭去吧。
因为那时候你根本不知道为什么, 编译没错,逻辑没错……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表