因爲我常用的是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了。學習,共勉。