0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

freeRTOS軟件定時器的使用

汽車電子技術(shù) ? 來源:嵌入式之入坑筆記 ? 作者: 嵌入式之入坑筆記 ? 2023-02-10 13:55 ? 次閱讀

本文的內(nèi)容結(jié)構(gòu)如下:

1、 freeRTOS中啟用定時器

2、freeRTOS的定時器種類

2.1、單次定時器

2.2、周期定時器

3、freeRTOS 軟件定時器的API函數(shù)

3.1、創(chuàng)建軟件定時器

3.2、啟動軟件定時器

3.3、停止定時器

3.4、復位定時器

3.5、查詢定時器是否已經(jīng)開始運行

4、軟件定時器使用實例

freeRTOS中加入了軟件定時器這個功能組件,是一個可選的、不屬于freeRTOS內(nèi)核的功能,由定時器服務(wù)(其實就是一個定時器任務(wù))來提供。

軟件定時器是當設(shè)定一個定時時間,當達到設(shè)定的時間之后就會執(zhí)行指定的功能函數(shù),而這個功能函數(shù)就叫做 回調(diào)函數(shù) 。

也就是說回調(diào)函數(shù)的兩次執(zhí)行間隔叫做定時器的定時周期。

回調(diào)函數(shù): 回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。

1、 freeRTOS中啟用定時器

在freeRTOS中要使用軟件定時器的話,需要在配置文件freeRTOSConfig.h中設(shè)置相應(yīng)的宏,如下:

#define configUSE_TIMERS        1  //使能軟件定時器
#define configTIMER_TASK_PRIORITY    2    // 軟件定時器的優(yōu)先級
#define configTIMER_QUEUE_LENGTH    10    // 軟件定時器的隊列長度
#define configTIMER_TASK_STACK_DEPTH  (configMINIMAL_STACK_SIZE * 2)    // 軟件定時器的堆??臻g大?。▎挝皇亲郑?/span>

2、freeRTOS的定時器種類

2.1、單次定時器

單次定時器定時時間到了就執(zhí)行一次回調(diào)函數(shù),之后不會再執(zhí)行,只有在再次重新啟動的時候才會再執(zhí)行一次。

2.2、周期定時器

周期定時器根據(jù)設(shè)定的時間周期地執(zhí)行的。它一旦啟動以后,每執(zhí)行一次完一次回調(diào)函數(shù)以后定時器會自動重啟,回調(diào)函數(shù)會周期性的執(zhí)行。

3、freeRTOS 軟件定時器的API函數(shù)

3.1、創(chuàng)建軟件定時器

TimerHandle_t xTimerCreate
(
                const char * const pcTimerName,   /* 定時器名字 */
                const TickType_t xTimerPeriod,     /* 定時器周期 */
                const UBaseType_t uxAutoReload,   /* 選擇單次模式或者周期模式 */
                void  * const pvTimerID,       /* 定時器 ID */
                TimerCallbackFunction_t pxCallbackFunction ); /* 定時器回調(diào)函數(shù) */

函數(shù)描述:

函數(shù) xTimerCreate 用于創(chuàng)建軟件定時器。

1)第 1 個參數(shù): 定時器名字,一般用于調(diào)試,方便識別不同的定時器。

2)第 2 個參數(shù): 定時器周期,單位是系統(tǒng)時鐘節(jié)拍。

3)第 3 個參數(shù): 選擇定時器是周期模式還是單次模式。若參數(shù)為 pdTRUE ,則表示選擇周期模式,若參數(shù)為 pdFALSE ,則表示選擇單次模式。

4)第 4 個參數(shù): 定時器的 ID。當創(chuàng)建多個不同的定時器,但又使用同一個回調(diào)函數(shù)時,在回調(diào)函數(shù)中就可以通過不同的 ID 號來區(qū)分不同的定時器。

5)第 5 個參數(shù): 定時器的回調(diào)函數(shù)。

返回值: 創(chuàng)建成功返回定時器的句柄,失敗會返回 NULL。

創(chuàng)建一個單次觸發(fā)的軟件定時器示例如下:

