RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

FreeRTOS消息隊列介紹

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-06 16:58 ? 次閱讀

隊列是為了任務(wù)與任務(wù)、任務(wù)與中斷之間的通信而準備的,可以在任務(wù)與任務(wù)、任務(wù)與中斷之間傳遞消息,隊列中可以存儲有限的、大小固定的數(shù)據(jù)項目。任務(wù)與任務(wù)、任務(wù)與中斷之間要交流的數(shù)據(jù)保存在隊列中,叫做隊列項目。隊列所能保存的最大數(shù)據(jù)項目數(shù)量叫做隊列的長度,創(chuàng)建隊列的時候會指定數(shù)據(jù)項目的大小和隊列的長度。

通常隊列采用先進先出(FIFO)的存儲緩沖機制,也就是往隊列發(fā)送數(shù)據(jù)的時候(也叫入隊)永遠都是發(fā)送到隊列的尾部,而從隊列提取數(shù)據(jù)的時候(也叫出隊)是從隊列的頭部提取的。但是也可以使用

LIFO 的存儲緩沖,也就是后進先出,FreeRTOS 中的隊列也提供了 LIFO 的存儲緩沖機制。

數(shù)據(jù)發(fā)送到隊列中會導(dǎo)致數(shù)據(jù)拷貝,也就是將要發(fā)送的數(shù)據(jù)拷貝到隊列中,這就意味著在隊列中存儲的是數(shù)據(jù)的原始值,而不是原數(shù)據(jù)的引用(即只傳遞數(shù)據(jù)的指針),這個也叫做值傳遞。UCOS

的消息隊列采用的是引用傳遞,傳遞的是消息指針。采用引用傳遞的話消息內(nèi)容就必須一直保持可見性,也就是消息內(nèi)容必須有效,那么局部變量這種可能會隨時被刪掉的東西就不能用來傳遞消息,但是采用引用傳遞會節(jié)省時間??!因為不用進行數(shù)據(jù)拷貝。

采用值傳遞的話雖然會導(dǎo)致數(shù)據(jù)拷貝,會浪費一點時間,但是一旦將消息發(fā)送到隊列中原始的數(shù)據(jù)緩沖區(qū)就可以刪除掉或者覆寫,這樣的話這些緩沖區(qū)就可以被重復(fù)的使用。FreeRTOS中使用隊列傳遞消息的話雖然使用的是數(shù)據(jù)拷貝,但是也可以使用引用來傳遞消息啊,我直接往隊列中發(fā)送指向這個消息的地址指針不就可以了!這樣當我要發(fā)送的消息數(shù)據(jù)太大的時候就可以直接發(fā)送消息緩沖區(qū)的地址指針,比如在網(wǎng)絡(luò)應(yīng)用環(huán)境中,網(wǎng)絡(luò)的數(shù)據(jù)量往往都很大的,采用數(shù)據(jù)拷貝的話就不現(xiàn)實。

1、多任務(wù)訪問

隊列不是屬于某個特別指定的任務(wù)的,任何任務(wù)都可以向隊列中發(fā)送消息,或者從隊列中提取消息。

2、出隊阻塞

當任務(wù)嘗試從一個隊列中讀取消息的時候可以指定一個阻塞時間,這個阻塞時間就是當任務(wù)從隊列中讀取消息無效的時候任務(wù)阻塞的時間。出隊就是就從隊列中讀取消息,出隊阻塞是針對從隊列中讀取消息的任務(wù)而言的。

比如任務(wù) A 用于處理串口接收到的數(shù)據(jù),串口接收到數(shù)據(jù)以后就會放到隊列 Q 中,任務(wù) A 從隊列 Q 中讀取數(shù)據(jù)。但是如果此時隊列 Q

是空的,說明還沒有數(shù)據(jù),任務(wù) A 這時候來讀取的話肯定是獲取不到任何東西,那該怎么辦呢?任務(wù) A

