volatile变量说明
arm吧
全部回复
仅看楼主
level 5
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样, 编译器 就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
volatile修饰符的主要目的是提示编译器该对象可能在编译器未监测到的情况下被改变,因此不要对引用这些对象的代码做优化处理。
关键点:
1、在编译器监测范围之外被改变。2、对引用这些对象的代码不做优化处理。
实现方法:
每次要获取该变量的值时都从内存中获取而不直接读取存储该变量的寄存器。
会发生的情况举例:
主要是中断等情况,如一个被系统始终更新的变量。中断函数中会改变值的变量。这些情况编译器监测不到,因为编译器无法推知什么时候发生中断。 转载自;硅谷芯微技术论坛
2012年04月03日 12点04分 1
level 5

实例演示volatile作用
上面这段程序是串口发送的代码,从串口发送字符'A',然后等待发送完毕。
不过,由于在定义UTRSTAT0时,没有加volatile,因此有时会造成死循环。通过分析反汇编代码如下:
从以上代码可知,读取UTRSTAT0寄存器的数据之后,放到R0暂存,然后判断第2位是否为0,如果为0则继续跳转到上一条语句对R0进行判断。因此为造成死循环。
正确的翻译,应该是循环读取UTRSTAT0的数据,然后进行判断,而不是读一次,保存到R0,然后循环对R0进行判断!!
修改方法,就是加上volatile,让编译器知道应该每次都去读一次数据,而不是使用暂存的数据,修改如下:
反汇编代码如下:
可以看到,其他代码没变,仅仅在UTRSTAT0定义时,加了volatile,问题就解决了。
2012年04月03日 12点04分 2
level 13
arm声明那里这个用得很多。不太理解,以前就把它当成是单片机的sfr来理解。呵呵。好文章![大笑]
2012年07月22日 04点07分 3
level 10
arm声明那里这个用得很多。不太理解,以前就把它当成是单片机的sfr来理解。呵呵。好文章!
2013年10月16日 20点10分 4
1