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

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

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

3天內不再提示

freeRTOS中的消息郵箱

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

**1、freeRTOS中的消息郵箱 **

freeRTOS實現的消息郵箱是基于任務通知方式而實現的。

采用這種方式有什么優勢呢?

從官方給出的測試報告中有說明到,喚醒由于信號量和事件標志組而處于阻塞態的任務,消息郵箱的速度會提升大約 45%,而且這種方式需要的 RAM 空間更小。

freeRTOS中的消息郵箱使用是比較靈活的,它可以實現二值信號量、計數信號量、事件標志組、消息隊列等通知方式。

但用這種 方式實現信號量和事件標志組也有它的局限性,主要表現在以下兩個方面:

1)任務通知方式僅可以用在只有一個任務等待信號量,消息郵箱或者事件標志組的情況。

2)如果使用任務通知方式實現消息郵箱替代消息隊列時,發送消息的任務是不支持超時等待的。在消息隊列中,當數據已經滿時,是可以等待消息隊列有空間才存新的數據的,但是任務通知方式實現的消 息郵箱就不支持超時等待。

2、有關freeRTOS中的任務控制塊

freeRTOS中的每一個任務都有一個任務控制塊,而任務控制塊本質就是一個結構體變量,用于記錄任務的相關的消息。

而在結構體變量中有一個32位的變量成員ulNotifiedValue是可以專門用于任務通知的。這個變量可以實現計數信號量,二值信號量,事件標志組和消息郵箱(消息郵箱就是消息隊 列長度為 1 的情況)。

ulNotifiedValue 實現的:

1)設置接收任務控制塊中的變量 ulNotifiedValue 可以實現消息郵箱。

2)如果接收任務控制塊中的變量 ulNotifiedValue 還沒有被其接收到,也可以用新數據覆蓋原有數據 ,這就是 覆蓋方式的消息郵箱

3)設置接收任務控制塊中的變量 ulNotifiedValue 的 bit0-bit31 數值可以實現事件標志組。

4)設置接收任務控制塊中的變量 ulNotifiedValue 數值進行加一或者減一操作可以實現計數信號量和二 值信號量。

3、freeRTOS中消息郵箱的管理API函數

消息郵箱實現的相關API函數:

3.1、消息郵箱的創建

freeRTOS中的消息郵箱是用于任務之間的一種通知方式,它的使用是不需要像信號量這樣要專門創建的。是直接發送通知的。

3.2、消息郵箱的發送

1)在任務函數中發送

函數原型:

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, /* 任務句柄 */
                     uint32_t ulValue,           /* 更新任務控制塊中的變量 ulNotifiedValue */
                       eNotifyAction eAction );    /* 任務通知模式設置 */

函數描述:

第 1 個參數是任務句柄。

第 2 個參數是用來更新任務控制塊中的 32 位變量 ulNotifiedValue。

第 3 個參數是任務通知模式設置,支持以下 5 個參數:

圖片

返回值,根據上面第3個參數的說明,將其設置為 :

eSetValueWithoutOverwrite ,有可能返回 pdFALSE,其余所有情況都返回值 pdPASS。

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

1)任務創建后,任務控制塊中的變量 ulNotifiedValue 初始計數值是 0。

2)默認配置此函數可以使用的的宏定義已經在 FreeRTOS.h 文件中使能:

#define configUSE_TASK_NOTIFICATIONS  1

當然,如果不需要使用任務通知功能相關的函數,可以在 FreeRTOSConfig.h 文件中配置此宏定 義為 0 來禁止,這樣創建的每個任務可以節省 8 個字節的需求。

3)此函數是用于任務代碼中調用的,故不可以在中斷服務程序中調用此函數,中斷服務程序中使用的是 xTaskNotifyFromISR。

4)根據 FreeRTOS 的建議,實現二值信號量和計數信號量時使用函數 xTaskNotifyGive()替代此函數 xTaskNotify()。

2)在中斷中發送

函數原型:

BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, /* 任務句柄 */
                    uint32_t ulValue,       /* 更新任務控制塊中的變量 ulNotifiedValue */
                        eNotifyAction eAction,     /* 任務通知模式設置 */
                    BaseType_t *pxHigherPriorityTaskWoken ); /* 高優先級任務是否被喚醒的狀態保存 */

函數描述:

函數 xTaskNotifyFromISR 通過設置任務控制塊中的變量 ulNotifiedValue 可以在中斷服務程序中實現任 務事件標志組,任務計數信號量,任務消息郵箱和任務二值信號量四種方式的消息通知。

第 1 個參數是任務句柄。

第 2 個參數是用來更新任務控制塊中的 32 位變量 ulNotifiedValue。

第 3 個參數是任務通知模式設置,支持以下 5 個參數:

圖片

圖片

