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函数
void inc(void) //程序的功能是使变量i加一
{
ea=0;
i++;
ea=1;
}
====================================================
文中谈到了共享变量的危险性,其解决办法是先关闭中断,操作完毕,再打开中断。具体分析见。
我个人认为不妥,具体分析如下:
1,上篇文章中的模型中说明了两个问题:
a,共享变量的操作。
如果你不希望主程序中引用的公共变量跟随中断灵敏的变化,则采用先关闭中断,操作完毕,再打开中断。
相反,则应将这个公共变量声明为:volatile unsigned cahr i;
关键字volatile主要用于随时有可能变化的变量声明。一般用在:
I, 定义CPU特殊功能寄存器
II,定义片外寄存器, 如外部数据存储器等等。
III,中断中使用的公共变量。
就目前我做的程序,一般采用后一种。
b,如何处理中断和其他函数都调用的函数,即可重入函数的处理。
一般来讲,在中断和其他程序都调用的函数,应具有可重入性。C51库函数中有的具有可重入性,有的则没有。具体的查看C51手册。
我们如何保证我们自己定义的函数具备可重入性呢?
1,尽量不操作公共变量。
2,如果操作了公共变量,则加上关键字 reentrant.如下:
void inc(void) reentrant ;
void inc(void) reentrant //程序的功能是使变量i加一
{
i++;
}
如我的意见有错误,敬请指出!
foodeyun ( fdy_001@163.com )
2006-9-21 WUHAN TKDL