TimerHandle_t singalTIMERS;   //單次定時器
    void singalTimersFunc(TimerHandle_t xTimers); //單次定時器回調(diào)函數(shù)
    /*創(chuàng)建單次定時器*/
    singalTIMERS = xTimerCreate(
                                  "singalTIMERS",  //軟件定時器的名字
                                  1000,            //定時周期,單位是時鐘節(jié)拍數(shù)
                                  pdFALSE,         //定時器模式,pdTRUE為周期定時器,pdFALSE為單次定時器
                                  (void*)1,        //定時器的ID號
                                  singalTimersFunc //定時器回調(diào)函數(shù)
                                );//

3.2、啟動軟件定時器

1)在任務(wù)中啟動

BaseType_t xTimerStart( TimerHandle_t xTimer,     /* 定時器句柄 */
                  TickType_t xBlockTime );  /* 成功啟動定時器前的最大等待時間設(shè)置,單位系統(tǒng)時鐘節(jié)拍 */

函數(shù)描述:

函數(shù) xTimerStart 用于啟動軟件定時器。

**1> **第 1 個參數(shù)是定時器句柄。

2> 第 2 個參數(shù)是成功啟動定時器前的最大等待時間設(shè)置,單位系統(tǒng)時鐘節(jié)拍。這是定時器組的大部分 API 函數(shù)不是直接運行的,而是通過消息隊列給定時器任務(wù)發(fā)消息來實現(xiàn)的,此參 數(shù)設(shè)置的等待時間就是當消息隊列已經(jīng)滿的情況下,等待消息隊列有空間時的最大等待時間。

返回值: 返回 pdFAIL 表示此函數(shù)向消息隊列發(fā)送消息失敗,返回 pdPASS 表示此函數(shù)向消息隊列發(fā) 送消息成功。

注意:定時器任務(wù)實際執(zhí)行消息隊列發(fā)來的命令依賴于定時器任務(wù)的優(yōu)先級,如果定時器任務(wù) 是高優(yōu)先級會及時得到執(zhí)行,如果是低優(yōu)先級,就要等待其余高優(yōu)先級任務(wù)釋放 CPU 權(quán)才可以得到執(zhí)行。

使用這個函數(shù)要注意以下問題:

1> 要使用定時器啟動函數(shù)前提是已經(jīng)通過函數(shù) xTimerCreate 成功創(chuàng)建了軟件定時器。

2> 在 FreeRTOSConfig.h 文件中使能宏定義:

#define configUSE_TIMERS 1

2)在中斷中啟動

BaseType_t  xTimerStartFromISR(TimerHandle_t  xTimer
                           BaseType_t*    pxHigherPriorityTaskWoken);

函數(shù)描述:

XTimer: 軟件定時器的句柄

pxHigherPriorityTaskWoken: 退出此函數(shù)時是否要進行任務(wù)切換

返回值:

pdPASS: 軟件定時器開啟成功。

pdFAIL: 軟件定時器開啟失敗。

3.3、停止定時器

1)在任務(wù)中停止軟件定時器

BaseType_t xTimerStop(TimerHandle_t xTime,
               TickType_t xTicksToWait)

函數(shù)描述:

xTimer: 軟件定時器的句柄。

xTicksToWait: 阻塞時間,即停止定時器最大的等待時間。

返回值:

pdPASS: 軟件定時器停止成功

pdFAIL: 軟件定時器停止失敗

2)在中斷中停止軟件定時器

xTimerStopFormISR(TimerHandle_t xTimer,
            BaseType_t pxHigherPriorityTaskWoken);

函數(shù)描述:

xTimer: 軟件定時器句柄

pxHigherPriorityTaskWoken: 退出此函數(shù)時是否要進行任務(wù)切換

返回值:

pdPASS: 軟件定時器開啟成功。

pdFAIL: 軟件定時器開啟失敗。

3.4、復位定時器

1)在任務(wù)中復位

BaseType_t xTimerReset(TimerHandle_t  xTimer,
              TickType_t xTicksToWait)