第4個參數用于保存是否有高優先級任務準備就緒。如果函數執行完畢后,此參數的數值是 pdTRUE , 說明有高優先級任務要執行,否則沒有。

返回值,根據上面第 3 個參數的說明,將其設置為:

eSetValueWithoutOverwrite ,有可能返回 pdFALSE ,其余所有情況都返回值 pdPASS

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

  1. 任務創建后,任務控制塊中的變量** ulNotifiedValue **初始計數值是 0。
  2. 默認配置此函數可以使用的的宏定義已經在 FreeRTOS.h 文件中使能:
#define  configUSE_TASK_NOTIFICATIONS   1

當然,如果用戶不需要使用任務通知功能相關的函數,可以在 FreeRTOSConfig.h 文件中配置此宏定 義為 0 來禁止,這樣創建的每個任務可以節省 8 個字節的需求。

3)此函數是用于中斷服務程序中調用的,故不可以在任務代碼中調用此函數,任務代碼中使用的是 xTaskNotify。

4)FreeRTOS 的建議,實現二值信號量和計數信號量時使用函數 vTaskNotifyGiveFromISR ()替代 此函數 xTaskNotifyFromISR ()。

3.3、等待消息郵箱

(1)等待消息郵箱

函數原型:

BaseType_t xTaskNotifyWait(
          /* 設置函數執行前清零任務控制塊中變量 ulNotifiedValue 那些位 */
            uint32_t ulBitsToClearOnEntry,
          /*設置函數退出前清零任務控制塊中變量 ulNotifiedValue 那些位 */
            uint32_t ulBitsToClearOnExit,
          /* 保存任務控制塊中的變量 ulNotifiedValue 到指針變量 pulNotifiedValue 所指向的存儲單元 */
            uint32_t *pulNotificationValue,
          /* 等待消息通知的最大等待時間 */
            TickType_t xTicksToWait
              );

函數描述:

函數 xTaskNotifyWait 可以在任務代碼中實現任務事件標志組,任務計數信號量,任務消息郵箱和任務二 值信號量四種方式的消息獲取。

第 1 個參數 ulBitsToClearOnEntry 用于函數執行之前,將任務控制塊中的變量 ulNotifiedValue 進 行如下操作 :

ulNotifiedValue &= ~ulBitsToClearOnEntry

簡單的說就是參數 ulBitsToClearOnEntry 哪個位是 1,那么變量 ulNotifiedValue 的那個位就會被 清零。比如 ulBitsToClearOnEntry = 0x01 表示將變量 ulNotifiedValue 的 bit0 清零,又比如 ulBitsToClearOnEntry = 0xffffffff 表示將變量 ulNotifiedValue 的所有位清零。

第 2 個參數 ulBitsToClearOnExit 用于函數退出前,將任務控制塊中的變量 ulNotifiedValue 進行如 下操作 :

ulNotifiedValue &= ~ ulBitsToClearOnExit

簡單的說就是參數 ulBitsToClearOnExit 哪個位是 1,那么變量 ulNotifiedValue 的那個位就會被清 零。比如 ulBitsToClearOnExit= 0x01 表示將變量 ulNotifiedValue 的 bit0 清零,又比如 ulBitsToClearOnExit= 0xffffffff 表示將變量 ulNotifiedValue 的所有位清零。

第 3 個參數用于將任務控制塊中的變量 ulNotifiedValue 保存到此參數指針所指向的存儲單元。如果 此參數沒有用上,可以將其設置為 NULL。

第 4 個參數是沒有消息時,等待消息的最大等待時間,單位系統時鐘節拍。

返回值,如果成功接收到消息返回 pdTRUE,否則返回 pdFALSE,比如在設置的超時時間內沒有收 到消息。

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

1)任務創建后,任務控制塊中的變量 ulNotifiedValue 初始計數值是 0。

2)默認配置此函數可以使用的的宏定義已經在 FreeRTOS.h 文件中使能:

#define configUSE_TASK_NOTIFICATIONS  1

當然,如果用戶不需要使用任務通知功能相關的函數,可以在 FreeRTOSConfig.h 文件中配置此宏定 義為 0 來禁止,這樣創建的每個任務可以節省 8 個字節的需求。

3)如果用戶將 FreeRTOSConfig.h 文件中的宏定義 INCLUDE_vTaskSuspend 配置為 1 且第 2 個參數配 置為:

portMAX_DELAY ,那么此函數會永久等待直到消息可用。

4)根據 FreeRTOS 的建議,實現二值信號量和計數信號量時使用函數 ulTaskNotifyTake ()替代此函數 xTaskNotifyWait ()。

4、消息郵箱的應用示例

為了更好的說明freeRTOS中的消息郵箱的使用。下面給出了一個簡單的示例。

代碼思路如下:

