消息隊列應用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系統設計》P343-P347

在這里插入圖片描述

消息隊列

使用信號量、事件標志組和線標志進行任務同步時,只能提供同步的時刻信息,無法在任務之間進行數據傳輸。要實現任務間的數據傳輸,一般使用兩種方式:

1. 全局變量

在 RTOS 中使用全局變量時,必須保證每個任務對全局變量的互斥訪問,一般借助互斥量來實現。另一個方法是在任務設計時,設計成只有一個任務修改這個全局變量,其他任務只是讀取這個全局變量,而不修改它的值,并在全局變量前面加上 volatile 的關鍵字修飾,以避免編澤器的優化。

2. 消息隊列

消息隊列類似于一個數據緩沖區,可以保存有限個、具有確定大小的數據。通常情況下,消息隊列按照 FI FO(先進先出)的模式使用,即數據由隊尾寫入,從隊首讀出。
任務向消息隊列中放人消息時,需要判斷消息隊列是否有多余的空間:如果有空間,則放人一個新的消息;如果消息隊列已經存滿,該任務將進人到阻塞態,直到消息隊列中有多余的空間。
任務從消息隊列中獲取消息時,需要判斷消息隊列是否有消息:如果消息隊列中沒有消息,該任務將進人到阻塞態。當消息隊列中有新的消息時,處于阻塞態的任務將被喚醒并獲得該消息。任務在獲取消息時,需要提前定義存放消息的緩沖區,這個緩沖區的大小不能小于消息隊列中單個消息的大小。
注意: FreeRTOS 利用消息隊列進行消息傳遞時,放入消息隊列的是實際的數據,而不是數據的地址。例如,串口一次接收 10 字節的數據,如果使用消息隊列來傳遞串口接收的數據,則應該將消息隊列的單個消息大小設置為 10 字節,以便一次性存放串口接收的10 字節數據。
消息隊列和全局變量相比,解決了多任務訪問共享資源的沖突問題,還提供了任務的同步和超時處理等機制,并且可以實現中斷服務程序和任務之間的數據傳遞。例如,多個任務都要使用串口進行數據傳輸時,可以采用兩種方法:一種方法是利用互斥量實現對串口的互斥訪問;另一種方法是創建一個消息隊列和一個負責串口數據收發的任務。任務 A 發送的數據放人消息隊列,任務 B 發送的數據也放人消息隊列,串口發送任務則按照 FIFO 的原則從消息隊列中取出消息發送。
在實際應用時,由于消息隊列采用數據復制的方式傳輸數據,而不是傳輸存放數據的地址。如果任務間傳輸的數據量較大時,使用消息隊列的效率會比較低。這時,可以考慮使用全局變量來實現任務間的通信,只是要注意全局變量的互斥訪問(利用互斥量實現)。

應用示例

利用消息隊列傳輸串口接收的數據。串口采用中斷方式接收 10 字節的數據,并放入消息隊列。數據處理任務從消息隊列中取出數據并發送到 PC 顯示。消息隊列設置為可以容納 5 個消息,每個消息的大小為10 字節。
修改HAL庫的時間基準
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

