我终于碰到这种情况了!

[复制链接]
 楼主| nin124 发表于 2008-8-2 18:39 | 显示全部楼层 |阅读模式
上次把程序写好,拿去运行.发现有时候死机.我四处找原因,做各种试验.始终找不到触发死机的条件.气死我了!我又检查程序,感觉程序没有错误的地方啊.于是怀疑是CPU有问题或者有干扰.郁闷了两天.后来又检查程序,突然想起来了.
原来是串口发送程序的问题,我看网上的程序一般都是这样写的,我也一直是这样写的:
void ComSendChar(uchar x)
{  
  SBUF=x;
  while(TI==0);
  TI=0;  
}
但这样写是有隐患的.while(TI==0);要8个机器周期.在这期间如果中断调用了这个函数就死机了.因为TI已经等于0了.程序就一直运行while(TI==0);.
后来把程序改成这样,就好了.
void ComSendChar(uchar x)
{  
  bit temp;
  temp=EA;
  EA=0;
  SBUF=x;
  while(TI==0);
  TI=0;
  EA=temp;  
}
后来一想这不是网上经常说的在中断里不能调用已经调用过的函数吗,或者是重入函数的问题吗.以前总是忽略这样的编译警告,看来以后要小心哦!
dld2 发表于 2008-8-2 20:10 | 显示全部楼层

呵呵

俺觉得你不应该在中断里调用串口发送函数。
俺写程序,基本不会发生中断和主程序都调用同一个函数的情况。
grady1125 发表于 2008-8-2 20:30 | 显示全部楼层

中断里用查询的方式发数据

不太好哦!
hotpower 发表于 2008-8-2 21:05 | 显示全部楼层

哈哈~~~根本就是个错~~~

xwj 发表于 2008-8-2 21:39 | 显示全部楼层

唉,没入门…

wxj1952 发表于 2008-8-2 22:10 | 显示全部楼层

书上都写了。浪费精力。

看看什么叫临界代码,以及处理方法。再看看所长的理论:怎样避免reentrant函数。正好有这个环境,何不实验长进一把?

1、把函数设置为reentrant试试。
2、(所长理论)写成2个不同的函数名,保证每个被调函数只能单独由一个函数调用。(变量TI要特殊处理。)
 楼主| nin124 发表于 2008-8-2 22:22 | 显示全部楼层

谢谢各位大侠啊!

唉,真是学习不刻苦,不如回家卖红苕啊!
walnutcy 发表于 2008-8-3 00:37 | 显示全部楼层

不看书,就得多花点精力啊,

wxj1952 发表于 2008-8-3 12:22 | 显示全部楼层

6楼没仔细看书也讲错了!

所长登堂入室了也不指导指导......

1、一个使用了全局变量的函数一定是不可重入函数!
   TI是全局变量,所以 ComSendChar( )必定是不可重入函数。根本不能用reentrant修饰!

2、一个公共函数( ComSendChar( ) )要设计成为“可重入函数”reentrant的关键是不使用全局变量!

3、多个任务访问同一共享资源的关键段落必须互斥,才能保障共享资源信息的可靠性和完整性。

“互斥”可以用关中断、使用互斥信号量和计数信号量几种方法。

LZ采用的是关中断方法。还可以有其他方法,继续实验......

njxmh 发表于 2008-8-3 15:15 | 显示全部楼层

你为何要在中断里调用发送函数呢

这可是不好的习惯,也是危险的举动
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

275

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部