定時器的概念
定時器用于根據(jù)系統(tǒng)時啟動特定的函數(shù),執(zhí)行相應的任務。FreeRTOS的定時器可以配置啟動一次或者間隔一定時間執(zhí)行。
當然,定時器的實現(xiàn)是基于RTOS心跳機制與任務列表的。這意味著其API可以任何RTOS托管下的程序段調(diào)用(而中斷不行),包括定時器關(guān)聯(lián)的的回調(diào)函數(shù)。
FreeRTOS提供了間隔執(zhí)行定時器的運行時序:
API Description ※ 定時器不能在中斷中使用
**①****創(chuàng)建定時器 **osTimerNew()
定時器的類型分為單次(One-time )和多次執(zhí)行(periodic),在創(chuàng)建時進行配置;其中多次執(zhí)行時序見上圖;單次喚起一次后自動停止,需要用戶手動再次啟動。而多次執(zhí)行則間隔指定時間就會執(zhí)行一次,直至用戶停止。
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);/*
創(chuàng)建一個定時器,并綁定相應的回調(diào)函數(shù) @retval 定時器的ID; 創(chuàng)建失敗返回NULL
@param void(* osTimerFunc_t)(void *argument) //這是回調(diào)函數(shù)的格式,例:
-void Timer1_Callback(void *arg); //arg contains various type of variables.
func -回調(diào)函數(shù)的地址,即函數(shù)名
type -定時器類型(單次或間隔型): osTimerOnce -執(zhí)行單次 osTimerPeriodic -多次執(zhí)行
*argument -傳遞給回調(diào)函數(shù)的參數(shù);傳入地址;缺省填 (void*)0即可
*/
②啟動定時器 osTimerStart()
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);/*
啟動定時器并指定時間間隔. 指定的回調(diào)函數(shù)在經(jīng)過本函數(shù)指定的ticks后第一次被調(diào)用。
@param:
id -定時器ID
ticks -間隔時間 (單位心跳數(shù))
@retval:
osOK -成功
osErrorISR -在中斷中調(diào)用而出錯
osErrorParameter: parameter timer_id is either NULL or invalid or ticks is incorrect.
osErrorResource: the timer is in an invalid state.
*/
③停止定時器 osTimerStop()
停止定時器的效果從下一次喚醒開始(回調(diào)函數(shù)停止自己定時器的情況)
osStatus_t osTimerStop (osTimerId_t timer_id);/*
停止指定的定時器
@retval
osOK
osErrorISR
osErrorParameter: parameter timer_id is either NULL or invalid.
osErrorResource: the timer is not running (you can only stop a running timer).
*/
④查詢定時器啟動狀態(tài)osTimerIsRunning()
uint32_t osTimerIsRunning (osTimerId_t timer_id);/*
@retval
0 U -未啟動、中斷中調(diào)用、未創(chuàng)建
!0 -已啟動
*/
⑤刪除定時器 osTimerDelete()
回調(diào)函數(shù)可以刪除調(diào)用自己的定時器。
刪除后定時器id值變?yōu)镹ULL,可以再調(diào)用 osTimerNew() 為其創(chuàng)建新的定時器
osStatus_t osTimerDelete (osTimerId_t timer_id);/*
刪除定時器并清理其資源。
@retval:
osOK: the specified timer has been deleted.
osErrorISR: osTimerDelete cannot be called from interrupt service routines.
osErrorParameter: parameter timer_id is either NULL or invalid.
osErrorResource: the timer is in an invalid state.
*/
示例
void Timer_Callback (void *arg); // prototype for timer callback function
uint32_t exec; // argument for the timer call back function
void TimerStop_example (void) {
osTimerId_t id; // timer id
osStatus_t status; // function return status
// Create periodic timer
exec = 1U;
id = osTimerNew(Timer_Callback, osTimerPeriodic, &exec, NULL);
osTimerStart(id, 1000U); // start timer
:
status = osTimerStop(id); // stop timer
if (status != osOK) {
// Timer could not be stopped
}
;
osTimerStart(id, 1000U); // start timer again
;
}
-
定時器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114720 -
RTOS
+關(guān)注
關(guān)注
22文章
811瀏覽量
119595 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62144 -
串口中斷
+關(guān)注
關(guān)注
0文章
64瀏覽量
13882
發(fā)布評論請先 登錄
相關(guān)推薦
評論