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