学会以合作的方式思考

        对于所有任务,无论在何种情况下,任务的运行时间 t 都应该小于时间间隔。即如果任务不能在规定的时段内完成,就中止该任务,尤其是对于以查询方式运行的中断程序。

 

比如,这样的代码是不可靠的:

// 等待, 直到AD转换结束(检查ADCI)
while((ADCON & ADCI) == 0);

因为在某些情况下,可能由于如下原因导致系统被挂起:

a 如果模数转换器的初始化不正确,不能确定模数转换将被执行

b 如果模数转换器的输入电压过高,那么可能根本就不运行

c 如果没有正确初始化变量ADCON或ADCI,那么可能不按要求运行

 

如果要求系统很可靠,则必须能够保证没有函数会这样挂起。循环超时提供了一种简单而有效的方法来提供这样的保证。

循环超时很容易创建,其代码结构的基础是软件延迟:

UINT16 Timeout_loop = 0;
...
while(((ADCON & ADCI) == 0) || (++Timeout_loop == 0));

UINT16 Timeout_loop = 1;
...
while(((ADCON & ADCI) == 0) || (Timeout_loop == 0))
{
        Timeout_loop++;
}

后者的好处是可以很方便的注释掉这种循环超时,这时如果再发生前面所说的错误,至少程序不会一直停留这这里,而会继续往下执行,当然紧接着后面应该有对这种错误的相应处理方法。

 

注:

        这种循环超时因为是软件延迟实现的,故不太容易精准的控制延迟时间,且没有很好的可移植性,可以考虑用硬件定时器替代。

比如,假设8051定时器1已经开启,10ms定时

while((ADCON & ADCI) == 0) || ! TF0);


 




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值