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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值