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

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

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

FreeRTOS消息隊(duì)列介紹

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

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

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

LIFO 的存儲(chǔ)緩沖,也就是后進(jìn)先出,FreeRTOS 中的隊(duì)列也提供了 LIFO 的存儲(chǔ)緩沖機(jī)制。

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

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

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

1、多任務(wù)訪問

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

2、出隊(duì)阻塞

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

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

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

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

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

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

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

3、入隊(duì)阻塞

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

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

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

4、隊(duì)列操作過程圖示

圖片圖片圖片圖片圖片

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

    關(guān)注

    5059

    文章

    18974

    瀏覽量

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

    關(guān)注

    8

    文章

    6817

    瀏覽量

    88743
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61918
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

    第20章FreeRTOS消息隊(duì)列 本章節(jié)為大家講解FreeRTOS的一個(gè)重要的通信機(jī)制----消息隊(duì)列,初學(xué)者要熟練掌握,因?yàn)橄?b class='flag-5'>隊(duì)列在實(shí)際
    發(fā)表于 09-04 14:41

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

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

    FreeRTOS中的隊(duì)列如何使用?

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

    FreeRTOS消息隊(duì)列有何作用

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

    FreeRTOS源碼介紹

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

    FreeRTOS消息隊(duì)列和RT-Thread消息隊(duì)列的使用注意事項(xiàng)介紹

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

    FreeRTOS消息隊(duì)列 & ESP32使用

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

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

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

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

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

    FreeRTOS 隊(duì)列 信號量 互斥量

    文章目錄前言Queue 隊(duì)列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'>隊(duì)列</b> 信號量 互斥量

    FreeRTOS高級篇5---FreeRTOS隊(duì)列分析

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

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

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

    FreeRTOS的消息隊(duì)列

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

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

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