STM32-FreeRTOS操作系統-消息隊列

引言

在嵌入式開發領域,STM32與FreeRTOS的結合應用極為廣泛。本文將探討如何在STM32上使用FreeRTOS實現消息隊列功能,助力高效任務通信與系統協作。

消息隊列定義

消息隊列是一種在 FreeRTOS 中用于任務間通信的機制。它允許任務將消息發送到隊列中,其他任務可以從隊列中接收這些消息。消息隊列可以存儲多種類型的數據,如整數、指針或結構體等。通過消息隊列,任務之間可以實現解耦,提高系統的可維護性和可擴展性。在 STM32 系統中,合理使用消息隊列可以有效協調多個任務的運行,優化資源分配,確保系統的高效穩定運行。

創建消息隊列

跟前面創建任務一樣,在起始函數中創建消息隊列

void MyTask(void *arg)            //開始創建任務函數
{taskENTER_CRITICAL();           //進入臨界區	/* 創建Task_Queue */Task_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);//xQueueCreate(隊列消息的長度,隊列消息的大小)xTaskCreate(MyTask1,"MyTask1",50,NULL,2,&MyTask1Handler);//動態方法創建任務1xTaskCreate(Receive_task,"Receive_task",50,NULL,3,&ReceiveTask_Handler);//創建接收消息任務xTaskCreate(Send_task,"Send_task",50,NULL,4,&SendTask_Handler);  //創建發送消息任務vTaskDelete(MyTaskHandler);    //刪除開始任務taskEXIT_CRITICAL();           //退出臨界區
}

xQueueCreate(*隊列長度,*隊列消息大小)

xQueueCreate()是FreeRTOS中用于創建消息隊列的函數,其函數原型為:

QueueHandle_t xQueueCreate(
UBaseType_t uxQueueLength,
UBaseType_t uxItemSize
);

參數uxQueueLength是隊列的長度,即隊列可以容納的最大消息數量。參數uxItemSize表示隊列中每個消息的大小,通常以字節為單位。該函數還有一個返回值,如果隊列創建成功,則返回隊列的句柄;如果失敗則返回NULL。

創建發送隊列消息任務函數

同樣先創建任務函數,然后調用xQueueSend()發送隊列消息函數,其函數原型如下:

BaseType_t xQueueSend(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
)

xQueueSend()是FreeRTOS 中用于向消息隊列發送消息的函數。它允許任務將數據發送到隊列中,供其他任務接收。參數xQueue指向要發送消息的隊列的句柄,這個句柄是用戶通過xQueueCreate創建時返回的。在上面已經定義成Task_Queue;參數*pvItemToQueue是一個指針類型,指向要發送到隊列的數據的值。參數xTicksToWait表示等待時間,這個時間通常是由systick滴答定時器提供,前面的文章已經講過,這里不再論述。如果隊列已滿,xTicksToWait()的行為取決于xTicksToWait()的值,如果為0,則函數返回pdFAIL;如果為非0值,任務將阻塞直到隊列有空間或等待時間已到,函數才會返回pdFAIL。(pdFAIL表示發送隊列消息失敗)

創建接收隊列消息任務函數

跟前面一樣,這里直接跳過。然后調用xQueueReceive()接收隊列消息函數。其函數原型為:

BaseType_t xQueueReceive(
QueueHandle_t xQueue, ? ?// 隊列的句柄
void *pvBuffer, ? ? ? ? ?// 用于存儲接收到的數據的緩沖區
TickType_t xTicksToWait ?// 等待隊列可用的時間
)

xQueueReceive()是 FreeRTOS 提供的一個函數,用于從隊列中接收數據。它通常用于任務之間通過隊列進行通信。參數xQueue表示隊列的句柄,指向要從中接收數據的隊列;參數*pvBuffer指向一個緩沖區,用于存儲從隊列中接收到的數據,緩沖區的大小盡量與隊列中存儲的數據大小一致。參數xTicksToWait? 跟上面一樣。

示例代碼

