导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[讨论]关于共享变量和可重入函数在实际编程中的处理

* 97985: [讨论]关于共享变量和可重入函数在实际编程中的处理

   fudeyun 
fudeyun发表的帖子 

 [讨论]关于共享变量和可重入函数在实际编程中的处理
今天,在老古论坛上发现一篇文章,题为(部分内容如下):
====================================================
 Keil C51编程
--版主 老古 
(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函数
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



发表时间:2006年9月21日14:30:47

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:[求助]触摸感应电路改进本人设计一个有触摸感应功能的产品.要求当有接触到金属外壳,该产品不动作.现在
[下一篇帖子]:[讨论]一个怪问题,大家有没有见过仿真可以,烧写到STC不行我有个程序,有一段一个判断在仿真器上很正