函數(shù)描述:

xTimer: 軟件定時器的句柄。

xTicksToWait: 阻塞時間,即停止定時器最大的等待時間。

返回值:

pdPASS: 軟件定時器復位成功

pdFAIL: 軟件定時器復位失敗

2)在中斷中復位

BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,
                   BaseType_t *pxHigherPriorityTaskWoken);

函數(shù)描述:

xTimer: 軟件定時器句柄

pxHigherPriorityTaskWoken: 退出此函數(shù)時是否要進行任務(wù)切換

返回值:

pdPASS: 軟件定時器復位成功。

pdFAIL: 軟件定時器復位失敗。

3.5、查詢定時器是否已經(jīng)開始運行

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )

查詢定時器以查看它是活動的還是 休眠的

如果出現(xiàn)以下情況,計時器將處于休眠狀態(tài):

  1. 已創(chuàng)建但未啟動。
  2. 已過期的計時器尚未重新啟動。

返回值:

pdFALSE,沒有運行。

其他值,運行。

4、軟件定時器使用實例

創(chuàng)建2個軟件定時器,ID號分別為1、2,這兩個軟件定時器使用同一個回調(diào)函數(shù),在回調(diào)函數(shù)里面讀取定時器的ID,通過ID識別定時器。

1、創(chuàng)建軟件定時器
TimerHandle_t SoftWaveTimer1;            //軟件定時器1
TimerHandle_t SoftWaveTimer2;            //軟件定時器2
void pxSoftWaveTimer(TimerHandle_t xTimer); //軟件定時器回調(diào)函數(shù)


    SoftWaveTimer1 = xTimerCreate(
                                 "softwaveTimer1",
                                 1000,
                                 pdTRUE,
                                 (void*)1,
                                 pxSoftWaveTimer);
     SoftWaveTimer2 = xTimerCreate(
                                 "softwaveTimer2",  //定時器句柄
                                 3000,              //定時器周期
                                 pdTRUE,            //周期/單次定時器
                                 (void*)2,          //定時器ID
                                 pxSoftWaveTimer);  //回調(diào)函數(shù)指針


2、定時器回調(diào)函數(shù)
void pxSoftWaveTimer(TimerHandle_t xTimer)
{

    u32 TimerID;
    u8  *TimerName;
    TimerID   = (u32)pvTimerGetTimerID(xTimer);   //獲取定時器ID
    TimerName = (u8*)pcTimerGetName( xTimer );    //獲取定時名字
    if(TimerID == 1)
    {
        printf("軟件定時器%s運行,1S周期\\r\\n",TimerName);
    }
    if(TimerID == 2)
    {
        printf("軟件定時器%s運行,2S周期\\r\\n",TimerName);
    }
}


