色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用消息隊列進行通信

汽車電子技術 ? 來源:物聯網知識 ? 作者: 跋扈洋 ? 2023-01-20 11:42 ? 次閱讀

引言

我們在裸機開發中,每個函數之間進行數據通信往往采用全局變量。而在嵌入式開發中。我們在進行進程間通信的時候,往往采用消息隊列。對于操作系統來說,消息隊列是非常重要的一個數據結構。本文將介紹一下,如何使用消息隊列進行通信。

介紹

消息隊列概念

隊列又稱消息隊列,是一種常用于任務間通信的數據結構,隊列可以在任務與任務間、中斷和任務間傳遞信息,實現了任務接收來自其他任務或中斷的不固定長度的消息,任務能夠從隊列里面讀取消息,當隊列中的消息是空時,讀取消息的任務將被阻塞,用戶還可以指定阻塞的任務時間 xTicksToWait,在這段時間中,如果隊列為空,該任務將保持阻塞狀態以等待隊列數據有效。當隊列中有新消息時,被阻塞的任務會被喚醒并處理新消息;當等待的時間超過了指定的阻塞時間,即使隊列中尚無有效數據,任務也會自動從阻塞態轉為就緒態。消息隊列是一種異步的通信方式。

FreeRTOS中的消息隊列函數

  1. 設定消息隊列的格式:osMessageQDef(myQueue, len, size);
  • myQueue是消息隊列的名稱。
  • len是消息隊列的長度(有幾個消息)
  • size是每個消息的大小,也就是每個元素的格式
  1. 創建消息:osMessageCreate(osMessageQ(myQueue01), NULL);

    創建消息的函數,實際上是調用了FreeRTOS的osMessageCreate()函數,只不過HAL庫進行了封裝。

  2. 向消息隊列發送消息

    我們這里來介紹在中斷中發送消息。使用函數xQueueSendFromISR(QueueHandle,&Res,time);

    其中:

  • QueueHandle:消息隊列的句柄
  • &Res:要發送的數據的地址
  • time:阻塞時間,就是如果消息隊列滿的時候,任務應該阻塞多久
  1. 接收消息隊列中的消息

    xQueueReceive(QueueHandle,&queue_buffer,time);

  • QueueHandle:消息隊列的句柄
  • &queue_buffer:接收的消息要存放在的地址
  • time:阻塞時間,就是如果消息隊列空的時候,任務應該阻塞多久
  1. 查詢消息隊列中消息的數量

    uxQueueMessagesWaiting(myQueue01Handle),可以返回消息隊列(句柄為myQueue01Handle)中消息的數量,返回值為整數。

實例

需求分析

此樣例我們使用PC充當上位機,上位機發送數據后,在串口中斷函數中將接收到的PC數據發送在消息隊列myQueue01Handle中,之后在一個接收線程中接收這個消息的內容,并通過串口將接受到的消息的大小和內容輸出出來。

發送消息

當上位機PC下發數據后,串口中斷函數將接收到的數據發送在消息隊列中。

void USART3_IRQHandler(void)
{
	uint8_t Res;
if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_RXNE)!=RESET)//檢測到有單個字節的中斷
{
	HAL_UART_Receive(&huart3,&Res,1,0Xffff); 
	xQueueSendFromISR(myQueue01Handle,&Res,0)//發送消息
}
else if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE)!=RESET)//空閑中斷(代表這一幀數據傳輸完了)
{
	printf(" Receive a frame data.");
	__HAL_UART_CLEAR_IDLEFLAG(&huart3)
}

接收消息

我們創建一個任務,此任務的重要功能就是接收消息隊列中的消息。我們將接受到的消息的大小和內容通過串口發送出來。沒有消息的時候,一直實現LED的閃爍。

void LEDToggleTesk(void const * argument)
{
  /* USER CODE BEGIN LEDToggleTesk */
  BaseType_t xReturn=pdTRUE;//定義一個創建消息返回值,默認為pdTRUE
  UBaseType_t num_queue ;
  uint8_t Res[20];//存放我們接收到的一包數據
  uint8_t queue_buffer;
  int i=0;//接收數組下標
  for(;;)
  {
    i=0;
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
    num_queue=uxQueueMessagesWaiting(myQueue01Handle);//獲取消息隊列中有多少數據
    while(num_queue--)
    {
      xReturn=xQueueReceive(myQueue01Handle,&queue_buffer,0);//將消息隊列中的數據放在queue_buffer中
      if(xReturn)
      Res[i++]=queue_buffer;  
    }
    if(i!=0)
    printf(" count %d,LEDTask Receive %s",i,Res);//輸出接收消息的大小和內容
    osDelay(500);
  }
}

現象

PC端發送123456789,MCU回復

Receive a frame data

