定時器的概念
定時器用于根據系統時啟動特定的函數,執行相應的任務。FreeRTOS的定時器可以配置啟動一次或者間隔一定時間執行。
當然,定時器的實現是基于RTOS心跳機制與任務列表的。這意味著其API可以任何RTOS托管下的程序段調用(而中斷不行),包括定時器關聯的的回調函數。
FreeRTOS提供了間隔執行定時器的運行時序:

API Description ※ 定時器不能在中斷中使用
**①****創建定時器 **osTimerNew()
定時器的類型分為單次(One-time )和多次執行(periodic),在創建時進行配置;其中多次執行時序見上圖;單次喚起一次后自動停止,需要用戶手動再次啟動。而多次執行則間隔指定時間就會執行一次,直至用戶停止。
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);/*
創建一個定時器,并綁定相應的回調函數 @retval 定時器的ID; 創建失敗返回NULL
@param void(* osTimerFunc_t)(void *argument) //這是回調函數的格式,例:
-void Timer1_Callback(void *arg); //arg contains various type of variables.
func -回調函數的地址,即函數名
type -定時器類型(單次或間隔型): osTimerOnce -執行單次 osTimerPeriodic -多次執行
*argument -傳遞給回調函數的參數;傳入地址;缺省填 (void*)0即可
*/
②啟動定時器 osTimerStart()
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);/*
啟動定時器并指定時間間隔. 指定的回調函數在經過本函數指定的ticks后第一次被調用。
@param:
id -定時器ID
ticks -間隔時間 (單位心跳數)
@retval:
osOK -成功
osErrorISR -在中斷中調用而出錯
osErrorParameter: parameter timer_id is either NULL or invalid or ticks is incorrect.
osErrorResource: the timer is in an invalid state.
*/
③停止定時器 osTimerStop()
停止定時器的效果從下一次喚醒開始(回調函數停止自己定時器的情況)
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).
*/
④查詢定時器啟動狀態osTimerIsRunning()
uint32_t osTimerIsRunning (osTimerId_t timer_id);/*
@retval
0 U -未啟動、中斷中調用、未創建
!0 -已啟動
*/
⑤刪除定時器 osTimerDelete()
回調函數可以刪除調用自己的定時器。
刪除后定時器id值變為NULL,可以再調用 osTimerNew() 為其創建新的定時器
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
;
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
定時器
+關注
關注
23文章
3368瀏覽量
123597 -
RTOS
+關注
關注
25文章
866瀏覽量
122977 -
FreeRTOS
+關注
關注
14文章
499瀏覽量
66934 -
串口中斷
+關注
關注
0文章
67瀏覽量
14612
發布評論請先 登錄
相關推薦
熱點推薦
轉:第19章 FreeRTOS定時器組
(Daemon任務)19.3 使用軟件定時器組注意事項19.4 定時器組API函數19.5 實驗例程說明19.6總結19.1定時器組介紹 FreeRTOS軟件
發表于 09-03 13:13
freeRTOS中的軟定時器的定時時間,創建定時器后有辦法修改嗎?
請教大家,freeRTOS中的軟定時器的定時時間,創建定時器后有沒有辦法修改呢?我的想法是 程序里有個循環,循環里改改定時器的時間。但是貌似
發表于 07-19 08:03
基于STM32定時器實現毫秒延時函數
STM32定時器包含基本定時器、通用定時器和高級定時器,其中TIM6和TIM7是STM32當中的基本定時器,作為初學者,先從最基本的學起最容
發表于 10-12 15:54
?2.6w次閱讀
STM32基于cubeMX實現定時器點燈
Cortex M3內核當中的定時器,它并不屬于芯片廠商的外設,也就是說使用ARM內核的不同廠商,都擁有基本結構相同的系統定時器。主要目的是給RTOS提供時鐘節拍做時間基準。基本定時器:TIM6、TIM7。通用
發表于 11-23 18:21
?19次下載
SysTick 定時器
的SysTick定時器來實現延時,可以不占用系統定時器,節約資源。由于SysTick是在CPU核內部實現的,跟MCU外設無關,因此它的代碼可以在不同廠家之間移植。本 章 將 使用系統滴
發表于 12-05 14:51
?9次下載
freeRTOS軟件定時器的使用
freeRTOS中加入了軟件定時器這個功能組件,是一個可選的、不屬于freeRTOS內核的功能,由定時器服務(其實就是一個定時器任務)來提供
什么是軟件定時器?軟件定時器的實現原理
軟件定時器是用程序模擬出來的定時器,可以由一個硬件定時器模擬出成千上萬個軟件定時器,這樣程序在需要使用較多定時器的時候就不會受限于硬件資源的
定時器設計實現
返回ITimer類型的共享指針。其中ITimer類中定義了start和stop方法,用于啟動或停止當前定時器。 TimerManager還有一個內部類TimerMessageQueue用于實現定
如何實現一個軟件定時器?
在Linux,uC/OS,FreeRTOS等操作系統中,都帶有軟件定時器,原理大同小異。典型的實現方法是:通過一個硬件定時器產生固定的時鐘節拍,每次硬件
FreeRTOS的定時器設計實現
評論