#include "myfreertos.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "queue.h"
#include "Usart.h"
#include "oled.h"
#include "Task.h"
#include "led.h"
#include "key.h"#define  QUEUE_LEN    4   /* 隊列的長度,最大可包含多少個消息 */
#define  QUEUE_SIZE   4   /* 隊列中每個消息大小(字節) */QueueHandle_t Task_Queue =NULL; //消息隊列句柄TaskHandle_t MyTaskHandler;//任務句柄TaskHandle_t MyTask1Handler;//任務1句柄TaskHandle_t SendTask_Handler;  //發送消息句柄TaskHandle_t ReceiveTask_Handler;//接收消息句柄void MyTask(void *pvParameters);    //聲明啟動函數void MyTask1(void *pvParameters);   //聲明任務1函數void Send_task(void *pvParameters);  //聲明發送消息函數void Receive_task(void *pvParameters);  //聲明接收消息函數void Start_Task(void)
{xTaskCreate(MyTask,"MyTask",128,NULL,1,&MyTaskHandler);//動態方法創建任務vTaskStartScheduler();//啟動任務調動		
}void MyTask(void *arg)            //開始創建任務函數
{taskENTER_CRITICAL();           //進入臨界區	/* 創建Task_Queue */Task_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);//xQueueCreate(隊列消息的長度,隊列消息的大小)xTaskCreate(MyTask1,"MyTask1",50,NULL,2,&MyTask1Handler);//動態方法創建任務1xTaskCreate(Receive_task,"Receive_task",50,NULL,3,&ReceiveTask_Handler);//創建接收消息任務xTaskCreate(Send_task,"Send_task",50,NULL,4,&SendTask_Handler);  //創建發送消息任務vTaskDelete(MyTaskHandler);    //刪除開始任務taskEXIT_CRITICAL();           //退出臨界區
}void MyTask1(void *arg)     //任務1函數體
{
//	u32 cnt=0;                //定義變量while(1){OLED_ShowString(1,1,"Runing Task1");GPIO_ResetBits(GPIOC,GPIO_Pin_13);vTaskDelay(300);GPIO_SetBits(GPIOC,GPIO_Pin_13);vTaskDelay(900);
//		if(++cnt>=10)     //如果超過10次
//		{
//			 if(MyTask1Handler!=NULL)  //判斷句柄是否有效
//			 {
//				  vTaskDelete(MyTask1Handler);  //刪除任務1
//				  MyTask1Handler=NULL;          //清空句柄
//			 }
//		}}	
}//接收隊列消息任務函數
void Receive_task(void *pvParameters)
{BaseType_t xReturn = pdTRUE;/* 定義一個創建信息返回值,默認為pdTRUE */uint32_t r_queue;	/* 定義一個接收消息的變量 */while(1){xReturn = xQueueReceive(Task_Queue,&r_queue,portMAX_DELAY); //xQueueReceive(隊列消息句柄,接收隊列消息的內容,等待時間)if(pdTRUE == xReturn)  //判斷是否接收到消息OLED_ShowNum(2,1,r_queue,1); //顯示接收的消息}
}//發送隊列消息任務函數
void Send_task(void *pvParameters)
{BaseType_t xReturn = pdPASS;/* 定義一個創建信息返回值,默認為pdPASS */uint32_t send_data1 = 1;    //定義發送的數據uint32_t send_data2 = 2;    //定義發送的數據while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1){xReturn = xQueueSend(Task_Queue,&send_data1,10);//向隊列發送數據			if(pdPASS == xReturn)                           //判斷是否發送成功{OLED_ShowString(3,1,"Send_OK ");}}else{   xReturn = xQueueSend( Task_Queue,&send_data2,10);  OLED_ShowString(3,1,"Send_OFF");}vTaskDelay(20);}
}

總結

本文介紹了 STM32 中 FreeRTOS 操作系統的消息隊列功能,包括其創建、發送、接收等操作方法,以及在嵌入式開發中的應用實例,有助于提高多任務通信效率(如有不足,歡迎指出)。

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

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

相關文章

【開題答辯全過程】以 C語言程序設計課程網站為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

手機上有哪些比較好用的待辦事項提醒工具

在快節奏的現代工作中,我們每天都要面對大量的任務與事務。從項目截止日期、客戶會議,到日常的工作安排,瑣碎的事項容易讓人顧此失彼。 手機待辦事項工具早已突破傳統“記事本”的局限,成為移動辦公場景下的效率核心。它們通過任務…

Mysql數據庫事務全解析:概念、操作與隔離級別

MySQL系列 文章目錄MySQL系列一、什么是事務1.1事務的核心概念1.2、 事務的四大屬性(ACID)1.2.1 原子性(Atomicity)1.2.2 一致性(Consistency)1.2.3 隔離性(Isolation)1.2.4 持久性&…

【MCU EEPROM開發教程】

簡單來說把eeprom芯片當成一個傳感器來使用,通過IIC/SPI等協議對芯片進行讀寫操作,具體的讀寫操作涉及到一些算法—怎么樣讀寫更加快速,以及一些異常錯誤處理。 應用場景: 對于一些掉電也不能丟失的數據要存在eeprom/flash中&…

Docker將鏡像搬移到其他服務上的方法

導出/加載鏡像(保留分層、標簽)和導出/導入容器快照(僅文件系統,丟失鏡像歷史與標簽)。 一、把鏡像打包帶走(推薦) 適合把一個或多個鏡像搬到離線/內網機器,保留分層與標簽。 在源服…

Ubuntu 系統安裝 Miniconda 完整方法與注意事項

一、完整安裝步驟 1. 下載 Miniconda 安裝包 Miniconda 安裝包為 .sh 格式腳本,下載途徑分兩種: 方式 1:瀏覽器下載(適合新手) 訪問 Miniconda 官方下載頁,選擇對應系統版本(Ubuntu 選 Miniconda3-latest-Linux-x86_64.sh),默認保存到用戶目錄的 ~/Downloads 文件夾…

【后端】數據庫四大范式詳細解析

梳理一下 MySQL(或關系型數據庫)中的第一、二、三、四范式,這是數據庫設計中非常重要的規范化理論。1?? 第一范式 (1NF:First Normal Form)定義:字段具有原子性,不可再分。數據表中每一列都必須是不可分割…

HarmonyOS后臺任務調度:JobScheduler與WorkManager實戰指南

本文將深入探討HarmonyOS 5(API 12)中的后臺任務調度機制,重點講解JobScheduler和WorkManager的使用方法、適用場景及最佳實踐,幫助開發者實現高效、智能的后臺任務管理。 1. 后臺任務調度概述 HarmonyOS提供了兩種主要的后臺任務…

Prompt工程實踐

你在寫prompt時候,是不是總覺得大模型它不聽話。要么答非所問、要么一堆廢話。扒開思考過程仔細閱讀時而覺得它聰明絕頂,時而又覺得它愚蠢至極。明明已經對了怎么又推理到錯的地方去了,明明在提示詞中提醒過了不要這么思考它怎么就瞎想了。這…

基于springboot的畢業旅游一站式定制系統

博主介紹:java高級開發,從事互聯網行業六年,熟悉各種主流語言,精通java、python、php、爬蟲、web開發,已經做了多年的設計程序開發,開發過上千套設計程序,沒有什么華麗的語言,只有實…

輸入1.8V~5.5V 輸出28V DCDC升壓芯片TLV61046A

今天來一款TI的升壓芯片TLV61046A。輸入電壓范圍1.8V~5.5V。最高可以輸出28V。開關電流980mA,那具體能輸出多大的電流就得看輸入輸出的電壓了。以上面的輸入3.6V輸出12V為例,效率是85%,那最高可以輸出的電流就差不多只有200mA左右。封裝也是非…

ubuntu22.04源碼安裝ffmpeg-4.4

# ubuntu22.04源碼安裝ffmpeg-4.4cd /tmpwget https://ffmpeg.org/releases/ffmpeg-4.4.6.tar.xztar -xvf ffmpeg-4.4.6.tar.xzcd ffmpeg-4.4.6apt updateapt install -y yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libav…

Pyhon中字符串常用的函數

一、字符串的格式化1.format()方法format()是 Python 中用于字符串格式化的方法,通過占位符(如 {})動態插入變量或表達式。name小明 age18 grade99.556245585 information"我是{},今年{}歲了,考試得分:{:.2f}&quo…

小迪安全v2023學習筆記(八十一講)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE復現

文章目錄前記服務攻防——第八十一天開發框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE復現開發框架 - 常見語言開發框架PHP - 框架安全-Thinkphp&LaravelLaravel漏洞介紹漏洞復現CVE-2021-3129ThinkPHP漏洞介紹漏洞復現CVE-2018-1002015QVD-2022…

從音頻到Token:構建原神角色語音識別模型的完整實踐

本文將帶你從零實現一個基于音頻Token化的角色語音識別系統,完整復現原神角色語音分類任務,包含數據處理、模型訓練和推理全流程。音頻波形通過滑動窗口轉換為數值Token序列的過程 一、為什么需要音頻Token化? 傳統音頻處理通常依賴MFCC、頻譜…

關于TCP和UDP兩種網絡協議的區別

1、tcp協議TCP (Transmission Control Protocol - 傳輸控制協議)TCP 的核心目標是為應用層提供一條可靠的、無差錯的、有序的字節流通道。主要特點:面向連接:在數據傳輸之前,必須通過“三次握手”建立穩定的連接,傳輸結束后通過“…

Alibaba Lens:阿里巴巴推出的 AI 圖像搜索瀏覽器擴展,助力B2B采購

本文轉載自:https://www.hello123.com/alibaba-lens ** 一、🌟 一鍵截圖,輕松找貨:采購神器 Alibaba Lens 詳解 Alibaba Lens 是阿里巴巴集團專為全球 B2B 采購商打造的一款智能瀏覽器插件(支持 Chrome 等主流瀏覽器…

WPF常見問題清單

1.Grid 內容自動換行及自適應行高 <DataGrid Grid.Row"1" FontSize"14" IsReadOnly"True" VerticalScrollBarVisibility"Auto" RowHeight"NaN" ItemsSource"{Binding List}" AutoGenerateColumns"False…

Linux驅動開發筆記(十)——中斷

視頻&#xff1a;第13.1講 Linux中斷實驗-Linux內核中斷框架簡介_嗶哩嗶哩_bilibili 文檔&#xff1a;《【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.81.pdf》五十一章 1. 中斷API函數 每個中斷都有一個中斷號&#xff0c;通過中斷號即可區分不同的中斷。在Linux 內核中使用一…

ubuntu18.04安裝PCL1.14

簡化版說明 1. 安裝依賴庫&#xff1a; (1) boost1.84 &#xff08;https://www.boost.org/releases/1.84.0/&#xff09; tar vxf boost_xxx.tar.gz ./bootstrap.sh --prefix/usr/local/ ./b2 sudo ./b2 install (2) vtk9.1.0 &#xff08;https://vtk.org/files/releas…