因为我常用的是stm32F4系列单片机,所以采用其滴答定时器作为时基定时器(如果你使用的单片机是别款,只要单片机上有个定时器都可以,另外也得有中断处理函数)
1.首先初始化定时器,本人一般设置定时时间为1ms,这个可以是具体情况而定。
2.定义一个全局变量,假设命名为Count,并初始化为0;然后再定时器相关的中断处理函数中进行Count++。
static long long Count = 0;
//定时器初始化,并设定定时时间和中断使能
void TimInit(){
...
}
//其相关的中断处理函数
void InterHandle(void){
....
Count ++;
}
//防止外界修改Count
long long GetCount(void){
return Count;
}
3.在相关的头文件里定义俩个宏
#define _BEGIN(ms) static long long num = 0; if(GetCount() - num >= ms)do{ num = GetCount()
#define _END() }while(0)
4.使用方式,先定义一个任务函数,千万要避免任务函数使用延时函数,不然可能会没效果的
void Task1(void){
_BEGIN(100);
//doSomeing
LED1 = ~LED1;//比如让小灯1每隔100ms闪一下
_END();
}
void Task2(void){
_BEGIN(150);
//doSomeing
LED2 = ~LED2;//比如让小灯2每隔150ms闪一下
_END();
}
5.在主函数的while(1){}里调用任务函数便可简单的实现多任务了
6.总结,由于整体比较简单,自然就会有很多缺点了,比如在一个任务函数里面不能够再次延时和如果在某个任务太占时间会影响其它任务等,还得改进,不过这个已经适用很多情景了。如果处理的任务太过复杂,就可以考虑上os了。学习,共勉。