30-消息隊列

一、消息隊列概述

????????隊列又稱消息隊列,是一種常用于任務間通信的數據結構,隊列可以在任務與任務間、 中斷和任務間傳遞信息,實現了任務接收來自其他任務或中斷的不固定長度的消息,任務能夠從隊列里面讀取消息,當隊列中的消息是空時,讀取消息的任務將被阻塞,用戶還可以指定阻塞的任務時間 xTicksToWait,在這段時間中,如果隊列為空,該任務將保持阻塞狀態以等待隊列數據有效。

????????當隊列中有新消息時,被阻塞的任務會被喚醒并處理新消息;當等待的時間超過了指定的阻塞時間,即使隊列中尚無有效數據,任務也會自動從阻塞態轉為就緒態。

????????消息隊列是一種異步的通信方式。通過消息隊列服務,任務或中斷服務例程可以將一條或多條消息放入消息隊列中。同樣,一個或多個任務可以從消息隊列中獲得消息。當有多個消息發送到消息隊列時,通常是將先進入消息隊列的消息先傳給任務,也就是說,任務先得到的是最先進入消息隊列的 消息,即先進先出原則(FIFO),但是也支持后進先出原則(LIFO)。

特性
FreeRTOS 中使用隊列數據結構實現任務異步通信工作,具有如下特性:
  • 消息支持先進先出方式排隊,支持異步讀寫工作方式。
  • 讀寫隊列均支持超時機制。
  • 消息支持后進先出方式排隊,往隊首發送消息(LIFO)。
  • 可以允許不同長度(不超過隊列節點最大值)的任意類型消息。
  • 一個任務能夠從任意一個消息隊列接收和發送消息。
  • 多個任務能夠從同一個消息隊列接收和發送消息。
  • 當隊列使用結束后,可以通過刪除隊列函數進行刪除。

二、常用函數接口


//頭文件
#include "queue.h"

1.消息隊列創建函數

 QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);功能描述:用于創建一個新的隊列。
參數:
- uxQueueLength-隊列能夠存儲的最大消息單元數目,即隊列長度。
- uxItemSize-隊列中消息單元的大小,以字節為單位,該大小設置非常重要,否則得到的數據不完整。返回值:
成功-如果創建成功則返回一個隊列句柄,用于訪問創建的隊列;
失敗-如果創建不成功則返回NULL,可能原因是創建隊列需要的 RAM 無法分配成功。eg:
//創建消息隊列,Q_LEN為4,Q_SIZE為32
g_queue = xQueueCreate(Q_LEN, Q_SIZE);

2.消息隊列靜態創建函數

QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t *pucQueueStorageBuffer,StaticQueue_t *pxQueueBuffer );功能描述:用于創建一個新的隊列。
參數:
- uxQueueLength-隊列能夠存儲的最大消息單元數目,即隊列長度。
- uxItemSize-隊列中消息單元的大小,以字節為單位。
- pucQueueStorageBuffer-指針,指向一個 uint8_t 類型的數組,數組的大小至少有uxQueueLength* uxItemSize 個字節。當 uxItemSize 為 0 時,pucQueueStorageBuffer 可以為 NULL。
- pxQueueBuffer-指針,指向 StaticQueue_t 類型的變量,該變量用于存儲隊列的數據結構。
返回值:
成功-如果創建成功則返回一個隊列句柄,用于訪問創建的隊列;
失敗-如果創建不成功則返回NULL,可能原因是創建隊列需要的 RAM 無法分配成功。

3.用于向隊列尾部發送一個隊列消息

