循环超时

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

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)

}


猜你喜欢

转载自blog.csdn.net/xiaoliu0515_0515/article/details/79492006