// main.h
/*** @file main.h* @brief 主程序頭文件,包含系統所需的基本定義和聲明*//* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>			// 標準輸入輸出頭文件,用于printf和fputc
#include "cmsis_os2.h"		// CMSIS RTOS2,支持FreeRTOS
#include "usart.h"			// USART頭文件,包含串口相關函數
#define LENGTH 10			// 緩沖區長度
extern uint8_t RxBuf[LENGTH];	// 串口接收緩沖區,用于存儲接收到的數據
extern uint8_t TxBuf[LENGTH];	// 串口發送緩沖區,用于存儲待發送的數據
extern osMessageQueueId_t ComQueueHandle;	// RTOS消息隊列句柄,用于任務間通信
/* USER CODE END Includes */
// main.c
/*** @file main.c* @brief 主程序源文件,包含系統初始化和中斷回調函數*//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*** @brief 重定向printf函數相關配置* @note 支持不同編譯器(ARMCC、GNUC)下的printf功能實現*/
/* suport printf function, usemicrolib is unnecessary */
#if (__ARMCC_VERSION > 6000000)
__asm (".global __use_no_semihosting\n\t");
void _sys_exit(int x)
{x = x;
}
/* __use_no_semihosting was requested, but _ttywrch was */
void _ttywrch(int ch)
{ch = ch;
}
FILE __stdout;
#else
#ifdef __CC_ARM
#pragma import(__use_no_semihosting)
struct __FILE
{int handle;
};
FILE __stdout;
void _sys_exit(int x)
{x = x;
}
#endif
#endif
#if defined ( __GNUC__ ) && !defined (__clang__)
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif/*** @brief  Retargets the C library printf function to the USART.* @param  None* @retval None*/
PUTCHAR_PROTOTYPE
{	// 采用輪詢方式發送1字節數據,使用阻塞方式,超時時間設置為無限等待HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}int fgetc(FILE *f)
{	// 采用輪詢方式接收1字節數據,使用阻塞方式,超時時間設置為無限等待uint8_t ch;	HAL_UART_Receive( &huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY );return ch;
}
/* USER CODE END 0 *//* USER CODE BEGIN 2 */printf("/**  FreeRTOS for task creat  **/\n");HAL_UART_Receive_IT(&huart1,RxBuf,LENGTH);		// 啟動串口中斷接收功能,接收長度為 LENGTH 的數據到 RxBuf 緩沖區
/* USER CODE END 2 *//* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)	
{	// 串口接收完成中斷回調函數,當串口接收到指定長度的數據后,會觸發此回調函數if(huart->Instance==USART1)	// 檢查觸發中斷的串口是否為 USART1{	// 將收到的數據放入消息隊列 ComQueueHandle中osMessageQueuePut(ComQueueHandle, (void *)RxBuf,0,0);	HAL_UART_Receive_IT(&huart1,RxBuf,LENGTH);	// 重新開始串口中斷接收,準備接收下一組數據}
}
/* USER CODE END 4 */
// app_freertos.c/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
uint8_t RxBuf[LENGTH];	// 串口接收緩沖區
uint8_t TxBuf[LENGTH];	// 串口發送緩沖區
/* USER CODE END Variables *//* USER CODE BEGIN Header_StartProcessTask */
/**
* @brief Function implementing the ProcessTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartProcessTask */
void StartProcessTask(void *argument)
{/* USER CODE BEGIN StartProcessTask *//* Infinite loop */for(;;){		// 從消息隊列中獲取數據,無限等待if(osMessageQueueGet(ComQueueHandle,(void *)TxBuf,NULL,osWaitForever)==osOK){	// 通過UART1發送數據HAL_UART_Transmit(&huart1,(void *)&TxBuf,LENGTH,HAL_MAX_DELAY);}}/* USER CODE END StartProcessTask */
}

在這里插入圖片描述

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

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

相關文章

【NLP251】Transformer精講 殘差鏈接與層歸一化

精講部分&#xff0c;主要是對Transformer的深度理解方便日后從底層邏輯進行創新&#xff0c;對于僅應用需求的小伙伴可以跳過這一部分&#xff0c;不影響正常學習。 1. 殘差模塊 何凱明在2015年提出的殘差網絡&#xff08;ResNet&#xff09;&#xff0c;Transformer在2016年…

Android學習制作app(ESP8266-01S連接-簡單制作)

一、理論 部分理論見arduino學習-CSDN博客和Android Studio安裝配置_android studio gradle 配置-CSDN博客 以下直接上代碼和效果視頻&#xff0c;esp01S的收發硬件代碼目前沒有分享&#xff0c;但是可以通過另一個手機網絡調試助手進行模擬。也可以直接根據我的代碼進行改動…

圖書管理系統 Axios 源碼__新增圖書

目錄 功能介紹 核心代碼解析 源碼&#xff1a;新增圖書功能 總結 本項目基于 HTML、Bootstrap、JavaScript 和 Axios 開發&#xff0c;實現了圖書的增刪改查功能。以下是新增圖書的功能實現&#xff0c;適合前端開發學習和項目實踐。 功能介紹 用戶可以通過 模態框&#xf…

DeepSeek Janus-Pro:多模態AI模型的突破與創新

近年來&#xff0c;人工智能領域取得了顯著的進展&#xff0c;尤其是在多模態模型&#xff08;Multimodal Models&#xff09;方面。多模態模型能夠同時處理和理解文本、圖像等多種類型的數據&#xff0c;極大地擴展了AI的應用場景。DeepSeek(DeepSeek-V3 深度剖析&#xff1a;…

AJAX XML

AJAX XML 引言 隨著互聯網技術的不斷發展,Web應用對用戶交互性和實時性的要求越來越高。AJAX(Asynchronous JavaScript and XML)技術的出現,為Web應用開發提供了強大的支持。AJAX技術允許Web應用在不重新加載整個頁面的情況下,與服務器進行異步通信。XML作為數據傳輸格式…

OpenGL學習筆記(五):Textures 紋理

文章目錄 紋理坐標紋理環繞方式紋理過濾——處理紋理分辨率低的情況多級漸遠紋理Mipmap——處理紋理分辨率高的情況加載與創建紋理 &#xff08; <stb_image.h> &#xff09;生成紋理應用紋理紋理單元練習1練習2練習3練習4 通過上一篇著色部分的學習&#xff0c;我們可以…

代理模式——C++實現

目錄 1. 代理模式簡介 2. 代碼示例 1. 代理模式簡介 代理模式是一種行為型模式。 代理模式的定義&#xff1a;由于某些原因需要給某對象提供一個代理以控制該對象的訪問。這時&#xff0c;訪問對象不適合或者不能直接訪問引用目標對象&#xff0c;代理對象作為訪問對象和目標…

Vue3 表單:全面解析與最佳實踐

Vue3 表單&#xff1a;全面解析與最佳實踐 引言 隨著前端技術的發展&#xff0c;Vue.js 已經成為最受歡迎的前端框架之一。Vue3 作為 Vue.js 的最新版本&#xff0c;帶來了許多改進和新的特性。其中&#xff0c;表單處理是 Vue 應用中不可或缺的一部分。本文將全面解析 Vue3 …

C++11新特性之范圍for循環

1.介紹 C11標準之前&#xff0c;使用for循環遍歷數組或容器&#xff0c;只能使用以下結構&#xff1a; for&#xff08;表達式1&#xff1b;表達式2&#xff1b;表達式3&#xff09;{ 循環體 } 那么在C11標準中&#xff0c;除了上面的方法外&#xff0c;又引入了一種全新的語…

攻防世界 fileclude

代碼審計 WRONG WAY! <?php include("flag.php"); highlight_file(__FILE__);//高亮顯示文件的源代碼 if(isset($_GET["file1"]) && isset($_GET["file2"]))//檢查file1和file2參數是否存在 {$file1 $_GET["file1"];$fi…

圖書管理系統 Axios 源碼__獲取圖書列表

目錄 核心功能 源碼介紹 1. 獲取圖書列表 技術要點 適用人群 本項目是一個基于 HTML Bootstrap JavaScript Axios 開發的圖書管理系統&#xff0c;可用于 添加、編輯、刪除和管理圖書信息&#xff0c;適合前端開發者學習 前端交互設計、Axios 數據請求 以及 Bootstrap 樣…

Vue 響應式渲染 - 列表布局和v-html

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue 響應式渲染 - 列表布局和v-html 目錄 列表布局 簡單渲染列表 顯示索引值 點擊變色 V-html 作用 注意 采用策略 應用 總結 列表布局 簡單渲染列表 Data中設置狀態&#xff0c;是一個數組格式的默認信息。 然后…

如何實現一個CLI命令行功能 | python 小知識

如何實現一個CLI命令行功能 | python 小知識 在現代軟件開發中&#xff0c;命令行界面&#xff08;CLI&#xff09;的設計與交互至關重要。Click是一個強大的Python庫&#xff0c;專門用于快速創建命令行界面&#xff0c;以其簡單易用性和豐富的功能贏得了開發者的青睞。本文將…

[SAP ABAP] Debug Skill

SAP ABAP Debug相關資料 [SAP ABAP] DEBUG ABAP程序中的循環語句 [SAP ABAP] 靜態斷點的使用 [SAP ABAP] 在ABAP Debugger調試器中設置斷點 [SAP ABAP] SE11 / SE16N 修改標準表(慎用)

kamailio-Core 說明書 版本:Kamailio SIP Server v6.0.x(穩定版)

Core 說明書 版本&#xff1a;Kamailio SIP Server v6.0.x&#xff08;穩定版&#xff09; 概述 本教程收集了 Kamailio 導出的函數和參數 core 添加到配置文件中。 注意&#xff1a;此頁面上的參數不按字母順序排列。 結構 kamailio.cfg 的結構可以看作是三個部分&#xff…

.Net / C# 繁體中文 與 簡體中文 互相轉換, 支持地方特色詞匯

版本號 Nuget 搜索 “OpenCCNET”, 注意別找錯, 好多庫的名字都差不多 支持 “繁,簡” 的互相轉換, 支持多個地區常用詞匯的轉換, 還支持 日文的新舊轉換. OpenCC 在 .Net 中的實現 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…

Redis腦裂問題詳解及解決方案

Redis是一種高性能的內存數據庫&#xff0c;廣泛應用于緩存、消息隊列等場景。然而&#xff0c;在分布式Redis集群中&#xff0c;腦裂問題&#xff08;Split-Brain&#xff09;是一個需要特別關注的復雜問題。本文將詳細介紹Redis腦裂問題的成因、影響及解決方案。 一、什么是…

LLMs之OpenAI o系列:OpenAI o3-mini的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 相關文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻譯與解讀 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的簡介、安…

女生年薪12萬,算不算屬于高收入人群

在繁華喧囂的都市中&#xff0c;我們時常會聽到關于收入、高薪與生活質量等話題的討論。尤其是對于年輕女性而言&#xff0c;薪資水平不僅關乎個人價值的體現&#xff0c;更直接影響到生活質量與未來的規劃。那么&#xff0c;女生年薪12萬&#xff0c;是否可以被劃入高收入人群…

AI開發學習之——PyTorch框架

PyTorch 簡介 PyTorch &#xff08;Python torch&#xff09;是由 Facebook AI 研究團隊開發的開源機器學習庫&#xff0c;廣泛應用于深度學習研究和生產。它以動態計算圖和易用性著稱&#xff0c;支持 GPU 加速計算&#xff0c;并提供豐富的工具和模塊。 PyTorch的主要特點 …