BaseType_t xQueueSend(QueueHandle_t xQueue,const void * pvItemToQueue,TickType_t xTicksToWait);參數說明:
- xQueue-隊列句柄。
- pvItemToQueue-指針,指向要發送到隊列尾部的隊列消息。
- xTicksToWait-隊列滿時,等待隊列空閑的最大超時時間。
如果隊列滿并且xTicksToWait 被設置成 0,函數立刻返回。超時時間的單位為系統節拍周期,
常量 portTICK_PERIOD_MS 用于輔助計算真實的時間,單位為 ms。
如果 INCLUDE_vTaskSuspend 設置成 1,并且指定延時為 portMAX_DELAY 將導致任務掛起(沒有超時)。返回值:
消息發送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。eg:
//往消息隊列中發送消息
xReturn = xQueueSend(g_queue, send_buff, portMAX_DELAY );
if(xReturn != pdTRUE)
{printf("send failure\r\n");
}

4.在中斷服務程序中用于向隊列尾部發送一個消息

BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);參數說明:
- xQueue-隊列句柄。
- pvItemToQueue-指針,指向要發送到隊列尾部的消息。
- pxHigherPriorityTaskWoken-如果入隊導致一個任務解鎖,
并且解鎖的任務優先級高于當前被中斷的任務,
則將*pxHigherPriorityTaskWoken設置成 pdTRUE,
然后在中斷退出前需要進行一次上下文切換,去執行被喚醒的優先級更高的任務,
可提高實時性。從FreeRTOS V7.3.0 起,
pxHigherPriorityTaskWoken 作為一個可選參數,可以設置為 NULL。返回值:
消息發送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。

5.向隊列隊首發送一個消息

BaseType_t xQueueSendToFront( QueueHandle_t xQueue,const void * pvItemToQueue,TickType_t xTicksToWait );參數說明:
- xQueue-隊列句柄。
- pvItemToQueue-指針,指向要發送到隊列尾部的消息。
- xTicksToWait-隊列滿時,等待隊列空閑的最大超時時間。
如果隊列滿并且xTicksToWait 被設置成 0,函數立刻返回。
超時時間的單位為系統節拍周期,常量 portTICK_PERIOD_MS 用于輔助計算真實的時間,
單位為 ms。如果 INCLUDE_vTaskSuspend 設置成 1,
并且指定延時為 portMAX_DELAY 將導致任務無限阻塞(沒有超時)。返回值:
消息發送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。

6.在中斷服務程序中向消息隊列隊首發送一個消息

BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);參數說明:
- xQueue-隊列句柄。
- pvItemToQueue-指針,指向要發送到隊首的消息。
- pxHigherPriorityTaskWoken-如果入隊導致一個任務解鎖,
并且解鎖的任務優先級高于當前被中斷的任務,
則將*pxHigherPriorityTaskWoken設置成 pdTRUE,
然后在中斷退出前需要進行一次上下文切換,去執行被喚醒的優先級更高的任務。
從FreeRTOS V7.3.0 起,pxHigherPriorityTaskWoken 作為一個可選參數,可以設置為 NULL。返回值:
消息發送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。

7.從一個隊列中接收消息,并把接收的消息從隊列中刪除

BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait);參數說明:
- xQueue-隊列句柄。
- pvBuffer-指針,指向接收到要保存的數據。
- xTicksToWait-隊列空時,阻塞超時的最大時間。如果該參數設置為 0,
函數立刻返回。超時時間的單位為系統節拍周期,
常量 portTICK_PERIOD_MS 用 于輔助計算真實的時間,單位為 ms。
如果 INCLUDE_vTaskSuspend 設 置成 1,并且指定延時為 portMAX_DELAY 
將導致任務無限阻塞(沒有超時)。返回值:
隊列項接收成功返回 pdTRUE,否則返回 pdFALSE。若接收完消息,不想刪除,可以使用xQueuePeek函數。eg:
//阻塞等待消息
xReturn = xQueueReceive(g_queue, recv_buff, portMAX_DELAY);
if(xReturn != pdTRUE)
{printf("send failure\r\n");
}//記得給緩沖區清零
memset(recv_buff, 0, sizeof (recv_buff));

8.在中斷中從一個隊列中接收消息,并從隊列中刪除該消息

BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxHigherPriorityTaskWoken);參數說明:
- xQueue-隊列句柄。
- pvBuffer-pxHigherPriorityTaskWoken
- pxHigherPriorityTaskWoken-在使用之前必須初始化成 pdFALSE。
如果API函數(即xQueueReceiveFromISR)導致一個任務解鎖,
并且解鎖的任務優先級高于當前運行的任務,則API函數(即xQueueReceiveFromISR)將*pxHigherPriorityTaskWoken設置成pdTRUE。在中斷退出前,觸發一次任務切換。pxHigherPriorityTaskWoken 作為一個可選參數,可以設置為NULL。返回值:
隊列項接收成功返回 pdTRUE,否則返回 pdFALSE。
若接收完消息,不想刪除,可以使用xQueuePeekFromISR函數。

三、示例代碼

1、任務與任務之間的源碼

https://download.csdn.net/download/m0_63622771/90897081

2、任務與中斷之間的源碼

https://download.csdn.net/download/m0_63622771/90897085

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82280.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI Agent開發第74課-解構AI偽需求的魔幻現實主義

開篇 ??在之前的系列中我們狂炫了AI Agent的各種高端操作(向量數據庫聯動、多模態感知、動態工作流等…),仿佛每個程序員都能用LLM魔法點石成金?。 但今天咱們要潑一盆透心涼的冷水——當企業把AI當成萬能膠水強行粘合所有需求時,連電風扇都能被玩出量子糾纏的魔幻現實…

低代碼AI開發新趨勢:Dify平臺化開發實戰

在人工智能快速發展的今天,AI應用的開發方式也在不斷演變。從傳統的手寫代碼到如今的低代碼甚至零代碼開發,技術的進步讓更多的非專業開發者也能輕松上手。本文將帶你走進Dify平臺化開發的世界,探索如何通過這一強大的低代碼AI開發平臺&#…

開發積累總結

export default 和export const 均用于從模塊導出函數、對象或原始值,區別在于: export default:一個文件中只能有一個,為默認導出,在引用時指定名字。 export const:一個文件中有多個,為命名…

【TCP/IP協議族詳解】

