在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

freeRTOS軟件定時器的使用

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

本文的內容結構如下:

1、 freeRTOS中啟用定時器

2、freeRTOS的定時器種類

2.1、單次定時器

2.2、周期定時器

3、freeRTOS 軟件定時器的API函數

3.1、創建軟件定時器

3.2、啟動軟件定時器

3.3、停止定時器

3.4、復位定時器

3.5、查詢定時器是否已經開始運行

4、軟件定時器使用實例

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

軟件定時器是當設定一個定時時間,當達到設定的時間之后就會執行指定的功能函數,而這個功能函數就叫做 回調函數

也就是說回調函數的兩次執行間隔叫做定時器的定時周期。

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

1、 freeRTOS中啟用定時器

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

#define configUSE_TIMERS        1  //使能軟件定時器
#define configTIMER_TASK_PRIORITY    2    // 軟件定時器的優先級
#define configTIMER_QUEUE_LENGTH    10    // 軟件定時器的隊列長度
#define configTIMER_TASK_STACK_DEPTH  (configMINIMAL_STACK_SIZE * 2)    // 軟件定時器的堆??臻g大小(單位是字)

2、freeRTOS的定時器種類

2.1、單次定時器

單次定時器定時時間到了就執行一次回調函數,之后不會再執行,只有在再次重新啟動的時候才會再執行一次。

2.2、周期定時器

周期定時器根據設定的時間周期地執行的。它一旦啟動以后,每執行一次完一次回調函數以后定時器會自動重啟,回調函數會周期性的執行。

3、freeRTOS 軟件定時器的API函數

3.1、創建軟件定時器

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

函數描述:

函數 xTimerCreate 用于創建軟件定時器。

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

2)第 2 個參數: 定時器周期,單位是系統時鐘節拍。

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

4)第 4 個參數: 定時器的 ID。當創建多個不同的定時器,但又使用同一個回調函數時,在回調函數中就可以通過不同的 ID 號來區分不同的定時器。

5)第 5 個參數: 定時器的回調函數。

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

創建一個單次觸發的軟件定時器示例如下:

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

3.2、啟動軟件定時器

1)在任務中啟動

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

函數描述:

函數 xTimerStart 用于啟動軟件定時器。

**1> **第 1 個參數是定時器句柄。

2> 第 2 個參數是成功啟動定時器前的最大等待時間設置,單位系統時鐘節拍。這是定時器組的大部分 API 函數不是直接運行的,而是通過消息隊列給定時器任務發消息來實現的,此參 數設置的等待時間就是當消息隊列已經滿的情況下,等待消息隊列有空間時的最大等待時間。

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

注意:定時器任務實際執行消息隊列發來的命令依賴于定時器任務的優先級,如果定時器任務 是高優先級會及時得到執行,如果是低優先級,就要等待其余高優先級任務釋放 CPU 權才可以得到執行。

使用這個函數要注意以下問題:

1> 要使用定時器啟動函數前提是已經通過函數 xTimerCreate 成功創建了軟件定時器。

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

#define configUSE_TIMERS 1

2)在中斷中啟動

BaseType_t  xTimerStartFromISR(TimerHandle_t  xTimer
                           BaseType_t*    pxHigherPriorityTaskWoken);

函數描述:

XTimer: 軟件定時器的句柄

pxHigherPriorityTaskWoken: 退出此函數時是否要進行任務切換

返回值:

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

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

3.3、停止定時器

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

BaseType_t xTimerStop(TimerHandle_t xTime,
               TickType_t xTicksToWait)

函數描述:

xTimer: 軟件定時器的句柄。

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

返回值:

pdPASS: 軟件定時器停止成功

pdFAIL: 軟件定時器停止失敗

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

xTimerStopFormISR(TimerHandle_t xTimer,
            BaseType_t pxHigherPriorityTaskWoken);

函數描述:

xTimer: 軟件定時器句柄

pxHigherPriorityTaskWoken: 退出此函數時是否要進行任務切換

返回值:

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

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

3.4、復位定時器

1)在任務中復位

BaseType_t xTimerReset(TimerHandle_t  xTimer,
              TickType_t xTicksToWait)

