B站Michale_ee——ESP32_IDF SDK——FreeRTOS_8 消息緩沖區

  • Message Buffer(消息緩沖區)與Stream Buffer(流數據緩沖區)類似,但有2點不同:
    • Message Buffer每次只接收1次完整的Message;
    • Message Buffer接收緩沖區小于1條Message大小時,會接收不到數據;

一、Message Buffer每次直接收1條完整的Message

1.API簡介

(1)創建Message Buffer

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(2)從消息緩沖區中接收數據

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(3)向消息緩沖區中發送數據

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

2.示例代碼及運行結果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/message_buffer.h"    // add by lxl
#include "string.h"                     // add by lxlMessageBufferHandle_t xMessageBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int str_len = 0;size_t send_len=0;for(int i=0; i<3; i++){str_len = sprintf(tx_buf, "Hello, Data_%d", i);send_len = xMessageBufferSend(xMessageBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("i=%d; Send Data Len:%d, String Len:%d\n", i, send_len, str_len);}vTaskDelete(NULL);
}void Task2(void *pvparam)
{char rx_buf[200] = {0};size_t recv_len=0;vTaskDelay(pdMS_TO_TICKS(3000));while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xMessageBufferReceive(xMessageBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY);  //! 調用該API時,流數據緩沖區中要為空,否則就會先把數據接收完成后再進入阻塞狀態if(recv_len > 0){printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);}vTaskDelay(pdMS_TO_TICKS(1000));}
}void app_main(void)
{xMessageBuffer = xMessageBufferCreate(1000);if( xMessageBuffer == NULL ){printf("Create Message Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);  //! ESP32-S3為雙核,CPU0主要運行WiFi和藍牙;CPU1用于運行應用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在這里插入圖片描述

二、Message接收API的接收緩沖區的小于1條Message大小時,會接收不到數據

示例代碼及運行結果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/Message_buffer.h"    // add by lxl
#include "string.h"                     // add by lxlMessageBufferHandle_t xMessageBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int str_len = 0;size_t send_len=0;for(int i=0; i<3; i++){str_len = sprintf(tx_buf, "Hello, Data_%d", i);send_len = xMessageBufferSend(xMessageBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("i=%d; Send Data Len:%d, String Len:%d\n", i, send_len, str_len);}vTaskDelete(NULL);
}void Task2(void *pvparam)
{char rx_buf[10] = {0};size_t recv_len=0;vTaskDelay(pdMS_TO_TICKS(3000));while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xMessageBufferReceive(xMessageBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY);  //! 調用該API時,流數據緩沖區中要為空,否則就會先把數據接收完成后再進入阻塞狀態printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);vTaskDelay(pdMS_TO_TICKS(1000));}
}void app_main(void)
{xMessageBuffer = xMessageBufferCreate(1000);if( xMessageBuffer == NULL ){printf("Create Message Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);  //! ESP32-S3為雙核,CPU0主要運行WiFi和藍牙;CPU1用于運行應用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在這里插入圖片描述

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

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

相關文章

【計算機網絡網絡層深度解析】從IP協議到路由優化

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心實驗實現實驗1&#xff1a;IPv6地址配置實驗2&#xff1a;OSPF路由配置實驗3&#xff1a;NAT轉換驗證 運行…

【Hive入門】Hive性能調優:小文件問題與動態分區合并策略詳解

目錄 引言 1 Hive小文件問題概述 1.1 什么是小文件問題 1.2 小文件產生的原因 2 Hive小文件合并機制 2.1 hive.merge.smallfiles參數詳解 2.2 小文件合并流程 2.3 合并策略選擇 3 動態分區與小文件問題 3.1 動態分區原理 3.2 動態分區合并策略 3.3 動態分區合并流程…

如何讓Steam下載速度解除封印?!

平時一直沒注意到家里的路由器在偷懶。最近成功榨干家里的帶寬&#xff0c;把平時一直20mb/s左右下載速度的路由器一番改造后成功steam下載速度穩定85Mb/s。平時一直都只發揮了他的1/3不到&#xff0c;真是太可惜了。 硬件 首先檢查硬件&#xff0c;就千兆路由器而言&#xf…

通信原理第七版與第六版的區別附pdf

介紹 我用夸克網盤分享了「通信原理 第7版》樊昌信」&#xff0c; 鏈接&#xff1a;https://pan.quark.cn/s/be7c5af4cdce 《通信原理&#xff08;第7版&#xff09;》是在第6版的基礎上&#xff0c;為了適應當前通信技術發展和教學需求&#xff0c;并吸取了數十所院校教師的反…

【2025五一數學建模競賽A題】 支路車流量推測問題|建模過程+完整代碼論文全解全析

你是否在尋找數學建模比賽的突破點&#xff1f;數學建模進階思路&#xff01; 作為經驗豐富的美賽O獎、國賽國一的數學建模團隊&#xff0c;我們將為你帶來本次數學建模競賽的全面解析。這個解決方案包不僅包括完整的代碼實現&#xff0c;還有詳盡的建模過程和解析&#xff0c…

Python爬蟲實戰:獲取彼岸網高清素材圖片

一、引言 在數字化時代,圖片素材的需求持續增長。彼岸網提供了豐富的高質量圖片資源,其中 4K 風景圖片備受用戶青睞。借助 Python 爬蟲技術,可自動化地從彼岸網獲取這些圖片,為用戶提供便捷的圖片素材服務。然而,爬取過程中會遭遇登錄驗證、反爬機制等問題,需采用相應技…

深入理解 C++ 數據類型:從基礎到高級應用

C 是一種強類型語言&#xff0c;這意味著每個變量都必須有明確的數據類型&#xff0c;以便編譯器知道如何存儲和操作數據。數據類型決定了變量的內存占用、取值范圍以及可以執行的操作。理解 C 的數據類型是編寫高效、安全代碼的基礎。本文將全面介紹 C 的數據類型&#xff0c;…

補題:K - Magic Tree (Gym - 105231K)

來源&#xff1a;問題 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 題目描述&#xff1a; 一、題目分析 本題給定一個2行m列的網格&#xff0c;從(1, 1)格子開始進行深度優先搜索&#xff0c;每個格子可到達至少一個邊相鄰的格子且不重復訪問&#xff0c;…

【Prometheus-OracleDB Exporter安裝配置指南,開機自啟】

目錄 1. 安裝Oracle Instant Client1.1 解壓安裝包1.2 創建運行時鏈接 2. 環境配置2.1 設置環境變量2.2 驗證配置 3. 安裝Oracle DB Exporter3.1 創建工作目錄3.2 解壓安裝包3.3 添加執行權限 4. 數據庫監控配置4.1 創建監控用戶&#xff08;切換到Oracle所屬用戶&#xff09; …

溯因推理思維——AI與思維模型【92】

一、定義 溯因推理思維模型是一種從結果出發,通過分析、推測和驗證,尋找導致該結果的可能原因的思維方式。它試圖在已知的現象或結果基礎上,逆向追溯可能的原因,構建合理的解釋框架,以理解事物的本質和內在機制。 二、由來 溯因推理的思想可以追溯到古希臘哲學家亞里士…

Git 基本操作(二)

目錄 撤銷修改操作 情況一 情況二 情況三 刪除文件 升級git 撤銷修改操作 在日常編碼過程中&#xff0c;有些時候&#xff0c;我們可能寫著寫著發現目前的版本的代碼越寫越挫&#xff0c;越不符合標準&#xff0c;想讓我們當前的文件去恢復到上一次提交的版本…

java使用CMU sphinx語音識別

java使用CMU sphinx語音識別 一、pom依賴1、依賴dependency2、配置倉庫repository 二、下載中文資源包1、下載中文資源包&#xff08;需要其他語言的選擇對應的文件夾即可&#xff09;&#xff0c;中文選擇Mandarin2、將下載后的文件放到項目中3、代碼-識別wav語音文件4、代碼-…

企業內訓|智能駕駛與智能座艙技術——某汽車廠商

4月25日&#xff0c;東北某市&#xff0c;TsingtaoAI團隊為某汽車廠商的智能駕駛業務和研發團隊交付“智能駕駛與智能座艙技術”課程。本課程系統講解智能汽車兩大核心領域技術架構與實現路徑。課程涵蓋智能駕駛感知層&#xff08;激光雷達/毫米波雷達/視覺融合&#xff09;、決…

【數學建模國獎速成系列】優秀論文繪圖復現代碼(二)

文章目錄 國獎論文繪圖復現代碼&#xff0c;可直接運行柱狀圖橫向柱狀圖分組柱狀圖堆疊柱狀圖堆疊柱狀圖2三維柱狀圖完整復現代碼 國獎論文繪圖復現代碼&#xff0c;可直接運行 數模比賽的繪圖是非常重要得&#xff0c;這篇文章給大家分享我自己復現的國獎優秀論文的代碼&…

GitLab CVE-2024-12444 安全漏洞解決方案

本文分享極狐GitLab 補丁版本 17.11.1, 17.10.5, 17.9.7 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

隨機微分方程(SDE):股票價格模型、利率模型的構建

隨機微分方程&#xff08;SDE&#xff09;&#xff1a;股票價格模型、利率模型的構建 一、隨機微分方程&#xff08;SDE&#xff09;基礎&#xff1a;從確定性到隨機性的擴展 1. 定義與一般形式 隨機微分方程&#xff08;SDE&#xff09;是包含布朗運動&#xff08;隨機項&am…

【MCP Node.js SDK 全棧進階指南】高級篇(1):MCP多服務器協作架構

隨著業務規模的不斷擴大和系統復雜度的提升,單一服務器架構往往無法滿足高并發、高可用性和彈性擴展的需求。在MCP生態系統中,多服務器協作架構成為構建大規模應用的必然選擇。本文將深入探討MCP TypeScript-SDK在多服務器環境下的部署、協作和管理,以及如何構建高可用、高性…

git 修改用戶名和郵箱

在 Git 中修改用戶名和郵箱地址是常見的任務&#xff0c;這可以確保你的提交記錄使用正確的身份信息。你可以通過簡單的命令來完成這一操作。 全局配置 修改全局用戶名 要修改全局的用戶名&#xff0c;請執行以下命令&#xff1a; git config --global user.name "New…

[算法學習]——通過RMQ與dfs序實現O(1)求LCA(含封裝板子)

每周五篇博客&#xff1a;&#xff08;3/5&#xff09; 碎碎念 其實不是我想多水一篇博客&#xff0c;本來這篇是歐拉序的博客&#xff0c;結果dfs序也是可以O1求lca的&#xff0c;而且常數更優&#xff0c;結果就變成這樣了。。。 前置知識 [算法學習]——dfs序 思想 分…

spark local模式

Spark Local 模式是一種在單臺機器上運行 Spark 應用程序的模式&#xff0c;無需搭建分布式集群&#xff0c;適合開發調試、學習以及運行小規模數據處理任務。以下為你詳細介紹該模式&#xff1a; 特點 簡易性&#xff1a;無需額外配置分布式集群&#xff0c;在單機上就能快速…