目錄 第1層 鏈路/網絡接口層—幀(Frame) 1. 鏈路層功能 2. 常見協議 2.1. ARP(地址解析協議) 3. 常見設備 第2層 網絡層—數據包(Packet) 1. 網絡層功能 2. 常見協議 2.1. ICMP(互聯網…

vocabulary in program

編號意思(英譯中)音標單詞1n. 稀薄;稀罕;珍奇/?re?r?sn/rareness2n.登記表,注冊簿;注冊員;(人或樂器的)聲區,音區;(適合特定場合使…

整平機技術進階:從原理到實戰的深度解析

一、整平機的力學原理與數學模型 整平機的核心在于通過材料塑性變形消除內應力,其力學過程可簡化為以下模型: 彈塑性變形理論 當材料通過輥輪時,表層受拉應力,芯部受壓應力,超過屈服強度后產生永久變形。 關鍵公式&a…

【b站計算機拓荒者】【2025】微信小程序開發教程 - chapter1 初識小程序 - 3項目目錄結構4快速上手

3 項目目錄結構 3.1 項目目錄結構 3.1.1 目錄介紹 # 1 項目主配置文件,在項目根路徑下,控制整個項目的-app.js # 小程序入口文件,小程序啟動,會執行此js-app.json # 小程序全局配置文件,配置小程序導航欄顏色等信息…

427. 建立四叉樹

https://leetcode.cn/problems/construct-quad-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150思路:這題乍一看很復雜但是只要讀懂題找到規律就會發現其實很簡單 四叉樹的構造規律: 1. 如果一個區域的值全相等,那么這個…

IDEA中創建SpringBoot項目沒有Java8

IDEA中創建SpringBoot項目沒有Java8 文章目錄 IDEA中創建SpringBoot項目沒有Java8一:解決辦法 很久沒單獨創建springboot項目,今天使用idea的Spring Initializr 創建 Spring Boot項目時,發現java版本里,無法選擇jdk1.8,只有17、21、22,所以本文介紹了使用Spring Ini…

聊一聊手動測試與探索性測試的區別

目錄 一 定義與目標 手動測試 探索性測試 二 執行方式 手動測試 探索性測試 三 測試重點及計劃性 手動測試 探索性測試 四 測試效率及成本 手動測試 探索性測試 五 優缺點對比 六 關鍵卻別與總結 七 適應場景 手動測試 探索性測試 八 實際應用與結合 在我們進…

Spring用到的設計模式

Spring框架中廣泛應用了多種設計模式,以提升代碼的靈活性和可維護性。 工廠模式:BeanFactory,整個 IoC 容器就是一個工廠。 單例模式:Spring 管理的 Bean 默認都是單例的。 模版方法:如 RedisTemplate、JdbcTemplat…

Mybatis(2)

sql注入攻擊 SQL注入攻擊是一種常見的網絡安全威脅,攻擊者通過在輸入字段中插入惡意SQL代碼,繞過應用程序的安全機制,直接操縱數據庫。 SQL注入的原理 SQL注入利用應用程序未對用戶輸入進行充分過濾或轉義的漏洞。當用戶輸入被直接拼接到S…

【Node.js】高級主題

個人主頁:Guiat 歸屬專欄:node.js 文章目錄 1. Node.js 高級主題概覽1.1 高級主題架構圖 2. 事件循環與異步編程深度解析2.1 事件循環機制詳解事件循環階段詳解 2.2 異步編程模式演進高級異步模式實現 3. 內存管理與性能優化3.1 V8 內存管理機制內存監控…

冰箱熱交換的原理以及如何加氟

冰箱如何加氟: 氟利昂被節流裝置降壓后,進入冰箱的蒸發器,此時它處于低溫低壓液態狀態。在冰箱內部(例如 0C 或 -10C):它很容易氣化(因為其沸點很低)在氣化過程中吸收周圍熱量。 1…

WordPress多語言插件安裝與使用教程

WordPress多語言插件GTranslate的使用方法 在wordpress網站后臺搜索多語言插件GTranslate并安裝,安裝完成、用戶插件后開始設置,以下為設置方法: 1、先在后臺左側找到Gtranslate,進入到設置界面 2、選擇要顯示的形式&#xff0c…

DELL EMC PowerStore BBU更換手冊

寫在前面 上周給客戶賣了一個BBU電池,客戶要寫一個更換方案。順利完成了更換,下面就把這個更換方案給大家share出來,以后客戶要寫,您就Ctrlc 和Ctrlv就可以了。 下面的步驟是最理想的方式,中間沒有任何的問題&#xff…

FastMCP:為大語言模型構建強大的上下文和工具服務

FastMCP:為大語言模型構建強大的上下文和工具服務 在人工智能快速發展的今天,大語言模型(LLM)已經成為許多應用的核心。然而,如何讓這些模型更好地與外部世界交互,獲取實時信息,執行特定任務&a…

CMake基礎:CMakeLists.txt 文件結構和語法

目錄 1.CMakeLists.txt基本結構 2.核心語法規則 3.關鍵命令詳解 4.常用預定義變量 5.變量和緩存 6.變量作用域與傳遞 7.注意事項 1.CMakeLists.txt基本結構 CMakeLists.txt 是 CMake 構建系統的核心配置文件,采用命令式語法組織項目結構和編譯流程。主要用于…

戰略-2.1 -戰略分析(PEST/五力模型/成功關鍵因素)

戰略分析路徑,先宏觀(PEST)、再產業(產品生命周期、五力模型、成功關鍵因素)、再競爭對手分析、最后企業內部分析。 本文介紹:PEST、產品生命周期、五力模型、成功關鍵因素、產業內的戰略群組 一、宏觀環境…

深入理解設計模式:工廠模式、單例模式

深入理解設計模式:工廠模式、單例模式 設計模式是軟件開發中解決常見問題的可復用方案。本文將詳細介紹兩種種重要的創建型設計模式:工廠模式、單例模式,并提供Java實現示例。 一、工廠模式 工廠模式是一種創建對象的設計模式,…