FreeRTOS 軟定時器
軟定時器不需要硬件支持,完全由FreeRTOS內核控制。軟件定時器不會佔用任何處理時間除非調用。
配置
使用軟定時器需要進行如下配置:
回調函數 Software Timer Callback Functions
注意,回調函數不能包含可能造成阻塞態的任務,比如說延時函數!
當調用xQueueReceive()隊列接收函數時,需要將等待時間設置爲0!
屬性和狀態 Attributes and States of a Software Timer
定時器週期 Period of a Software Timer
單次/週期定時器 One-shot and Auto-reload Timers
- One-shot
開啓後,只能執行一次 - Auto-reload
開啓後,以週期重新加載計數值
狀態 Software Timer States
- Dormant
句柄存在但是回調函數不可用 - Running
句柄存在且回調函數正常執行
上下文 The Context of a Software Timer
The RTOS Daemon (Timer Service) Task
在調度器啓動後,系統會自動創建一些任務。比如說,Idle Task;
Daemon Task也是系統自動創建的任務,他負責軟定時器功能的實現。
軟定時器命令隊列 The Timer Command Queue
軟定時器API通過定時器命令隊列(timer command queue)從調用任務發指令給Daemon Task。這個隊列是自動創建的。隊列長度通過configTIMER_QUEUE_LENGTH設置。
Daemon 任務調度 Daemon Task Scheduling
Daemon task只處理命令或者時定時器回調函數,他以最高優先級運行。
創建和啓用定時器
xTimerCreate()
xTimerStart()
示例
定時器ID The Timer ID
當定時器創建時,會被分配一個初始ID,可以通過API進行修改。
vTimerSetTimerID() 設置定時器ID
pvTimerGetTimerID() 獲取ID
示例
改變定時器週期
xTimerChangePeriod()
用來改變已經創建的定時器的週期
比如說,LED運行狀態指示燈等
示例
重置定時器 Resetting a Software Timer
重置定時器就是重置其計數值,如圖
xTimerReset()
示例