14.FreeRTOS 消息緩存 Message Buffer

FreeRTOS 消息緩存(Message Buffer)的使用

介紹


在實時操作系統(RTOS)中,任務之間的通信是一個非常重要的方面。FreeRTOS 提供了多種機制來實現任務間通信,其中之一就是消息緩存(Message Buffer)。消息緩存非常適合傳遞長度可變的消息,并且在性能和靈活性方面提供了很大的優勢。

什么是消息緩存?

消息緩存是 FreeRTOS 提供的一種數據結構,用于在任務之間傳遞變長消息。與隊列不同,隊列適合固定長度的數據項,而消息緩存可以處理長度可變的消息。這使得消息緩存非常適用于需要傳遞不同長度消息的場景,比如傳輸字符串或結構化數據。

消息緩存的工作原理

消息緩存的基本操作包括創建、發送和接收消息。以下是其主要操作:

  1. 創建消息緩存:使用 xMessageBufferCreate 函數創建一個新的消息緩存。
  2. 發送消息到消息緩存:任務使用 xMessageBufferSend 將消息發送到緩存中。
  3. 從消息緩存接收消息:任務使用 xMessageBufferReceive 從緩存中接收消息。

實例:使用 FreeRTOS 消息緩存進行任務通信

下面是一個使用消息緩存在兩個任務之間傳遞消息的完整示例。在這個示例中,一個任務負責發送消息,另一個任務負責接收消息。

