在IAR中,是不是所有的外部变量都要用volatile来限定?

[复制链接]
7267|5
 楼主| areshan 发表于 2010-6-10 13:54 | 显示全部楼层 |阅读模式
我在用IAR的时候,怎么有这样奇怪的事情?
volatile static uchar power; //定义一个外部变量
当时在中断函数里,加入这样的式子power=power+sum,怎么提示警告Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
但是把开头的volatile去掉才没有警告了。。。。volatile的作用就是不让编译器别把它定义的变量给优化掉了吗。。。。。。
还有就是用volatile static uchar power 这样定义变量就算后面没有用到,也不会提示。而没有用volatile的外部变量,没有用到就要提示警告了......该怎样理解呢???
ShakaLeo 发表于 2010-6-10 15:12 | 显示全部楼层
power和sum这两个变量都是volatile的吧,volatile字面意思是“易失,易挥发”的意思,加了这个修饰的变量,编译器在每次使用它的时候都要从该变量的内存地址取出变量值,而不能使用暂存在寄存器中的值。如果power和sum都是volatile型的,编译器在做power+sum运算的时候就不能绝对地不使用寄存器中的值,取变量值肯定会有先有后,然后再相加。而这个取变量的先后顺序是未定义的,所以出现了那个警告。
zkkov2000 发表于 2010-6-12 15:06 | 显示全部楼层
最好全都加上volatile
machunshui 发表于 2010-6-12 16:56 | 显示全部楼层
对非操作系统的裸奔来说,
被中断函数和普通函数共同用到的全局变量需要加,
其他不需要
ayb_ice 发表于 2010-6-12 17:14 | 显示全部楼层
没有这回事,
建议中断中使用的全局变量加
zkkov2000 发表于 2010-6-14 13:34 | 显示全部楼层
中断里的变量加,拿不准的也加,放心
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部