Keil C51编程
--版主 老古 http://www.laogu.com

(2)共享变量操作的危险性


在某个项目的设计中,我发现我的程序老是不稳定,结果发现是有多个程序操作同一变量,而有一个程序是中断程序。下面举一个例子来说明:

sbit ea = 0xAF;
sbit ex0 = 0xA8;
sbit IE0 = 0x89;
sbit it0=0x88;

unsigned char xdata i=0x00;
void inc(void) //程序的功能是使变量i加一
{
i++;
}

void main()
{
ea=1;
ex0=1;
it0=1;
while(1)
{
inc();
}
}


void Int0(void) interrupt 0 //发生一个外部中断事件使i减一
{
i--;
}

上面是一个例子,inc程序使i加一,中断程序使i减一。

执行一次inc 同时 执行一次中断,i的值应该不变(理论上),但是实际上跟执行的次序有关。

inc的函数的汇编代码为:
mov dptr,#i
movx a,@dptr
inc a
movx @dptr,a // 《------断点处 (09h)=0x00 a=0x00

ret

假设先执行inc函数,执行到上述断点处,这时的值a=01

此时产生一个外中断0,将使i的值变为i=0x00

继续执行inc被中断的程序,将执行movx @dptr,a

结果i为0x01.

而实际上我们要求得到的结果是0。但是程序执行的结果却为1。程序出了错误。

错误的原因是inc函数在执行的过程中被打断。
将inc函数改为

void inc(void) //程序的功能是使变量i加一
{

ea=0;
i++;
ea=1;
}

才能使结果正确。