#include <Arduino.h>
#include <FreeRTOS.h>
#include <message_buffer.h>// 消息緩存句柄
MessageBufferHandle_t xMessageBuffer;// 發送任務
void vSenderTask(void *pvParameters) {const char *message = "Hello, FreeRTOS!";while (1) {// 發送消息size_t bytesSent = xMessageBufferSend(xMessageBuffer, message, strlen(message), pdMS_TO_TICKS(1000));if (bytesSent < strlen(message)) {Serial.println("Failed to send complete message");}// 每 2 秒發送一次vTaskDelay(pdMS_TO_TICKS(2000));}
}// 接收任務
void vReceiverTask(void *pvParameters) {char buffer[50];while (1) {// 接收消息size_t bytesReceived = xMessageBufferReceive(xMessageBuffer, buffer, sizeof(buffer), portMAX_DELAY);if (bytesReceived > 0) {buffer[bytesReceived] = '\0'; // 確保字符串以 NULL 結尾Serial.print("Received: ");Serial.println(buffer);} else {Serial.println("Failed to receive message");}}
}void setup() {// 初始化串口Serial.begin(115200);while (!Serial) {}// 創建消息緩存xMessageBuffer = xMessageBufferCreate(1024);if (xMessageBuffer == NULL) {Serial.println("Failed to create message buffer");while (1) {}}// 創建發送和接收任務xTaskCreate(vSenderTask, "Sender", 1024, NULL, 1, NULL);xTaskCreate(vReceiverTask, "Receiver", 1024, NULL, 1, NULL);// 啟動調度器vTaskStartScheduler();
}void loop() {// 主循環應為空,因為 FreeRTOS 任務在運行
}

API

1. 創建消息緩存

要創建一個消息緩存,使用 xMessageBufferCreate 函數:

MessageBufferHandle_t xMessageBufferCreate(size_t xBufferSizeBytes);

參數

  • xBufferSizeBytes:消息緩存的大小(字節數)。

返回值

  • 成功時返回消息緩存的句柄(非 NULL);失敗時返回 NULL。

示例:

MessageBufferHandle_t xMessageBuffer = xMessageBufferCreate(1024);
if (xMessageBuffer == NULL) {// 創建失敗,處理錯誤
}

2. 發送消息到消息緩存

使用 xMessageBufferSend 將消息發送到緩存中:

size_t xMessageBufferSend(MessageBufferHandle_t xMessageBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait);

參數

  • xMessageBuffer:消息緩存的句柄。
  • pvTxData:要發送的消息指針。
  • xDataLengthBytes:發送的消息長度(字節數)。
  • xTicksToWait:等待時間(滴答數)。

返回值

  • 成功發送的字節數。如果返回值小于 xDataLengthBytes,則表示在 xTicksToWait 時間內沒有足夠的空間發送所有消息。

示例:

const char *message = "Hello, FreeRTOS!";
size_t bytesSent = xMessageBufferSend(xMessageBuffer, message, strlen(message), portMAX_DELAY);
if (bytesSent < strlen(message)) {// 發送的數據不完整,處理錯誤
}

3. 從消息緩存接收消息

使用 xMessageBufferReceive 從緩存中接收消息:

size_t xMessageBufferReceive(MessageBufferHandle_t xMessageBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait);

參數

  • xMessageBuffer:消息緩存的句柄。
  • pvRxData:接收消息的緩沖區指針。
  • xBufferLengthBytes:接收緩沖區的大小(字節數)這設置了可以接收的消息的最大長度。
  • xTicksToWait:等待時間(滴答數)。

返回值

  • 成功接收的字節數。如果返回值小于 xBufferLengthBytes,則表示在 xTicksToWait 時間內沒有接收到足夠的消息。

示例:

char buffer[50];
size_t bytesReceived = xMessageBufferReceive(xMessageBuffer, buffer, sizeof(buffer), portMAX_DELAY);
if (bytesReceived > 0) {buffer[bytesReceived] = '\0'; // 確保字符串以 NULL 結尾Serial.println(buffer);
} else {// 接收失敗,處理錯誤
}

其他消息緩存 API

1. xMessageBufferCreateStatic

創建一個靜態分配的消息緩存。

MessageBufferHandle_t xMessageBufferCreateStatic(size_t xBufferSizeBytes, uint8_t *pucMessageBufferStorageArea, StaticMessageBuffer_t *pxStaticMessageBuffer);

參數

  • xBufferSizeBytes:消息緩存的大小(字節數)。
  • pucMessageBufferStorageArea:指向預先分配的緩存存儲區。
  • pxStaticMessageBuffer:指向預先分配的 StaticMessageBuffer_t 結構。

返回值

  • 成功時返回消息緩存的句柄(非 NULL);失敗時返回 NULL。
2. xMessageBufferReset

重置消息緩存,使其變為空。

BaseType_t xMessageBufferReset(MessageBufferHandle_t xMessageBuffer);

參數

  • xMessageBuffer:消息緩存的句柄。

返回值

  • 如果成功重置消息緩存,則返回 pdPASS;如果在消息緩存上有任務阻塞,則返回 pdFAIL。

示例:

if (xMessageBufferReset(xMessageBuffer) == pdPASS) {// 重置成功
} else {// 重置失敗,處理錯誤
}
3. xMessageBufferSpacesAvailable

獲取消息緩存中可用的空閑空間(字節數)。

size_t xMessageBufferSpacesAvailable(MessageBufferHandle_t xMessageBuffer);

參數

  • xMessageBuffer:消息緩存的句柄。

返回值

  • 消息緩存中當前可用的空閑空間,以字節為單位。

示例:

size_t spaceAvailable = xMessageBufferSpacesAvailable(xMessageBuffer);
Serial.print("Space available: ");
Serial.println(spaceAvailable);
4. xMessageBufferNextLengthBytes

獲取消息緩存中下一個消息的長度(字節數)。

size_t xMessageBufferNextLengthBytes(MessageBufferHandle_t xMessageBuffer);

參數

  • xMessageBuffer:消息緩存的句柄。

返回值

  • 下一個消息的長度,以字節為單位。

示例:

size_t nextMessageLength = xMessageBufferNextLengthBytes(xMessageBuffer);
Serial.print("Next message length: ");
Serial.println(nextMessageLength);
5. vMessageBufferDelete

刪除消息緩存,釋放分配的內存。

void vMessageBufferDelete(MessageBufferHandle_t xMessageBuffer);

參數

  • xMessageBuffer:消息緩存的句柄。

返回值

  • 無返回值。

示例:

vMessageBufferDelete(xMessageBuffer);

總結

FreeRTOS 消息緩存通過在發送和接收消息時記錄和讀取消息長度,確保了消息的完整傳遞。這樣的設計使得發送的數據和接收的數據大小相等,從而保證了任務間通信的一致性和可靠性。

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

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

相關文章

【IC驗證】一文速通多通道數據整型器(MCDF)

目錄 01 README 02 MCDF設計結構 2.1 功能描述 2.2 設計結構 2.3 接口與時序 2.3.1 系統信號接口 2.3.2 通道從端接口 2.3.3 整形器接口 2.3.4 控制寄存器接口 2.3.4.1 接口時序圖 2.3.4.2 各數據位信息 03 驗證框圖 3.1 reg_pkg 3.1.1 reg_trans 3.1.2 reg_driv…

【一刷《劍指Offer》】面試題 27:二叉搜索樹與雙向鏈表

牛客對應題目鏈接&#xff1a;二叉搜索樹與雙向鏈表_牛客題霸_牛客網 (nowcoder.com) 力扣對應題目鏈接&#xff1a;LCR 155. 將二叉搜索樹轉化為排序的雙向鏈表 - 力扣&#xff08;LeetCode&#xff09; 一、《劍指 Offer》對應內容 二、分析題目 上面力扣上的這道題目和牛客…

AGM DAP-LINK 離線燒錄報錯信息分析

DAP-LINK 支持離線燒錄。 即&#xff1a;先把要燒錄的bin 燒錄到DAP-LINK 中&#xff1b;然后DAP-LINK 可以脫離PC&#xff0c;上電后通過按鍵對目標板進行燒錄。 CMSIS-DAP模式 跳線JGND斷開&#xff0c;狀態LED D4快閃&#xff0c;D3常亮&#xff08;串口狀態&#xff09;。…

deepin開發web前端:探索、挑戰與無限可能

deepin開發web前端&#xff1a;探索、挑戰與無限可能 在數字化浪潮洶涌的時代&#xff0c;Web前端作為連接用戶與數字世界的橋梁&#xff0c;其重要性日益凸顯。而deepin作為一款優秀的開源操作系統&#xff0c;為Web前端開發者提供了廣闊的舞臺。本文將圍繞deepin開發Web前端…

接口設計的最佳實踐-下篇

大多數程序員&#xff0c;做得最多的事&#xff0c;也不過是寫接口這件事而已。 今天繼續總結下接口設計需要注意的點。盡量每種都給出具體的場景、案例等&#xff0c;希望大家能有所收獲。 1、接口冪等 冪等性&#xff1a;是指一個操作或者一個服務&#xff0c;無論執行多少…

小程序怎樣進行本地存儲的讀、寫、刪、清?

小程序進行本地存儲的讀、寫、刪、清操作&#xff0c;可以通過微信小程序提供的API來實現。這些API分為同步和異步兩種類型&#xff0c;以滿足不同的使用場景和需求。 同步操作 同步操作會阻塞后續的代碼執行&#xff0c;直到操作完成。 寫入本地緩存&#xff08;寫&#xf…

Vue3 - Mac系統用文本編輯寫html不顯示效果的坑

平時在win系統下&#xff0c;可以直接對文本進行編輯&#xff0c;非常的舒服。 在mac系統中&#xff0c;也有類似的功能&#xff0c;就是文本編輯&#xff0c;沒想到居然還有坑。 這是我mac系統中創建的html文件&#xff0c;想著沒有幾行代碼&#xff0c;就沒有開編輯器了&am…

C語言 | Leetcode C語言題解之第125題驗證回文串

題目&#xff1a; 題解&#xff1a; bool isalumn(char c) {return (c > a && c < z) || (c > A && c < Z) || (c > 0 && c < 9); }bool isPalindrome(char* s) {for (int left 0, right strlen(s) - 1; left < right; left, …

【數據庫系統概論】事務

概述 在數據庫系統中&#xff0c;事務&#xff08;Transaction&#xff09;是指一組作為單個邏輯工作單元執行的操作。這些操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失敗&#xff08;回滾&#xff09;。事務的主要目的是確保數據庫的完整性和一致性&…

AI與NLP的完美結合:揭秘ChatGPT

AI與NLP的完美結合&#xff1a;揭秘ChatGPT 一、AI大模型的發展歷程 AI大模型的發展可追溯到早期的深度學習技術。深度學習通過多層神經網絡處理復雜的數據模式&#xff0c;顯著提升了圖像識別、語音識別等領域的性能。隨后&#xff0c;研究人員將注意力轉向NLP&#xff0c;開…

【傳知代碼】多視圖3D目標檢測位置嵌入變換(論文復現)

前言&#xff1a;三維目標檢測技術正逐漸成為計算機視覺領域的重要研究方向。特別是在自動駕駛、增強現實&#xff08;AR&#xff09;、虛擬現實&#xff08;VR&#xff09;以及機器人導航等應用中&#xff0c;對三維空間內目標的精準檢測與定位顯得尤為重要。然而&#xff0c;…

人臉解鎖優化關鍵過程

一.人臉解鎖的關鍵過程 1. 按下power鍵 2. 屏幕點亮 3. 打開前攝 4. 獲取第一幀并傳給算法 5. 算法完成并返回結果 6. 解鎖完成并關閉相機 二. 相機優化點 1. 定制人臉解鎖自己的pipeline,去掉不必要的node,理論上只需要一個preview的pipeline 2. 使用AE warm up&#xff0c;減…

SAP_SD模塊-銷售交貨并開票后發現物料沒維護價格的完整處理方法(含POD功能)

銷售流程完結后&#xff0c;發現物料價格沒維護時&#xff0c;如何處理 一、業務背景&#xff1a; 1、問題發現時間&#xff1a;2024年6月2日&#xff1b; 2、問題描述&#xff1a; 2024年5月份的單據業務存在交貨成本和開票成本為0的單據&#x…

【JavaScript腳本宇宙】揭秘HTTP請求庫:深入理解它們的特性與應用

深度揭秘&#xff1a;六大HTTP請求庫的比較與應用 前言 在這篇文章中&#xff0c;我們將探討六種主要的HTTP請求庫。這些庫為處理網絡請求提供了不同的工具和功能&#xff0c;包括Axios、Fetch API、Request、SuperAgent、Got和Node-fetch。通過本文&#xff0c;你將對每個庫…

PyCharm如何更換解析器為Anaconda,如何自己切換python環境

自己使用了Anaconda創建了一個環境&#xff1a; 如何在工具PyCharm中切換自定義的python環境呢&#xff1f; 1. 點擊 設置 2. 項目&#xff1a;python - Python解析器 此時會發現&#xff0c;只有一個默認的版本。 3. 點擊 添加解析器 - 添加本地解析器 4. 選擇 conda 環境…

AI智能語音機器人系統如何對接科大訊飛接口

關于AI語音機器人的介紹有很多&#xff0c;但是由于商業化&#xff0c;沒有一個能真正說明白的&#xff0c;當然&#xff0c;我們搭建的AI智能機器人系統也是商業化的&#xff0c;畢竟業務是做這方面的&#xff0c;但是價格絕對是公道的&#xff0c;廢話不多說了&#xff0c;我…

探索API接口:技術深度解析與應用實踐

在當今的軟件開發和數據交換領域&#xff0c;API&#xff08;應用程序編程接口&#xff09;已經成為了一個不可或缺的工具。它允許不同的軟件應用程序或組件之間進行交互和通信&#xff0c;從而實現了數據的共享和功能的擴展。本文將深入探討API接口的技術原理、設計原則以及在…

Qt各發布版本介紹與選擇

一.Qt各個主要版本介紹 1.Qt4 Qt4的第一個版本是Qt 4.0&#xff0c;發布于2005年6月1日。 Qt 4的最后一個版本是Qt 4.8.7&#xff0c;發布時間是2015年6月10日。 2.Qt5 &#xff08;1&#xff09;Qt5的第一個版本是Qt 5.0&#xff0c;發布于2012年12月19日。 &#xff08;2&…

ubuntu安裝notion

一、背景&#xff1a; 不用windwos系統&#xff0c;完全可以&#xff0c;然后基本軟件都有&#xff0c;怎么安裝notion呢 二、步驟 1. 更新源 echo "deb [trustedyes] https://apt.fury.io/notion-repackaged/ /" | sudo tee /etc/apt/sources.list.d/notion-repa…

基于字典樹可視化 COCA20000 詞匯

COCA20000 是美國當代語料庫中最常見的 20000 個詞匯&#xff0c;不過實際上有一些重復&#xff0c;去重之后大概是 17600 個&#xff0c;這些單詞是很有用&#xff0c;如果能掌握這些單詞&#xff0c;相信會對英語的能力有一個較大的提升。我很早就下載了這些單詞&#xff0c;…