本文的內(nèi)容結(jié)構(gòu)如下:
2、freeRTOS的定時(shí)器種類
2.1、單次定時(shí)器
2.2、周期定時(shí)器
3、freeRTOS 軟件定時(shí)器的API函數(shù)
3.1、創(chuàng)建軟件定時(shí)器
3.2、啟動(dòng)軟件定時(shí)器
3.3、停止定時(shí)器
3.4、復(fù)位定時(shí)器
3.5、查詢定時(shí)器是否已經(jīng)開始運(yùn)行
4、軟件定時(shí)器使用實(shí)例
freeRTOS中加入了軟件定時(shí)器這個(gè)功能組件,是一個(gè)可選的、不屬于freeRTOS內(nèi)核的功能,由定時(shí)器服務(wù)(其實(shí)就是一個(gè)定時(shí)器任務(wù))來提供。
軟件定時(shí)器是當(dāng)設(shè)定一個(gè)定時(shí)時(shí)間,當(dāng)達(dá)到設(shè)定的時(shí)間之后就會(huì)執(zhí)行指定的功能函數(shù),而這個(gè)功能函數(shù)就叫做 回調(diào)函數(shù) 。
也就是說回調(diào)函數(shù)的兩次執(zhí)行間隔叫做定時(shí)器的定時(shí)周期。
回調(diào)函數(shù): 回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。
1、 freeRTOS中啟用定時(shí)器
在freeRTOS中要使用軟件定時(shí)器的話,需要在配置文件freeRTOSConfig.h中設(shè)置相應(yīng)的宏,如下:
#define configUSE_TIMERS 1 //使能軟件定時(shí)器
#define configTIMER_TASK_PRIORITY 2 // 軟件定時(shí)器的優(yōu)先級(jí)
#define configTIMER_QUEUE_LENGTH 10 // 軟件定時(shí)器的隊(duì)列長(zhǎng)度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2) // 軟件定時(shí)器的堆??臻g大?。▎挝皇亲郑?/span>
2、freeRTOS的定時(shí)器種類
2.1、單次定時(shí)器
單次定時(shí)器定時(shí)時(shí)間到了就執(zhí)行一次回調(diào)函數(shù),之后不會(huì)再執(zhí)行,只有在再次重新啟動(dòng)的時(shí)候才會(huì)再執(zhí)行一次。
2.2、周期定時(shí)器
周期定時(shí)器根據(jù)設(shè)定的時(shí)間周期地執(zhí)行的。它一旦啟動(dòng)以后,每執(zhí)行一次完一次回調(diào)函數(shù)以后定時(shí)器會(huì)自動(dòng)重啟,回調(diào)函數(shù)會(huì)周期性的執(zhí)行。
3、freeRTOS 軟件定時(shí)器的API函數(shù)
3.1、創(chuàng)建軟件定時(shí)器
TimerHandle_t xTimerCreate
(
const char * const pcTimerName, /* 定時(shí)器名字 */
const TickType_t xTimerPeriod, /* 定時(shí)器周期 */
const UBaseType_t uxAutoReload, /* 選擇單次模式或者周期模式 */
void * const pvTimerID, /* 定時(shí)器 ID */
TimerCallbackFunction_t pxCallbackFunction ); /* 定時(shí)器回調(diào)函數(shù) */
函數(shù)描述:
函數(shù) xTimerCreate 用于創(chuàng)建軟件定時(shí)器。
1)第 1 個(gè)參數(shù): 定時(shí)器名字,一般用于調(diào)試,方便識(shí)別不同的定時(shí)器。
2)第 2 個(gè)參數(shù): 定時(shí)器周期,單位是系統(tǒng)時(shí)鐘節(jié)拍。
3)第 3 個(gè)參數(shù): 選擇定時(shí)器是周期模式還是單次模式。若參數(shù)為 pdTRUE ,則表示選擇周期模式,若參數(shù)為 pdFALSE ,則表示選擇單次模式。
4)第 4 個(gè)參數(shù): 定時(shí)器的 ID。當(dāng)創(chuàng)建多個(gè)不同的定時(shí)器,但又使用同一個(gè)回調(diào)函數(shù)時(shí),在回調(diào)函數(shù)中就可以通過不同的 ID 號(hào)來區(qū)分不同的定時(shí)器。
5)第 5 個(gè)參數(shù): 定時(shí)器的回調(diào)函數(shù)。
返回值: 創(chuàng)建成功返回定時(shí)器的句柄,失敗會(huì)返回 NULL。
創(chuàng)建一個(gè)單次觸發(fā)的軟件定時(shí)器示例如下:
TimerHandle_t singalTIMERS; //單次定時(shí)器
void singalTimersFunc(TimerHandle_t xTimers); //單次定時(shí)器回調(diào)函數(shù)
/*創(chuàng)建單次定時(shí)器*/
singalTIMERS = xTimerCreate(
"singalTIMERS", //軟件定時(shí)器的名字
1000, //定時(shí)周期,單位是時(shí)鐘節(jié)拍數(shù)
pdFALSE, //定時(shí)器模式,pdTRUE為周期定時(shí)器,pdFALSE為單次定時(shí)器
(void*)1, //定時(shí)器的ID號(hào)
singalTimersFunc //定時(shí)器回調(diào)函數(shù)
);//
3.2、啟動(dòng)軟件定時(shí)器
1)在任務(wù)中啟動(dòng)
BaseType_t xTimerStart( TimerHandle_t xTimer, /* 定時(shí)器句柄 */
TickType_t xBlockTime ); /* 成功啟動(dòng)定時(shí)器前的最大等待時(shí)間設(shè)置,單位系統(tǒng)時(shí)鐘節(jié)拍 */
函數(shù)描述:
函數(shù) xTimerStart 用于啟動(dòng)軟件定時(shí)器。
**1> **第 1 個(gè)參數(shù)是定時(shí)器句柄。
2> 第 2 個(gè)參數(shù)是成功啟動(dòng)定時(shí)器前的最大等待時(shí)間設(shè)置,單位系統(tǒng)時(shí)鐘節(jié)拍。這是定時(shí)器組的大部分 API 函數(shù)不是直接運(yùn)行的,而是通過消息隊(duì)列給定時(shí)器任務(wù)發(fā)消息來實(shí)現(xiàn)的,此參 數(shù)設(shè)置的等待時(shí)間就是當(dāng)消息隊(duì)列已經(jīng)滿的情況下,等待消息隊(duì)列有空間時(shí)的最大等待時(shí)間。
返回值: 返回 pdFAIL 表示此函數(shù)向消息隊(duì)列發(fā)送消息失敗,返回 pdPASS 表示此函數(shù)向消息隊(duì)列發(fā) 送消息成功。
注意:定時(shí)器任務(wù)實(shí)際執(zhí)行消息隊(duì)列發(fā)來的命令依賴于定時(shí)器任務(wù)的優(yōu)先級(jí),如果定時(shí)器任務(wù) 是高優(yōu)先級(jí)會(huì)及時(shí)得到執(zhí)行,如果是低優(yōu)先級(jí),就要等待其余高優(yōu)先級(jí)任務(wù)釋放 CPU 權(quán)才可以得到執(zhí)行。
使用這個(gè)函數(shù)要注意以下問題:
1> 要使用定時(shí)器啟動(dòng)函數(shù)前提是已經(jīng)通過函數(shù) xTimerCreate 成功創(chuàng)建了軟件定時(shí)器。
2> 在 FreeRTOSConfig.h 文件中使能宏定義:
#define configUSE_TIMERS 1
2)在中斷中啟動(dòng)
BaseType_t xTimerStartFromISR(TimerHandle_t xTimer
BaseType_t* pxHigherPriorityTaskWoken);
函數(shù)描述:
XTimer: 軟件定時(shí)器的句柄
pxHigherPriorityTaskWoken: 退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS: 軟件定時(shí)器開啟成功。
pdFAIL: 軟件定時(shí)器開啟失敗。
3.3、停止定時(shí)器
1)在任務(wù)中停止軟件定時(shí)器
BaseType_t xTimerStop(TimerHandle_t xTime,
TickType_t xTicksToWait)
函數(shù)描述:
xTimer: 軟件定時(shí)器的句柄。
xTicksToWait: 阻塞時(shí)間,即停止定時(shí)器最大的等待時(shí)間。
返回值:
pdPASS: 軟件定時(shí)器停止成功
pdFAIL: 軟件定時(shí)器停止失敗
2)在中斷中停止軟件定時(shí)器
xTimerStopFormISR(TimerHandle_t xTimer,
BaseType_t pxHigherPriorityTaskWoken);
函數(shù)描述:
xTimer: 軟件定時(shí)器句柄
pxHigherPriorityTaskWoken: 退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS: 軟件定時(shí)器開啟成功。
pdFAIL: 軟件定時(shí)器開啟失敗。
3.4、復(fù)位定時(shí)器
1)在任務(wù)中復(fù)位
BaseType_t xTimerReset(TimerHandle_t xTimer,
TickType_t xTicksToWait)
函數(shù)描述:
xTimer: 軟件定時(shí)器的句柄。
xTicksToWait: 阻塞時(shí)間,即停止定時(shí)器最大的等待時(shí)間。
返回值:
pdPASS: 軟件定時(shí)器復(fù)位成功
pdFAIL: 軟件定時(shí)器復(fù)位失敗
2)在中斷中復(fù)位
BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken);
函數(shù)描述:
xTimer: 軟件定時(shí)器句柄
pxHigherPriorityTaskWoken: 退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS: 軟件定時(shí)器復(fù)位成功。
pdFAIL: 軟件定時(shí)器復(fù)位失敗。
3.5、查詢定時(shí)器是否已經(jīng)開始運(yùn)行
BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )
查詢定時(shí)器以查看它是活動(dòng)的還是 休眠的 。
如果出現(xiàn)以下情況,計(jì)時(shí)器將處于休眠狀態(tài):
- 已創(chuàng)建但未啟動(dòng)。
- 已過期的計(jì)時(shí)器尚未重新啟動(dòng)。
返回值:
pdFALSE,沒有運(yùn)行。
其他值,運(yùn)行。
4、軟件定時(shí)器使用實(shí)例
創(chuàng)建2個(gè)軟件定時(shí)器,ID號(hào)分別為1、2,這兩個(gè)軟件定時(shí)器使用同一個(gè)回調(diào)函數(shù),在回調(diào)函數(shù)里面讀取定時(shí)器的ID,通過ID識(shí)別定時(shí)器。
1、創(chuàng)建軟件定時(shí)器
TimerHandle_t SoftWaveTimer1; //軟件定時(shí)器1
TimerHandle_t SoftWaveTimer2; //軟件定時(shí)器2
void pxSoftWaveTimer(TimerHandle_t xTimer); //軟件定時(shí)器回調(diào)函數(shù)
SoftWaveTimer1 = xTimerCreate(
"softwaveTimer1",
1000,
pdTRUE,
(void*)1,
pxSoftWaveTimer);
SoftWaveTimer2 = xTimerCreate(
"softwaveTimer2", //定時(shí)器句柄
3000, //定時(shí)器周期
pdTRUE, //周期/單次定時(shí)器
(void*)2, //定時(shí)器ID
pxSoftWaveTimer); //回調(diào)函數(shù)指針
2、定時(shí)器回調(diào)函數(shù)
void pxSoftWaveTimer(TimerHandle_t xTimer)
{
u32 TimerID;
u8 *TimerName;
TimerID = (u32)pvTimerGetTimerID(xTimer); //獲取定時(shí)器ID
TimerName = (u8*)pcTimerGetName( xTimer ); //獲取定時(shí)名字
if(TimerID == 1)
{
printf("軟件定時(shí)器%s運(yùn)行,1S周期\\r\\n",TimerName);
}
if(TimerID == 2)
{
printf("軟件定時(shí)器%s運(yùn)行,2S周期\\r\\n",TimerName);
}
}
3、啟動(dòng)、關(guān)閉定時(shí)器
//task1任務(wù)函數(shù)
void task1_task(void *pvParameters) //prio = 2
{
u8 keyVal = 0;
while(1)
{
keyVal = KEY_Scan(0);
if(keyVal == KEY0_PRES) //啟動(dòng)定時(shí)器
{
xTimerStart(SoftWaveTimer1,0);
xTimerStart(SoftWaveTimer2,0);
}
if(keyVal == KEY1_PRES) //關(guān)閉定時(shí)器
{
xTimerStop(SoftWaveTimer1,0);
xTimerStop(SoftWaveTimer2,0);
}
LED1 ^= 1;
vTaskDelay(200); //延時(shí)n個(gè)時(shí)鐘節(jié)拍
}
}
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1402瀏覽量
40929 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3272瀏覽量
116628 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
485瀏覽量
63435
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32H743是否支持FTP/SNTP?FreeRTOS軟件定時(shí)器不是很準(zhǔn)確怎么解決?
轉(zhuǎn):第19章 FreeRTOS定時(shí)器組
【NUCLEO-F412ZG試用體驗(yàn)】FreeRTOS_軟件定時(shí)器
freertos的軟件定時(shí)器的回調(diào)函數(shù)里面能否調(diào)用其他API函數(shù)?
【轉(zhuǎn)載】AT32 FreeRTOS應(yīng)用筆記
STM32CubeMX FreeRTOS軟件定時(shí)器實(shí)驗(yàn) 精選資料推薦
STM32CubeMX FreeRTOS的軟件定時(shí)器如何實(shí)驗(yàn)
FreeRTOS軟件定時(shí)器編程教程
基于硬件定時(shí)器的軟件定時(shí)器

FreeRTOS軟件定時(shí)器的使用步驟
Free RTOS的軟件定時(shí)器

什么是軟件定時(shí)器?軟件定時(shí)器的實(shí)現(xiàn)原理
FreeRTOS的定時(shí)器設(shè)計(jì)實(shí)現(xiàn)

評(píng)論