詳解μC/OS-II軟體定時器簡單使用方法
μC/OS-II軟體定時器的基本使用主要分為兩步:建立與啟動
一、基本知識
1、建立定時器
OS_TMR *OSTmrCreate
(
INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr
)
入口參數解釋:
(1)dly:延時時間(單位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果參數opt為:OS_TMR_OPT_ONE_SHOT,則dly表示定時器逾時時間
如果參數opt為:OS_TMR_OPT_PERIODIC,則dly表示定時器在開始迴圈模式前等待第一次啟動的逾時時間
(2)period:定時器重複啟動並執行時間周期(單位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果參數opt為:OS_TMR_OPT_PERIODIC,則period表示定時器自動周期重啟的時間
如果參數opt為:OS_TMR_OPT_ONE_SHOT,則period無效
(3)opt:選擇定時器運行模式
如果參數opt為:OS_TMR_OPT_PERIODIC,則表示定時器會自動重載逾時時間,周期運行
如果參數opt為:OS_TMR_OPT_ONE_SHOT,則表示定時器只運行一次
(4)callback:逾時處理回呼函數(定時器中斷服務程式)
必須定義成類似這種函數介面的形式:void MyCallback (OS_TMR *ptmr, void *p_arg);
當定時器時間到了,就執行這個函數
(5)callback_arg:當callback被調用時傳遞給callback的入口參數
(6)pname:定時器的名稱(是一個字串,如"Timer0")
(7)*perr:定時器錯誤碼,是下面之一:
OS_ERR_NONE:沒有錯誤
OS_ERR_TMR_INVALID_DLY:指定了一個無效的延時時間
OS_ERR_TMR_INVALID_PERIOD:指定了一個無效的周期
OS_ERR_TMR_INVALID_OPT:指定了一個無效的選項
OS_ERR_TMR_ISR :在中斷服務程式裡調用錯誤
OS_ERR_TMR_NON_AVAIL:定時器池裡沒有閒置定時器
2、啟動定時器
BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)
這個函數是用來被應用程式調用,來啟動定時器的。
入口參數解釋:
(1)ptmr:指向待啟動的定時器
(2)*perr:錯誤碼
注意:μC/OS-II定時器的建立、啟動等函數不能在中斷服務程式裡調用
二、使用舉例
void OS_Timer0(OS_TMR *ptmr, void *p_arg)
{
static INT8U led = 1;
OSIntEnter();
led = !led;
LED0 = led;
OSIntExit();
}
//LED0任務
void led0_task(void *pdata)
{
OS_TMR *pTimer0 = 0;
INT8U err = 0;
pdata = pdata;
//建立定時器
pTimer0 = OSTmrCreate(0,
OS_TMR_CFG_TICKS_PER_SEC,
OS_TMR_OPT_PERIODIC,
//OS_TMR_OPT_ONE_SHOT,
(OS_TMR_CALLBACK)OS_Timer0,
(INT8U *)0,
"OSTIMER0",
&err);
OSTmrStart(pTimer0, &err); //啟動定時器
while (1)
{
delay_ms(1000);
}
}
OSTmrCreate函數參數period為OS_TMR_CFG_TICKS_PER_SEC,故逾時周期為:
(OS_TMR_CFG_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)秒,即1秒
所以,OS_Timer0會每秒鐘被調用一次,LED0會亮一秒、滅一秒的迴圈。
三、注意:
(1)OS_TMR_CFG_TICKS_PER_SEC的值決定逾時時間的解析度,值越大,能設定的逾時時間越小,
假設設定dly或者period的為值x,則實際逾時時間為:(x / OS_TMR_CFG_TICKS_PER_SEC)秒
(2)OS_TICKS_PER_SEC的值決定μC/OS-II的時間片(即心跳周期),假設其值為100,則OS時間片為(1000ms / 100)= 10ms
即μC/OS-II時間片為(1000 / OS_TICKS_PER_SEC)毫秒
四、小技巧
可以利用MCU I/O口外部中斷加μC/OS-II的軟體定時器實現按鍵的消抖。具體是按按鍵觸發I/O硬體中斷,
然後在I/O中斷服務程式裡發送訊號量給一個阻塞的任務,這個阻塞的任務擷取訊號量後運行定時器啟動函數,
最後在定時器逾時處理函數裡讀取按鍵I/O電平值來判斷按鍵是否按下和抬起,來得到相應鍵值。故中斷觸發
方式可以配置為雙邊沿觸發。