現(xiàn)在有三種選擇,一:二話不說扭頭就走,二:要不我在等等吧,等一會看看,說不定一會就有數(shù)據(jù)了,三:死等,死也要等到你有數(shù)據(jù)!選哪一個就是由這個阻塞時間決定的,這個阻塞時間單位是時鐘節(jié)拍數(shù)。阻塞時間為

0 的話就是不阻塞,沒有數(shù)據(jù)的話就馬上返回任務(wù)繼續(xù)執(zhí)行接下來的代碼,對應(yīng)第一種選擇。如果阻塞時間為 0~

portMAX_DELAY,當任務(wù)沒有從隊列中獲取到消息的話就進入阻塞態(tài),阻塞時間指定了任務(wù)進入阻塞態(tài)的時間,當阻塞時間到了以后還沒有接收到數(shù)據(jù)的話就退出阻塞態(tài),返回任務(wù)接著運行下面的代碼,如果在阻塞時間內(nèi)接收到了數(shù)據(jù)就立即返回,執(zhí)行任務(wù)中下面的代碼,這種情況對應(yīng)第二種選擇。當阻塞時間設(shè)置為portMAX_DELAY

的話,任務(wù)就會一直進入阻塞態(tài)等待,直到接收到數(shù)據(jù)為止!這個就是第三種選擇。

3、入隊阻塞

入隊說的是向隊列中發(fā)送消息,將消息加入到隊列中。和出隊阻塞一樣,當一個任務(wù)向隊列發(fā)送消息的話也可以設(shè)置阻塞時間。比如任務(wù) B 向消息隊列 Q

發(fā)送消息,但是此時隊列 Q 是滿的,那肯定是發(fā)送失敗的。此時任務(wù) B 就會遇到和上面任務(wù) A 一樣的問題,這兩種情況的處理過程是類似的,只不過一個是向隊列 Q

發(fā)送消息,一個是從隊列 Q 讀取消息而已。

4、隊列操作過程圖示

