freeRTOS 定時器服務

2022-09-14 04:21:08 字數 2698 閱讀 1952

一、概念:軟體定時器、定時器服務任務、定時器命令佇列

軟體定時器允許設定一段時間,當設定的時間到達之後就執行指定的**函式。 

不能在**函式中呼叫任何會阻塞任務的 api 函式 !

定時器是乙個可選的、不屬於 freertos 核心的功能,它是由定時器服務(或 daemon)任務來提供的。

freertos 提供了很多定時器有關的 api 函式, 這些 api 函式大多都使用 freertos的佇列傳送命令給定時器服務任務。

這個佇列叫做定時器命令佇列

定時器命令佇列是提供給freertos 的軟體定時器使用的,使用者不能直接訪問!

定時器命令佇列將使用者應用任務定時器服務任務連線在一起。

應用程式呼叫函式 xtimerreset(),結果就是復位命令會被傳送到定時器命令佇列中,定時器服務任務會處理這個命令。

應用程式是通過函式 xtimerreset()間接的向定時器命令佇列傳送了復位命令,並不是直接呼叫類似 xqueuesend()這樣的佇列操作函式傳送的。

使用定時器服務任務,需要配置的幾個巨集:

configuse_timers

configtimer_task_priority

configtimer_queue_length

configtimer_task_stack_depth

二、復位軟體定時器

復位軟體定時器,會重新計算定時週期到達的時間點,這個新的時間點是相對於復位定時器的那個時刻計算的,並不是第一次啟動軟體定時器的那個時間點!!!

basetype_t xtimerreset       ( timerhandle_t xtimer,  ticktype_t xtickstowait )

basetype_t xtimerresetfromisr( timerhandle_t xtimer, basetype_t *pxhigherprioritytaskwoken );

真正執行的是函式 xtimergenericcommand()

三、建立軟體定時器

新建立的軟體定時器處於休眠狀態,也就是未執行的。

函式 xtimerstart() 、 xtimerreset() 、xtimerstartfromisr() 、 xtimerresetfromisr() 、xtimerchangeperiod() 和 xtimerchangeperiodfromisr()可以使新建立的定時器進入活動狀態。

timerhandle_t xtimercreate( const

char * const

pctimername,

ticktype_t xtimerperiodinticks,

ubasetype_t uxautoreload,

void *pvtimerid, 多個定時器使用同乙個**函式時,用於區別。timerid

timercallbackfunction_t pxcallbackfunction )

timerhandle_t xtimercreatestatic(

const

char * const

pctimername,

ticktype_t xtimerperiodinticks,

ubasetype_t uxautoreload,

void *pvtimerid,

timercallbackfunction_t pxcallbackfunction,

statictimer_t * pxtimerbuffer ) 用於儲存timer結構體

四、開關軟體定時器

如果軟體定時器沒有執行的話呼叫函式 xtimerstart()就會計算定時器到期時間;

如果軟體定時器正在執行的話呼叫函式 xtimerstart()的結果和 xtimerreset()一樣。

basetype_t xtimerstart ( timerhandle_t xtimer, ticktype_t xtickstowait ) 進入命令佇列的阻塞時間

basetype_t xtimerstartfromisr( timerhandle_t xtimer, basetype_t *pxhigherprioritytaskwoken );

這兩個功能真正實現的函式是xtimergenericcommand()

basetype_t xtimerstop ( timerhandle_t xtimer,

ticktype_t xtickstowait )

basetype_t xtimerstopfromisr( timerhandle_t xtimer,

basetype_t *pxhigherprioritytaskwoken );

真正實現是函式xtimergenericcommand()

留白

freertos 定時器 不啟動 定時器

工作方式0,13位定時器 計數器。下面以定時器0為例講解。上圖可以知道定時器工作方式0的邏輯結構,與工作方式1相差不遠,只是方式1是兩個8位計數器,而方式0是乙個8位,乙個低5位組成的13位計數器。程式設計控制兩個非常像。方式0的計數器最大值為2的13次方 8192,計數一次時間最大值為8192 1...

FreeRTOS學習6 軟體定時器

timerhandle t timerhandle tim1 定義定時器1變數 timerhandle t timerhandle tim2 定義定時器2變數 timerhandle tim1 xtimercreate tim1 1000,pdtrue,void 1,timerhandle tim1...

FreeRTOS軟體定時器的使用

先貼上乙個建立的 先宣告乙個控制代碼 timerhandle t pump wakeup timer handle null 建立定時器和啟動定時器,第三個引數,pdfalse是只定時一次,pdtrue是自動過載定時器,也就是一直迴圈。if pump wakeup timer handle null...