5611|10

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于 volatile [复制链接]

一个变量声明成volatile和不声明有什么差别吗?
另外: 在ADS1.2下面: 做 if( (vari & const) == const)判断的时候,明明条件都已经成立了,但就是不执行后面的语句,为什么!
各位大侠来讲讲!

最新回复

3.13 volatile 限定修饰符 当一个对象的值可能会在编译器的控制或监测之外被改变时例如一个被系统时钟更新 的变量那么该对象应该声明成volatile 因此编译器执行的某些例行优化行为不能应用在 已指定为volatile 的对象上 volatile 限定修饰符的用法同const 非常相似――都是作为类型的附加修饰符例如 volatile int display_register; volatile Task *curr_task; volatile int ixa[ max_size ]; volatile Screen bitmap_buf; display_register 是一个int 型的volatile 对象curr_task 是一个指向volatile 的Task 类对 象的指针ixa 是一个volatile 的整型数组数组的每个元素都被认为是volatile 的bitmap_buf 是一个volatile 的Screen 类对象它的每个数据成员都被视为volatile 的 volatile 修饰符的主要目的是提示编译器该对象的值可能在编译器未监测到的情况下被 改变因此编译器不能武断地对引用这些对象的代码作优化处理 这是网上搜到的.  详情 回复 发表于 2005-4-11 16:08
 
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
几位斑竹都来说说.以前在KEIL下面这样用一直都很好的.
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个在ARM中是非常有用的,声明这样的变量要易挥发的类型,如果不声明成这样的变量,编译器先把这个变量读到寄存器中,然后对这个寄存器操作,假如你的中断程序改了这个变量的值,而你在主程序中要判断这个值,在根据这个值来进行操作,这时你的变量值虽然修改了,而寄存器中的值还不变,造成这个动作一直不响应,如果设置成volatile,编译器不会把这个变量值取到寄存器中,而是一直读这个变量,这样就不会出现上面的问题。如果我说的还不明白你可以到C51BBS上看看龙斑竹的发言。说的很清楚。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
呵呵,说来也怪,在430里就一直没有用过这个voltle类型,也一直没有问题,自从学了ARM后我现在定义430的全局变量也用voltile类型了?呵呵,兄弟你的项目好大啊!羡慕!?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
你说的第二个问题我没有遇到过啊!不是很清楚,我遇到的最大问题就是程序已经编译完了!没有错误和警告,可是一下到ARM中运行就跳到未定义模式或程序终止模式,吗的,不止到怎么处理了!(可能是用c语言的问题,造成地址不对齐了,可这也不是我的问题,应该是ADS编译器的问题啊!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,长见识了.ARM四字节对齐的问题好象只在定义结构的时候有影响,一般可以不去管它.
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
ADS编译器问题多多,要学好ARM真不容易啊!
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用:

ADS编译器问题多多,要学好ARM真不容易啊!
同感!资料也不全。感觉也不是很规范,主要是功能太大了。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
呵呵!难得又凑到一块了。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
有做热式流量计的吗?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
3.13 volatile 限定修饰符
当一个对象的值可能会在编译器的控制或监测之外被改变时例如一个被系统时钟更新
的变量那么该对象应该声明成volatile 因此编译器执行的某些例行优化行为不能应用在
已指定为volatile 的对象上
volatile 限定修饰符的用法同const 非常相似――都是作为类型的附加修饰符例如
volatile int display_register;
volatile Task *curr_task;
volatile int ixa[ max_size ];
volatile Screen bitmap_buf;
display_register 是一个int 型的volatile 对象curr_task 是一个指向volatile 的Task 类对
象的指针ixa 是一个volatile 的整型数组数组的每个元素都被认为是volatile 的bitmap_buf
是一个volatile 的Screen 类对象它的每个数据成员都被视为volatile 的
volatile 修饰符的主要目的是提示编译器该对象的值可能在编译器未监测到的情况下被
改变因此编译器不能武断地对引用这些对象的代码作优化处理
这是网上搜到的.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表