0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

freeRTOS軟件定時(shí)器的使用

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

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

1、 freeRTOS中啟用定時(shí)器

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):

  1. 已創(chuàng)建但未啟動(dòng)。
  2. 已過期的計(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(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
收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    STM32H743是否支持FTP/SNTP?FreeRTOS軟件定時(shí)器不是很準(zhǔn)確怎么解決?

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

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

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

    【NUCLEO-F412ZG試用體驗(yàn)】FreeRTOS_軟件定時(shí)器

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

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

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

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

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

    STM32CubeMX FreeRTOS軟件定時(shí)器實(shí)驗(yàn) 精選資料推薦

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

    STM32CubeMX FreeRTOS軟件定時(shí)器如何實(shí)驗(yàn)

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

    freertos軟件定時(shí)器最高定時(shí)精度可以達(dá)到多少?

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

    FreeRTOS軟件定時(shí)器編程教程

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

    基于硬件定時(shí)器軟件定時(shí)器

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

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

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

    Free RTOS的軟件定時(shí)器

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

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

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

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

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

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

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

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品