标题似乎写得不大合适,不妨设想一个这样的需求场景:单片机程序一般有个大循环while(1),
在这个循环中处理所有中断以外的事情,这些事情需要被执行的周期各不一样,有些需要频繁地做
,有些需要很长时间才做一次。我们把这些事情记为T1,T5,T10 ,T200...
T表示task或者time吧,后面的数字表示执行周期,即T1表示此事情1秒执行一次,T2表示需要
2秒执行一次。。。碰到这种需求,我们会想要是有ucos就好了,要是有Linux就好了。
好在情况不是很复杂,事情需要的执行周期也不是很精准,任务之间的交互基本上也没有。
这里给出一个实现这样需求的模板:
首先需要一个定时器,单片机的硬件定时器,并使能中断,中断中只做两件件事:
uint8_t tick=0;
void timer_int(void)
{
1:重装初值 10ms
2:tick++;
}
在大循环中:
void main()
{
sys_init();
while(1){
tasks();
}
}
真正的工作在tacks中:
static uint8_t timer_1s = 0;
static uint8_t timer_5s = 5;
static uint8_t timer_10s = 2;
static uint8_t timer_100s = 10;
void tasks()
{
if(timer_1s < 100){
return;
}
disable_global_interrupts();
timer_1s = 0;
enable_global_interrupts();
//------- process per 1s --------//
tsk_1s();
sw_timer_dec(timer_5s );
if(timer_5s > 0){
return;
}
timer_1s = 5;
//------- process per 5s --------//
tsk_5s();
sw_timer_dec(timer_10s );
if(timer_10s > 0){
return;
}
timer_10s = 2;
//------- process per 5s --------//
tsk_10s();
......
}
void sw_timer_dec(uint8_t* timer)
{
if(*timer == 0){
return;
}
(*timer)--;
}