創建3個任務:start_task,led0_task,led2_task。start_task任務用于創建led0_task和led2_task任務,led0_task任務判斷按鍵的情況,然后根據按鍵按下,消息郵箱發送不同的消息到任務led2_task,在這個任務中改變LED2和LED3的狀態。代碼示例如下:

void start_task(void *pvParameters)
{
    pvParameters =  pvParameters;
    taskENTER_CRITICAL();  //進入臨界區

    xTaskCreate((TaskFunction_t)  led0_task,
                 (const char*)    "led0_task",
                  (uint16_t)      TASK_STK_LED0_SIZE,
                  (void*)         NULL,
                  (UBaseType_t)   TASK_LED0_PRIO,
                  (TaskHandle_t*) &LED0_Handler );

    xTaskCreate((TaskFunction_t)  led2_task,
                 (const char*)    "led2_task",
                  (uint16_t)      TASK_STK_LED2_SIZE,
                  (void*)         NULL,
                  (UBaseType_t)   TASK_LED2_PRIO,
                  (TaskHandle_t*) &LED2_Handler );
    vTaskDelete(StartTask_Handler);   //刪除開始任務
    taskEXIT_CRITICAL();   //退出臨界區
}


void led0_task(void *pvParameters)
{
  //pvParameters =  pvParameters;
  BaseType_t err = pdFALSE;
  uint32_t MboxValue=0;
  for(;;)
  {
     if(gd_eval_key_state_get(KEY_WAKEUP) == RESET)
     {
       MboxValue = 10;
       err = xTaskNotify((TaskHandle_t )  LED2_Handler, //任務句柄,指明往哪個任務發送消息,很重要
                         (uint32_t )      MboxValue,    //發送的消息
                         (eNotifyAction)  eSetValueWithOverwrite //消息發送方式
                        );
     }
     else if(gd_eval_key_state_get(KEY_TAMPER) == RESET)
     {
       MboxValue = 50;
       err = xTaskNotify((TaskHandle_t )  LED2_Handler, //任務句柄
                         (uint32_t )     MboxValue,     //發送的消息
                         (eNotifyAction) eSetValueWithOverwrite //消息發送方式
                        );
     }
     else{}
     gd_eval_led_toggle(LED4);
     vTaskDelay(200);
  }
}


