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

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

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

3天內不再提示

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

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

引言

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

介紹

消息隊列概念

隊列又稱消息隊列,是一種常用于任務間通信的數據結構,隊列可以在任務與任務間、中斷和任務間傳遞信息,實現了任務接收來自其他任務或中斷的不固定長度的消息,任務能夠從隊列里面讀取消息,當隊列中的消息是空時,讀取消息的任務將被阻塞,用戶還可以指定阻塞的任務時間 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

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

    關注

    5087

    文章

    19147

    瀏覽量

    306152
  • 操作系統
    +關注

    關注

    37

    文章

    6853

    瀏覽量

    123434
  • 消息隊列
    +關注

    關注

    0

    文章

    33

    瀏覽量

    3010
收藏 人收藏

    評論

    相關推薦

    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 11:42 ?1373次閱讀
    如何使用消息<b class='flag-5'>隊列</b><b class='flag-5'>進行</b><b class='flag-5'>通信</b>

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

    嵌入式環形隊列和消息隊列是實現數據緩存和通信的常見數據結構,廣泛應用于嵌入式系統中的通信協議和領域。
    的頭像 發表于 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次閱讀
    主站蜘蛛池模板: 人妻无码AV中文系列| 欧美大片免费| 色爰情人网站| 国产精品综合AV一区二区国产馆 | 麻豆无人区乱码| free性中国hd护士高清| 特黄特黄aaaa级毛片免费看| 国精产品一区二区三区有限公司| 依恋影院在线观看| 亲胸揉胸膜下刺激视频在线观看 | 星空无限传媒视频在线观看视频| 精品国产乱码久久久久久乱码| 92国产精品午夜免费福利视频| 手机在线免费观看毛片| 久久囯产精品777蜜桃传媒| caoporn免费视频在线| 亚洲成人黄色在线| 男女XX00上下抽搐动态图| 国产精品久久久久久久久久免费| 一亲二脱三插| 色大姐综合网| 老司机无码精品A| 国产高清精品自在久久| 在教室伦流澡到高潮H免费视频| 日日AV夜夜添久久奶无码| 久久婷婷电影网| 国产精品v欧美精品v日韩| 2020国产欧洲精品视频| 亚洲成人一区二区| 青青热久精品国产亚洲AV无码| 婚后被调教当众高潮H喷水| 超碰人人澡人人胔| 永久免费在线观看视频| 网友自拍偷拍| 欧美精品九九99久久在观看| 鸡鸡插屁股| 国产精品久久久久久久久久影院| 99久久e免费热视频百度| 一本道高清码v京东热| 王晶经典三级| 日本久久久WWW成人免费毛片丨|