循环超时

使用合作式调度器时,任务运行时间<时标时间,使用循环超时和硬件超时的模式能保证,如果任务不在规定的时间内完成,就中止该任务。

1.循环超时

例1,某单片机带有AD模块,手册应用有以下代码:

while((ADCON&ADCI)==0)

这样的代码不可靠,可导致系统被挂起

  • 初始化不正确,不能确定数模转换被执行
  • 输入电压过高,根本不运行
  • 没有正确的配置ADCON和ADCI,不按要求进行

超时循环提供了一个简单的办法,保证没有函数被挂起

创建思路

unsigned integer time_loop=0;

while(time_loop);

当time_loop到达最大值溢出时,程序将继续向下执行

或者改进下上面代码

while((ADCON&ADCI==0)&&(time_loop!=0)

{

time_loop++;

}

通过改变time_loop初始值改变超时时间

eg.    TimeoutL.h

#define LOOP_TIMEOUT_INIT_001MS  65435

#define LOOP_TIMEOUT_INIT_010MS  64535

#define LOOP_TIMEOUT_INIT_500MS  14535

特点:不使用定时器,极小的成本改善可靠性和安全性,cpu和存储器开销很小

eg:Main.c

#include "Main.h"

#include "TimeoutL.h"

void Test_1ms(void)

void Test_10ms(void)

void Test_500ms(void)

void main(void)

{

while(1)

{

 Test_1ms(void)

 Test_10ms(void)

 Test_500ms(void)

}

}

void Test_1ms(void)

{

tWord Timeout_loop=LOOP_TIMEOUT_INIT_001MS;

while(++Timeout_loop!=0)

}

void Test_10ms(void)

{

tWord Timeout_loop=LOOP_TIMEOUT_INIT_010MS;

while(++Timeout_loop!=0)

}

void Test_500ms(void)

{

tWord Timeout_loop=LOOP_TIMEOUT_INIT_500MS;

while(++Timeout_loop!=0)

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值