圖片圖片圖片圖片圖片

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

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304796
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88940
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62139
收藏 人收藏

    評論

    相關(guān)推薦

    基于FreeRTOS的STM32F103系統(tǒng)—隊列

    FreeRTOS中,隊列是實現(xiàn)任務(wù)之間同步、互斥和通信的一種重要方法(其他的實現(xiàn)方法有:任務(wù)通知、事件組、信號量、互斥量)。
    的頭像 發(fā)表于 11-10 11:37 ?1129次閱讀
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系統(tǒng)—<b class='flag-5'>隊列</b>

    轉(zhuǎn):第20章 FreeRTOS消息隊列

    第20章FreeRTOS消息隊列 本章節(jié)為大家講解FreeRTOS的一個重要的通信機制----消息隊列,初學(xué)者要熟練掌握,因為消息隊列在實際
    發(fā)表于 09-04 14:41

    FreeRTOS創(chuàng)建消息隊列問題如何解決

    剛開始學(xué)習FreeRTOS,用的是STM32F103RCT6,目前創(chuàng)建了三個任務(wù),運行指示燈、按鍵、顯示。其中顯示任務(wù)里是暫時還沒有具體的代碼,按鍵任務(wù)準備使用隊列傳遞按鍵值?,F(xiàn)在的問題是這樣
    發(fā)表于 07-19 08:03

    FreeRTOS中的隊列如何使用?

    FreeRTOS中的隊列如何使用?
    發(fā)表于 12-09 06:24

    FreeRTOS消息隊列有何作用

    FreeRTOS消息隊列 & ESP32實戰(zhàn)FreeRTOS消息隊列FreeRTOS的消息隊列
    發(fā)表于 01-27 06:53

    FreeRTOS源碼介紹

    。而且一些常用的功能,隊列,內(nèi)存管理,信號量之類的,都有,基本上徹底弄懂一個,對以后理解別的也有幫助。1. FreeRTOS介紹FreeRTOS其實不用再多
    發(fā)表于 02-14 07:42

    FreeRTOS消息隊列和RT-Thread消息隊列的使用注意事項介紹

    一、FreeRTOS消息隊列1.1 創(chuàng)建消息隊列xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, // 隊列
    發(fā)表于 05-25 15:32

    FreeRTOS消息隊列 & ESP32使用

    FreeRTOS消息隊列 & ESP32實戰(zhàn)FreeRTOS消息隊列FreeRTOS的消息隊列
    發(fā)表于 12-03 17:51 ?1次下載
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>隊列</b> & ESP32使用

    FreeRTOS學(xué)習(五)消息隊列和二值信號量 xQueue / xSemaphore

    消息隊列可以和中斷 人物間發(fā)送和接受不定長的消息,在消息隊列中會使任務(wù)進入阻塞。 可以在調(diào)度器開始前,創(chuàng)建消息隊列。#include "FreeRTOS.h"#include
    發(fā)表于 12-04 20:06 ?7次下載
    <b class='flag-5'>FreeRTOS</b>學(xué)習(五)消息<b class='flag-5'>隊列</b>和二值信號量 xQueue / xSemaphore

    FreeRTOS消息隊列 傳遞結(jié)構(gòu)體指針和結(jié)構(gòu)體異同

    FreeRTOS消息隊列 傳遞結(jié)構(gòu)體指針和結(jié)構(gòu)體異同
    發(fā)表于 12-08 12:06 ?6次下載
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>隊列</b> 傳遞結(jié)構(gòu)體指針和結(jié)構(gòu)體異同

    FreeRTOS 隊列 信號量 互斥量

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥量微信公眾號前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX生成帶
    發(fā)表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> <b class='flag-5'>隊列</b> 信號量 互斥量

    FreeRTOS高級篇5---FreeRTOS隊列分析

    FreeRTOS提供了多種任務(wù)間通訊方式,包括:任務(wù)通知(版本V8.2以及以上版本)隊列二進制信號量計數(shù)信號量互斥量遞歸互斥量其中,二進制...
    發(fā)表于 01-26 17:40 ?9次下載
    <b class='flag-5'>FreeRTOS</b>高級篇5---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>隊列</b>分析

    FreeRTOS系列第18篇---FreeRTOS隊列API函數(shù)

    FreeRTOS為操作隊列提供了非常豐富的API函數(shù),包括隊列的創(chuàng)建、刪除,靈活的入隊和出隊方式、帶中斷保護的入隊和出隊等等。下面就來詳細...
    發(fā)表于 01-26 17:44 ?11次下載
    <b class='flag-5'>FreeRTOS</b>系列第18篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>隊列</b>API函數(shù)

    FreeRTOS的消息隊列

    基于 FreeRTOS 的應(yīng)用程序由一組獨立的任務(wù)構(gòu)成——每個任務(wù)都是具有獨立權(quán)限的程序。這些獨立的任務(wù)之間的通訊與同步一般都是基于操作系統(tǒng)提供的IPC通訊機制,而FreeRTOS 中所有的通信與同步機制都是基于隊列實現(xiàn)的。
    的頭像 發(fā)表于 02-14 09:56 ?885次閱讀
    <b class='flag-5'>FreeRTOS</b>的消息<b class='flag-5'>隊列</b>

    FreeRTOS消息隊列結(jié)構(gòu)體

    有一個結(jié)構(gòu)體用于描述隊列,叫做 Queue_t,這個結(jié)構(gòu)體在文件 queue.c 中定義。 3、隊列創(chuàng)建 在使用隊列之前必須先創(chuàng)建隊列,有兩種創(chuàng)建
    的頭像 發(fā)表于 07-06 17:03 ?1094次閱讀
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>隊列</b>結(jié)構(gòu)體
    RM新时代网站-首页