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