void led2_task(void *pvParameters)
{
  //pvParameters = pvParameters;
  uint32_t notifyValue = 0;
  BaseType_t err;
  for(;;)
  {
     err = xTaskNotifyWait((uint32_t )  0x00,         //進入函數時不清楚bit
                           (uint32_t)   0xffffffff,   //退出函數時清除所有的bit
                           (uint32_t*)  ¬ifyValue, //保存消息的內容
                           (TickType_t) portMAX_DELAY //阻塞時間
                          );
    if(err == pdTRUE)
    {
       switch(notifyValue)
       {
         case 10:
           gd_eval_led_toggle(LED2);
           break;
         case 50:
           gd_eval_led_toggle(LED3);
           break;
         default:
           break;
       }
    }
    vTaskDelay(100);
  }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62271
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8362
  • 消息隊列
    +關注

    關注

    0

    文章

    33

    瀏覽量

    3010
收藏 人收藏

    評論

    相關推薦

    QQ郵箱手機上如何配置POP/IMAP?

    QQ郵箱手機上如何配置POP/IMAP? 以Nokia E71為例     1.在QQ郵箱啟用P
    發表于 02-25 09:53 ?1.2w次閱讀

    FreeRTOS的任務管理

    任務是 FreeRTOS 中最基本的調度單元,它是一段可執行的代碼,可以獨立運行。FreeRTOS 的任務是基于優先級的搶占式調度,優先級高的任務可以搶占優先級低的任務的 CPU 資源。任務的創建、刪除、掛起、恢復、設置優先級
    的頭像 發表于 11-27 17:03 ?1046次閱讀

    用的cube生成的freertos工程,串口和任務通過郵箱通訊,結果任務反應很慢是怎么回事?

    初學freertos。用的cube生成的freertos工程,單片機型號位stm32f103vbt6。 建了三個人物,一個是串口任務,一個是LED每秒翻轉一次,一個是空任務。 串口接收
    發表于 05-08 08:13

    STM32CubeMX FreeRTOS學習[5] 郵箱隊列(Lu)

    STM32CubeMX FreeRTOS學習[5] 郵箱隊列(Lu)
    發表于 09-06 16:36

    轉:第27章 FreeRTOS任務消息郵箱

    本章節為大家講解FreeRTOS消息隊列(消息隊列長度固定為1)的另一種實現方式----基于任務通知(Task Notifications)的消息隊列,這里我們將這種方式實現的消息隊列(消息隊列
    發表于 09-09 07:52

    電子郵箱,電子郵箱是什么意思

    電子郵箱,電子郵箱是什么意思 電子郵箱(E-MAIL BOX)是通過網絡電子郵局為網絡客戶提供的網絡交流電子信息空間。電子郵箱具有存
    發表于 03-06 15:00 ?2.8w次閱讀

    RT-Thread的郵箱服務,包括郵箱工作機制、工作管理方式以及應用示例

    當一個線程從郵箱接收郵件時,如果郵箱是空的,接收線程可以選擇是否等待掛起直到收到新的郵件而喚醒,或可以設置超時時間。當達到設置的超時時間,郵箱依然未收到郵件時,這個選擇超時等待的線程
    的頭像 發表于 03-28 09:38 ?1.3w次閱讀
    RT-Thread的<b class='flag-5'>郵箱</b>服務,包括<b class='flag-5'>郵箱</b>工作機制、工作管理方式以及應用示例

    STM32斷及FreeRTOS中斷優先級配置

    STM32斷,及FreeRTOS中斷優先級配置
    的頭像 發表于 03-04 11:45 ?8957次閱讀
    STM32<b class='flag-5'>中</b>斷及<b class='flag-5'>FreeRTOS</b>中斷優先級配置

    FreeRTOS相對延時與絕對延時的區別

    FreeRTOS相對延時和絕對延時的區別
    的頭像 發表于 03-12 10:32 ?8498次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>中</b>相對延時與絕對延時的區別

    FreeRTOS的API函數功能分析及調用方法

    FreeRTOS的API函數功能分析及調用方法說明。
    發表于 03-26 11:50 ?33次下載

    Freertos 的移植 “FreeRTOSConfig.h“ 的配置

    Freertos 的移植 “FreeRTOSConfig.h“ 的配置
    發表于 12-04 14:06 ?10次下載
    <b class='flag-5'>Freertos</b> 的移植<b class='flag-5'>中</b> “FreeRTOSConfig.h“ 的配置

    基于STM32的FreeRTOS開發(1)----FreeRTOS簡介

    管理功能,可以讓您在嵌入式系統實現多任務環境,這對于涉及多個獨立功能的系統是非常重要的。它還提供了一些高級功能,如事件組、信號量、郵箱等,可用于實現任務之間的同步和通信。 FreeRTOS還提供了
    的頭像 發表于 07-27 09:49 ?1365次閱讀
    基于STM32的<b class='flag-5'>FreeRTOS</b>開發(1)----<b class='flag-5'>FreeRTOS</b>簡介

    FreeRTOS的空閑任務是什么

    空閑任務是 FreeRTOS 必不可少的一個任務,其他 RTOS 類系統也有空閑任務,比如 uC/OS。看名字就知道,空閑任務是處理器空閑的時候去運行的一個任務,當系統沒有其他就緒任務的時候空閑
    的頭像 發表于 07-30 10:55 ?1293次閱讀

    uC/OS-II—郵箱介紹

    在uC/OS-II郵箱是線程(任務)通訊的一種,使用郵箱能夠發送一個指針,當然也可以發送指針大小的數據。
    的頭像 發表于 09-11 15:35 ?1134次閱讀

    SoC的核間通信機制硬件郵箱

    小的硬件隊列,其中包含 VRING ID。 VRING 是共享內存的 SW 隊列,保存兩個 CPU 之間傳遞的實際消息。當收到中斷時,郵箱消息會告知從哪個 VRING 出
    的頭像 發表于 09-13 17:35 ?1095次閱讀
    SoC的核間通信機制硬件<b class='flag-5'>郵箱</b>
    主站蜘蛛池模板: 欧美性色黄大片四虎影视| 国产福利观看| www.xxx.国产| 2022欧美高清中文字幕在线看| 亚洲综合色婷婷| 亚洲狠狠婷婷综合久久久久图片| 国产美女作爱全过程免费视频| 狠狠色丁香九九婷婷综合五月| 综合欧美亚洲| 香蕉色综合| 日本大片成人免费播放| 亚洲色啦啦狠狠网站| 女性私密部位扒开的视频| 成人午夜视频免费看欧美| 手机在线看福利| 日韩三| 欧美在线伊人| 久久国产高清视频| 欧美色图 亚洲| 狠狠五月婷婷| 一级特黄视频| 九九视频只有精品| 牛牛碰在线| 激情六月丁香婷婷| 乱色伦短篇小说| 天天色色网| 你懂的在线观看网址| 日韩一级免费视频| 久久久噜噜噜久久| 久久噜噜噜久久亚洲va久| 日本a级片在线观看| 色综合天天射| 黄视频在线播放| 激情六月婷婷| 免费黄色在线视频| 成人狠狠色综合| 天天看天天摸色天天综合网| 91一区二区三区四区五区| 国内真实下药迷j在线观看| 免费国产黄网站在线观看视频| 一级日本高清视频免费观看|