您的位置:首页 > 其它

一种在单片机上实现多个软件定时功能的框架

2012-11-16 19:50 190 查看
标题似乎写得不大合适,不妨设想一个这样的需求场景:单片机程序一般有个大循环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)--;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: