lkl0305

volatile引发的错误

0
阅读(1026)

很多事情都是这样的,平时都知道是怎么回事,但真正遇到问题就看的不那么真切了!

就比如说最近遇到的volatile的问题,拿来记录一下。

volatile的作用非常简单,作为指令关键字,确保本条指令不会因编译器的优化而省略。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

那么volatile一般用在什么地方呢?举几个简单的场景吧:(1)芯片端口数据(通常用寄存器表示)(2)中断服务子程序中会访问到的非自动变量(3)被几个任务共享的变量等等。

这次的问题就是在第一个场景出错了!本来使用STC15单片机扩展三总线连接CAN总线控制器SJA1000,将SJA1000的内部寄存器作为片外RAM使用,使用指针型变量指向外部这个地址时忘记加volatile修饰符了,结果有很多寄存器的数据能够正确获取,但有一些始终读不到正确的数据,开始以为是程序有问题,看了半天也没有看出端倪,又开始怀疑硬件,结果也没有问题,折腾了许久,后来突然灵光一闪,感觉是volatile的问题,试了一下,果然!

QQ截图20170320235110.png