C51编程volatile修饰变量

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Volatile的意思是易变的、可变的,作用是限制编译器优化某些变量。

首先看一段51程序:#include <reg52.h>
unsigned char x,y,z;
unsigned char xdata d;
void main(void)
{
x = 0xaa;
y = 0xbb;
z = 0xcc;
d = 0xdd;
while(1)
{
x = d;
y = d;
z = d;
}
}
Keil在优化级别为8时得到如下汇编代码:
main:
MOV x,#0AAH
MOV y,#0BBH
MOV z,#0CCH
MOV DPTR,#d
MOV A,#0DDH
MOVX @DPTR,A
?C0001:
MOV DPTR,#d
MOVX A,@DPTR
MOV x,A
MOV y,A
MOV z,A
SJMP ?C0001
END
可以看到,变量d赋值给想x,y,z时,只有x是直接读取的d中数值的,而y=d,z=d则是直接将寄存器中的数值赋给y,z。

若在次过程中,变量d的值被改变,则y,z变量中得到的数据将是错误的,因此在某些应用中程序存在隐患。

这类问题并不是编译器的问题。

由于访问内部寄存器比访问RAM速度快,因此变异类似程序时,会对程序进行优化,除第一次编译变量以为,在连续读取一个变量时,编译器为了简化程序,只要有可能就会把第一次读取的值放在ACC或Rx中,在以后读取该变量的值时,就直接使用第一次的读取值,如果该变量的值在次过程中已经被外设或其他程序所改变,可能就会出错。

为了解决这类问题,常用的方法就是降低编译器的优化级别或者使用volatile 关键字。

显然降低优化级别不是所期望的,因此用volatile关键字修饰相关变量很有必要。

上文中的例子将d加上volatile关键字修饰后,如下:
#include <reg52.h>
unsigned char x,y,z; volatile unsigned char xdata d; void main(void)
{
x = 0xaa;
y = 0xbb;
z = 0xcc;
d = 0xdd;
while(1)
{
x = d;
y = d;
z = d;
}
}
重新编辑得到的代码如下:main:
MOV x,#0AAH
MOV y,#0BBH
MOV z,#0CCH
MOV DPTR,#d
MOV A,#0DDH
MOVX @DPTR,A
?C0001:
MOV DPTR,#d
MOVX A,@DPTR
MOV x,A
MOVX A,@DPTR
MOV y,A
MOVX A,@DPTR
MOV z,A
SJMP ?C0001
END。

相关文档
最新文档