3、啟動、關(guān)閉定時器
//task1任務(wù)函數(shù)
void task1_task(void *pvParameters)   //prio = 2
{
    u8 keyVal = 0;
    while(1)
    {
        keyVal = KEY_Scan(0);
        if(keyVal == KEY0_PRES)         //啟動定時器
        {
           xTimerStart(SoftWaveTimer1,0);
           xTimerStart(SoftWaveTimer2,0);
        }
        if(keyVal == KEY1_PRES)         //關(guān)閉定時器
        {
           xTimerStop(SoftWaveTimer1,0);
           xTimerStop(SoftWaveTimer2,0);
        }
        LED1 ^= 1;
        vTaskDelay(200);   //延時n個時鐘節(jié)拍
    }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1360

    瀏覽量

    40185
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3231

    瀏覽量

    114326
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61915
收藏 人收藏

    評論

    相關(guān)推薦

    STM32H743是否支持FTP/SNTP?FreeRTOS軟件定時器不是很準確怎么解決?

    大家好, 目前在用STM32H743ZIT6,跑FreeRTOS系統(tǒng),幫忙確認下是否支持FTP/SNTP?另外FreeRTOS軟件定時器不是很準確,有沒有解決方案或者參考設(shè)置?上述程序
    發(fā)表于 04-26 06:50

    轉(zhuǎn):第19章 FreeRTOS定時器

    第19章FreeRTOS定時器組 本章節(jié)為大家講解FreeRTOS支持的定時器組,或者叫軟件定時器
    發(fā)表于 09-03 13:13

    【NUCLEO-F412ZG試用體驗】FreeRTOS_軟件定時器

    FreeRTOS軟件定時器不是很準,如果要精確定時建議用硬件定時器,這一點ST的相關(guān)官方應(yīng)用手冊是有探究的。本例程,實在上一期試用報告的基
    發(fā)表于 12-20 20:01

    freertos軟件定時器的回調(diào)函數(shù)里面能否調(diào)用其他API函數(shù)?

    freertos軟件定時器的回調(diào)函數(shù)里面能否調(diào)用其他API函數(shù)?比如在回調(diào)函數(shù)里添加xSemaphoreGive(BinarySemaphore);/* 處理定時器1任務(wù)
    發(fā)表于 07-28 08:00

    【轉(zhuǎn)載】AT32 FreeRTOS應(yīng)用筆記

    .......................................................93FreeRTOS 軟件定時器組 .............................. 100
    發(fā)表于 08-16 11:56

    STM32CubeMX FreeRTOS軟件定時器實驗 精選資料推薦

    系統(tǒng):linux mint xfce 64bit 軟件: 1、SW4STM32 2、STM32CubeMX 關(guān)于這兩個軟件在linux的安裝教程請看我另一篇博文Linux/Windows配置
    發(fā)表于 08-04 09:02

    STM32CubeMX FreeRTOS軟件定時器如何實驗

    STM32CubeMX FreeRTOS軟件定時器如何實驗
    發(fā)表于 10-13 08:29

    freertos軟件定時器最高定時精度可以達到多少?

    可以做到1ms的定時
    發(fā)表于 10-15 08:05

    FreeRTOS軟件定時器編程教程

    軟件定時器本質(zhì)上是一個周期性的任務(wù)或單次執(zhí)行任務(wù)。
    發(fā)表于 11-17 13:21 ?1835次閱讀

    基于硬件定時器軟件定時器

    概括硬件定時器很精確,軟件定時器無論如何都有延遲,主要用在不需要精確定時的地方,而且軟件定時比較
    發(fā)表于 11-25 09:51 ?8次下載
    基于硬件<b class='flag-5'>定時器</b>的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    FreeRTOS軟件定時器的使用步驟

    FreeRTOS軟件Timer有兩種:重復性的和一次性的Timer。軟件定時器使用有3步。
    的頭像 發(fā)表于 09-14 15:22 ?1836次閱讀

    Free RTOS的軟件定時器

    軟件定時器FreeRTOS中的一個重要模塊,使用軟件定時器可以方便的實現(xiàn)一些與超時或周期性相關(guān)的功能。
    的頭像 發(fā)表于 02-10 15:53 ?2262次閱讀
    Free RTOS的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    什么是軟件定時器?軟件定時器的實現(xiàn)原理

    軟件定時器是用程序模擬出來的定時器,可以由一個硬件定時器模擬出成千上萬個軟件定時器,這樣程序在需
    的頭像 發(fā)表于 05-23 17:05 ?2649次閱讀

    FreeRTOS定時器設(shè)計實現(xiàn)

    定時器用于根據(jù)系統(tǒng)時啟動特定的函數(shù),執(zhí)行相應(yīng)的任務(wù)。FreeRTOS定時器可以配置啟動一次或者間隔一定時間執(zhí)行。
    的頭像 發(fā)表于 07-25 15:28 ?1849次閱讀
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>定時器</b>設(shè)計實現(xiàn)

    如何實現(xiàn)一個軟件定時器?

    在Linux,uC/OS,FreeRTOS等操作系統(tǒng)中,都帶有軟件定時器,原理大同小異。典型的實現(xiàn)方法是:通過一個硬件定時器產(chǎn)生固定的時鐘節(jié)拍,每次硬件
    的頭像 發(fā)表于 04-29 11:00 ?567次閱讀