freertos 定时器 不启动_FreeRTOS 从入门到精通8--软件定时器应用
在上一講
奔騰的心:FreeRTOS 從入門到精通7--隊列管理?zhuanlan.zhihu.com我們介紹了隊列管理的相關知識,在這一章中我們將探討FreeRTOS的另一個特性--軟件定時器(Software Timer)的概念和應用。
什么是軟件定時器
如果一個任務要在未來某個時間運行或者周期性地運行以實現定時或者延時控制,就需要設定一個定時器。定時器分為硬件定時器和軟件定時器。硬件定時器是單片機內部的特殊功能模塊,通過硬件定時器中斷就可以精準地對任務的運行時間進行控制。但是單片機的硬件資源通常有限,而且不同種類單片機的定時中斷的代碼是不同的,對程序代碼的兼容性易用性提出很高的難度。相對而言,軟件定時器是基于系統時鐘中斷且由軟件來模擬的定時器,當經過設定的Tick 時鐘計數值后會觸發用戶定義的回調函數。軟件定時器不占用單片機寶貴的硬件資源和CPU資源。FreeRTOS提供了完善的軟件定時器的支持,為了啟用軟件定時器,需要在頭文件FreeRTOSConfig.h中設置configUSE_TIMERS的值為1.
軟件定時器需要定時或者延時控制的函數稱為回調函數。函數的原型如下:
void函數的返回值是空類型,xTimer的參數是軟件定時器的具柄。回調函數的注意事項是代碼應該盡可能地簡短緊湊,并且避免調用FreeRTOS的API函數防止進入阻塞狀態。
軟件定時器的類型和狀態
軟件定時器在FreeRTOS中分為兩個類型
- 一次性定時器(One-shot timer)
- 自動重載定時器(Auto-reload timer)
一次性定時器啟動后只會執行一次回掉函數;自動重載定時器會周期性地執行回調函數。
軟件定時器的狀態有以下兩種
- 靜止裝態(Dormant)
- 運行狀態(Running)
處于靜止裝態的定時器不會執行回調函數,可以通過調用定時器的具柄啟用;處于運行狀態的定時器會在設定的時間間隔(相對于定時器進入運行狀態后)到達后調用回調函數。一次性定時器會在執行回調函數后進入靜止狀態,而自動重載定時器會在執行回調函數后重新進入運行狀態。通過調用軟件定時器相關的系統API函數可以在兩種狀態之間進行切換,其中兩種定時器的狀態轉換圖如下:
自動重載定時器的狀態轉換圖一次性定時器的狀態轉換圖軟件定時器的實質
軟件定時器由一個系統內核調度器自動生成的時間服務任務管理。這個時間服務任務的優先級和棧大小由頭文件FreeRTOSConfig.h中configTIMER_TASK_PRIORITY和configTIMER_TASK_STACK_DEPTH屬性相應設定。定時器的回調函數調用FreeRTOS的API函數的話會導致時間服務任務管理進入阻塞狀態,這種情況是要避免的。
針對軟件定時器的命令如啟動定時器,停止定時器和重置定時器等會通過命令隊列發送到時間服務任務。隊列長度由頭文件FreeRTOSConfig.h中configTIMER_QUEUE_LENGTH 值設定。
定時器相關API函數
TimerHandle_txTimerCreate()函數用于創建定時器
函數參數含義如下
- pcTimerName 定時器的名稱,用于調試用
- xTimerPeriodInTicks 定時器的周期,dMS_TO_TICKS() 可把時間轉成節拍數
- uxAutoReload 設置為pdTRUE為 自動重載定時器,設置為pdFALSE為一次性定時器
- pvTimerID 定時器的ID,可以用于各種目的
- pxCallbackFunction 定時器執行的回調函數
- 返回值 返回值為NULL表示創建失敗,非NULL表示創建成功
xTimerStart()函數用于啟動定時器
函數參數含義如下
- xTimer 要執行定時器的具柄
- xTicksToWait 如果命令隊列為滿時函數進入阻塞狀態等待命令隊列有空的時間
- 返回值 返回值為pdPASS表示啟動定時器成功;返回值為pdFALSE表示失敗
vTimerSetTimerID()用于設置定時器的pvTimerID 屬性
函數參數含義如下
- xTimer 要執行定時器的具柄
- pvNewID 設定的pvTimerID的值
pvTimerGetTimerID()函數用于獲取定時器的pvTimerID 屬性
函數參數含義如下
- xTimer 要執行定時器的具柄
- 返回值 pvTimerID的值
xTimerChangePeriod函數用于改變定時器的運行周期
函數參數含義如下
- xTimer 要執行定時器的具柄
- xNewTimerPeriodInTicks 新的定時器的周期,dMS_TO_TICKS() 可把時間轉成節拍數
- xTicksToWait 如果命令隊列為滿時函數進入阻塞狀態等待命令隊列有空的時間
- 返回值 返回值為pdPASS表示成功;返回值為pdFALSE表示失敗
xTimerReset()函數用于重置定時器,定時器會重新運行并以此計算新的時間間隔
函數參數含義如下
- xTimer 要執行定時器的具柄
- xTicksToWait 如果命令隊列為滿時函數進入阻塞狀態等待命令隊列有空的時間
- 返回值 返回值為pdPASS表示成功;返回值為pdFALSE表示失敗
這一章我們講了軟件定時器的應用,偏重于理論這一塊,在下一章我們講介紹中斷管理。
奔騰的心:FreeRTOS 從入門到精通9--中斷管理?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的freertos 定时器 不启动_FreeRTOS 从入门到精通8--软件定时器应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi 串口通信发送_STM32第
- 下一篇: 一个算法对于某个输入的循环次数是可以事先