函數描述:

xTimer: 軟件定時器的句柄。

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

返回值:

pdPASS: 軟件定時器復位成功

pdFAIL: 軟件定時器復位失敗

2)在中斷中復位

BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,
                   BaseType_t *pxHigherPriorityTaskWoken);

函數描述:

xTimer: 軟件定時器句柄

pxHigherPriorityTaskWoken: 退出此函數時是否要進行任務切換

返回值:

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

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

3.5、查詢定時器是否已經開始運行

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )

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

如果出現以下情況,計時器將處于休眠狀態:

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

返回值:

pdFALSE,沒有運行。

其他值,運行。

4、軟件定時器使用實例

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

1、創建軟件定時器
TimerHandle_t SoftWaveTimer1;            //軟件定時器1
TimerHandle_t SoftWaveTimer2;            //軟件定時器2
void pxSoftWaveTimer(TimerHandle_t xTimer); //軟件定時器回調函數


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


2、定時器回調函數
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、啟動、關閉定時器
//task1任務函數
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)         //關閉定時器
        {
           xTimerStop(SoftWaveTimer1,0);
           xTimerStop(SoftWaveTimer2,0);
        }
        LED1 ^= 1;
        vTaskDelay(200);   //延時n個時鐘節拍
    }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40289
  • 定時器
    +關注

    關注

    23

    文章

    3248

    瀏覽量

    114792
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62172
收藏 人收藏

    評論

    相關推薦

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

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

    轉:第19章 FreeRTOS定時器

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

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

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

    freertos軟件定時器的回調函數里面能否調用其他API函數?

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

    【轉載】AT32 FreeRTOS應用筆記

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

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

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

    STM32CubeMX FreeRTOS軟件定時器如何實驗

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

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

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

    FreeRTOS軟件定時器編程教程

    軟件定時器本質上是一個周期性的任務或單次執行任務。
    發表于 11-17 13:21 ?1860次閱讀

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

    概括硬件定時器很精確,軟件定時器無論如何都有延遲,主要用在不需要精確定時的地方,而且軟件定時比較
    發表于 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步。
    的頭像 發表于 09-14 15:22 ?1894次閱讀

    Free RTOS的軟件定時器

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

    什么是軟件定時器?軟件定時器的實現原理

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

    FreeRTOS定時器設計實現

    定時器用于根據系統時啟動特定的函數,執行相應的任務。FreeRTOS定時器可以配置啟動一次或者間隔一定時間執行。
    的頭像 發表于 07-25 15:28 ?2017次閱讀
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>定時器</b>設計實現

    如何實現一個軟件定時器?

    在Linux,uC/OS,FreeRTOS等操作系統中,都帶有軟件定時器,原理大同小異。典型的實現方法是:通過一個硬件定時器產生固定的時鐘節拍,每次硬件
    的頭像 發表于 04-29 11:00 ?652次閱讀
    主站蜘蛛池模板: 一区卡二区卡三区卡视频| xxⅹ丰满妇女与善交| 一级aaa毛片| 成人夜色| 亚洲伊人久久大香线蕉综合图片| 免费在线看黄色| 天天干天天综合| 日不卡| 欧美综合国产精品日韩一| 午夜一区二区在线观看| avtt天堂网 手机资源| 色五月天天| 午夜精品一区二区三区在线观看| 美女啪啪91| 三级毛片免费| 天天看天天做| 美女扒开尿口给男人看的让| 免费的三级网站| 加勒比精品视频| 亚瑟 国产精品| 成人亚洲视频| 好硬好湿好爽再深一点h视频| 四虎精品免费永久在线| 香蕉视频在线观看国产| 亚洲不卡免费视频| 美女视频黄的免费视频网页| 久久99操| 四虎最新永久在线精品免费| 午夜视频在线观看免费高清| 九九热re| 丁香综合五月| 亚洲免费网站在线观看| 久久精品免费视频观看| 港台无码| 三及毛片| 精品在线小视频| 色婷婷精品| 美女久久久| 天堂网在线资源www最新版| 天天色踪合合| 亚洲人成综合网站在线|