count 8,LEDTask Receive 12345678微信截圖_20230105161930.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據通信
    +關注

    關注

    2

    文章

    432

    瀏覽量

    33793
  • 嵌入式開發
    +關注

    關注

    18

    文章

    1033

    瀏覽量

    47612
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62750
收藏 人收藏

    評論

    相關推薦

    Linux下進程通訊消息隊列

    進行通信。 消息隊列與 FIFO 很相似,都是一個隊列結構,都可以有多個進程往隊列里面寫信息,多個進程從
    的頭像 發表于 08-19 19:56 ?1841次閱讀
    Linux下進程通訊消息<b class='flag-5'>隊列</b>

    不同VI間的隊列通信問題

    使用生產者消費者循環做多VI間的數據通信,VI1中處理的數據進入VI2的隊列中,請問VI2的隊列如何在VI1中引用?點隊列引用右鍵創建常量么?
    發表于 12-25 14:32

    dsp與labview進行串口實時通信,每次接受的數據存在數組里還是存在隊列里呢?

    dsp與labview進行串口實時通信,每次接受的數據存在數組里還是存在隊列里呢?
    發表于 03-26 18:07

    使用隊列進行多串口通信的數據儲存有什么好方法?

    兩個串口通信,現需要將通訊獲得的數據存進EXCEL同一SHEET里面,想嘗試使用隊列但無法解決存進EXCEL的同一行,想問問有無更好的解決發放,現在兩個通信程序皆可正常運行,僅數據儲存模塊不知怎么解決。
    發表于 05-03 14:40

    請問ESP32單核如何使用FreeRTOS測試隊列進行任務間通信

    請問ESP32單核如何使用FreeRTOS測試隊列進行任務間通信
    發表于 01-14 07:12

    請問ESP32雙核如何使用隊列進行任務間通信

    隊列是什么?ESP32雙核如何使用隊列進行任務間通信
    發表于 01-14 07:24

    FreeRTOS隊列創建任務間通信的基本應用程序

    應用程序 : 此代碼是 FreeRTOS 隊列創建任務間通信的基本應用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    發表于 08-22 07:12

    FreeRTOS隊列創建任務間通信的基本應用程序

    應用程序 : 此代碼是 FreeRTOS 隊列創建任務間通信的基本應用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    發表于 08-30 07:56

    什么是消息隊列?消息隊列中間件重要嗎?

    應用解耦:消息隊列減少了服務之間的耦合性,不同的服務可以通過消息隊列進行通信,而不用關心彼此的實現細節。
    的頭像 發表于 11-07 14:55 ?1435次閱讀

    如何使用消息隊列進行通信

    我們在裸機開發中,每個函數之間進行數據通信往往采用全局變量。而在嵌入式開發中。我們在進行進程間通信的時候,往往采用消息隊列。對于操作系統來說,消息
    的頭像 發表于 01-20 16:32 ?1424次閱讀

    嵌入式環形隊列和消息隊列的實現

    嵌入式環形隊列和消息隊列是實現數據緩存和通信的常見數據結構,廣泛應用于嵌入式系統中的通信協議和領域。
    的頭像 發表于 04-14 11:52 ?1579次閱讀

    嵌入式環形隊列和消息隊列是如何去實現的?

    嵌入式環形隊列和消息隊列是實現數據緩存和通信的常見數據結構,廣泛應用于嵌入式系統中的通信協議和領域。
    發表于 05-20 14:55 ?1141次閱讀

    FreeRTOS消息隊列介紹

    隊列是為了任務與任務、任務與中斷之間的通信而準備的,可以在任務與任務、任務與中斷之間傳遞消息,隊列中可以存儲有限的、大小固定的數據項目。任務與任務、任務與中斷之間要交流的數據保存在隊列
    的頭像 發表于 07-06 16:58 ?826次閱讀
    FreeRTOS消息<b class='flag-5'>隊列</b>介紹

    進程間通信的消息隊列介紹

    消息隊列是一種非常常見的進程間通信方式。
    的頭像 發表于 04-08 17:27 ?314次閱讀

    JavaWeb消息隊列使用指南

    用程序的通信方法,允許異步傳輸消息,并且具有存儲和轉發消息的能力。它主要解決以下問題: 異步處理 :允許系統組件異步處理任務,提高響應速度。 解耦系統 :不同系統組件之間通過消息隊列通信,降低耦合度。 流量削峰 :在高流量情況下
    的頭像 發表于 11-25 09:27 ?162次閱讀
    主站蜘蛛池模板: 伊人久久大香线蕉综合电影| 免费无码国产欧美久久18| 亚洲欧美综合中文字幕| 妺妺窝人体色WWW偷窥女厕 | 高清国语自产拍免费| 主播蜜汁丝袜精品自拍| 亚洲 色 欧美 爱 视频 日韩| 女人麻豆国产香蕉久久精品| 精品国产自在天天线2019| 国产成人高清在线观看播放| 99re在这里只有精品| 尤物国产在线精品三区| 无码一区二区三区| 强开少妇嫩苞又嫩又紧九色| 老牛天天晚上夜噜噜噜| 精品99久久久久成人网站| 国产AV果冻传奇麻豆| www.青青草.com| 91天仙tv嫩模福利| 制服丝袜第一页| 亚洲伊人精品| 亚洲第一区欧美日韩精品| 双性将军粗壮H灌满怀孕| 人人草人人草| 欧美日韩国产高清综合二区| 美女露出逼| 麻豆传煤网站网址入口在线下载 | 国拍在线精品视频免费观看| 国产69精品久久久熟女| 大地影院在线播放| 超碰98人人插| 不用播放器的黄| 超清无码波多野吉衣与黑人| jk制服喷水| 99视频这里只有精品| 9277高清在线观看视频| 51国产偷自视频在线视频播放| 最新国产av.在线视频| 24小时日本在线电影| 69精品人妻一区二区三区蜜桃| 最近的2019中文字幕国语完整版 |