一个变量声明成volatile和不声明有什么差别吗?
另外: 在ADS1.2下面: 做 if( (vari & const) == const)判断的时候,明明条件都已经成立了,但就是不执行后面的语句,为什么!
各位大侠来讲讲!
几位斑竹都来说说.以前在KEIL下面这样用一直都很好的.
这个在ARM中是非常有用的,声明这样的变量要易挥发的类型,如果不声明成这样的变量,编译器先把这个变量读到寄存器中,然后对这个寄存器操作,假如你的中断程序改了这个变量的值,而你在主程序中要判断这个值,在根据这个值来进行操作,这时你的变量值虽然修改了,而寄存器中的值还不变,造成这个动作一直不响应,如果设置成volatile,编译器不会把这个变量值取到寄存器中,而是一直读这个变量,这样就不会出现上面的问题。如果我说的还不明白你可以到C51BBS上看看龙斑竹的发言。说的很清楚。
呵呵,说来也怪,在430里就一直没有用过这个voltle类型,也一直没有问题,自从学了ARM后我现在定义430的全局变量也用voltile类型了?呵呵,兄弟你的项目好大啊!羡慕!?
你说的第二个问题我没有遇到过啊!不是很清楚,我遇到的最大问题就是程序已经编译完了!没有错误和警告,可是一下到ARM中运行就跳到未定义模式或程序终止模式,吗的,不止到怎么处理了!(可能是用c语言的问题,造成地址不对齐了,可这也不是我的问题,应该是ADS编译器的问题啊!
呵呵,长见识了.ARM四字节对齐的问题好象只在定义结构的时候有影响,一般可以不去管它.
同感!资料也不全。感觉也不是很规范,主要是功能太大了。
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 修饰符的主要目的是提示编译器该对象的值可能在编译器未监测到的情况下被
改变因此编译器不能武断地对引用这些对象的代码作优化处理
这是网上搜到的.