打印
[圈圈教你玩USB]

好不容易发现圈圈的程序可能的小BUG

[复制链接]
2391|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gx_huang|  楼主 | 2010-3-3 19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void UartPutChar(uint8 d)
{
SBUF=d; //将数据写入到串口缓冲
Sending=1;  //设置发送标志
while(Sending); //等待发送完毕
}
如果在一个复杂的程序里,除了UART中断还有其它中断程序,容易出问题哦!
当SBUF=d后,如果一个执行时间超过串口发送时间的中断产生,
如果UART的中断优先级比较高,先将sending清零,
等所有中断都执行完毕,则
Sending=1;  //设置发送标志
while(Sending); //等待发送完毕
无异是死循环!
虽然这个概率很小,不得不防哦!

本人就吃过中断函数的苦,比如定时中断程序对一个2字节的UINT16定时减一,
主程序判断这个数是否为0,就会出现小概率的延时不准的错误。
比如T0工作于10ms定时中断,
UINT16 a;

在中断函数里有指令:if(a>0) a--;

在主程序里:
a=300;
do{}while(a!=0);

一般情况下,会延时300×10ms,
也可能只延时(300-256)×10ms。
如果a=256时,
主程序先判断a的低字节是否是0,再判断高字节是否为0,就可能出现问题。
原理就不说了。

相关帖子

沙发
computer00| | 2010-3-23 18:54 | 只看该作者
那把中断关了吧~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

9035

帖子

79

粉丝