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

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

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

RTOS消息隊列的多種用途

星星科技指導(dǎo)員 ? 來源:嵌入式計算設(shè)計 ? 作者:Jean Labrosse ? 2022-06-29 14:57 ? 次閱讀

RTOS 是一種軟件,可以盡可能高效地管理中央處理單元 (CPU)、微處理單元 (MPU) 甚至數(shù)字信號處理器DSP) 的時間。大多數(shù) RTOS 內(nèi)核都是用 C 編寫的,需要一小部分用 ASSEMBLY 語言編寫的代碼來使內(nèi)核適應(yīng)不同的 CPU 架構(gòu)。

RTOS 內(nèi)核為程序員提供了許多有用的服務(wù),例如多任務(wù)處理、中斷管理、通過消息隊列的任務(wù)間通信、信令、資源管理、時間管理、內(nèi)存分區(qū)管理等等。

應(yīng)用程序(即最終產(chǎn)品)基本上分為多個任務(wù),每個任務(wù)負責(zé)應(yīng)用程序的一部分。任務(wù)是一個簡單的程序,它認為它自己擁有 CPU。每個任務(wù)都根據(jù)任務(wù)的重要性分配一個優(yōu)先級。

什么是消息隊列?

如圖 1 所示,消息隊列是一個內(nèi)核對象(即數(shù)據(jù)結(jié)構(gòu)),消息通過它從中斷服務(wù)例程 (ISR) 或任務(wù)發(fā)送(即,發(fā)布)到另一個任務(wù)(即,掛起)。一個應(yīng)用程序可以有任意數(shù)量的消息隊列,每個隊列都有自己的用途。例如,消息隊列可用于將從通信接口 ISR 接收到的數(shù)據(jù)包傳遞給任務(wù),該任務(wù)又負責(zé)處理數(shù)據(jù)包。另一個隊列可用于將內(nèi)容傳遞給將負責(zé)正確更新顯示的顯示任務(wù)。

poYBAGK7-BCAa0fqAADeuVJW2Rk395.png

圖 1.消息隊列是用于將內(nèi)容傳遞給任務(wù)的內(nèi)核對象。

消息通常是指向包含實際消息的存儲區(qū)域的空指針。但是,指針可以指向任何東西,甚至是接收任務(wù)要執(zhí)行的函數(shù)。因此,消息的含義取決于應(yīng)用程序。每個消息隊列都可以配置其將容納的存儲量??梢詫⑾㈥犃信渲脼楸4鎲蝹€消息(也稱為郵箱)或N條消息。隊列的大小取決于應(yīng)用程序以及接收任務(wù)在隊列填滿之前處理消息的速度。

如果一個任務(wù)掛起(即等待)一條消息并且隊列中沒有消息,那么該任務(wù)將阻塞,直到一條消息被發(fā)布(即發(fā)送)到隊列中。由于 RTOS 運行其他任務(wù),因此等待任務(wù)在等待消息時不消耗 CPU 時間。如圖 1 所示,掛起的任務(wù)可以指定一個超時時間。如果在指定的超時時間內(nèi)沒有收到消息,則當該任務(wù)成為最高優(yōu)先級任務(wù)時,將允許該任務(wù)恢復(fù)執(zhí)行(即解除阻塞)。當任務(wù)執(zhí)行時,它基本上被告知它被恢復(fù)的原因是因為超時,因此沒有收到消息。

消息隊列通常實現(xiàn)為先進先出 (FIFO),這意味著接收到的第一條消息將是從隊列中提取的第一條消息。但是,某些內(nèi)核允許您發(fā)送被認為比其他內(nèi)核更重要的消息,因此可以在隊列的頭部發(fā)布。換句話說,按照后進先出 (LIFO) 的順序,使該消息成為任務(wù)提取的第一個消息。

消息隊列的一個重要方面是消息本身需要從發(fā)送到處理期間保持在范圍內(nèi)。這意味著您不能將指針傳遞給堆棧變量、可以被其他代碼更改的全局變量等等。為了使消息保持在范圍內(nèi),您通常會填充從池中獲取的結(jié)構(gòu)如圖 2 所示。發(fā)送消息的 ISR 或任務(wù)將從池中獲取一個結(jié)構(gòu),填充該結(jié)構(gòu),并將指向該結(jié)構(gòu)的指針發(fā)布到隊列中。接收任務(wù)將從隊列中提取指針,處理結(jié)構(gòu),完成后將結(jié)構(gòu)返回到池中。當然,發(fā)送方和接收方都需要使用同一個池,除非數(shù)據(jù)結(jié)構(gòu)中的字段指示使用了哪個池。

poYBAGK7-BiAUElQAABCfnUEn9Q907.png

圖 2.消息存儲區(qū)池

在 RTOS 中消息隊列的許多實現(xiàn)中,如果隊列已滿,發(fā)送到隊列的消息將被丟棄。通常這不是問題,應(yīng)用程序的邏輯可以從這種情況中恢復(fù)。但是,實現(xiàn)一種機制相當容易,這樣發(fā)送任務(wù)將阻塞,直到接收方提取其中一條消息,如圖 3 所示:

1.計數(shù)信號量初始化為隊列可以接受的最大條目數(shù)對應(yīng)的值。

2.在允許發(fā)送消息到隊列之前,發(fā)送任務(wù)在信號量上掛起。如果信號量值為零,則發(fā)送方等待。

3.如果該值非零,則信號量計數(shù)遞減,并且發(fā)送方將其消息發(fā)布到隊列中。

4.消息的接收者像往常一樣在消息隊列中掛起一個。

5.當接收到消息時,接收者從隊列中提取指向消息的指針并向信號量發(fā)出信號,表明隊列中的條目已被釋放。

poYBAGK7-B-AHFZkAADUyYSwCO4928.png

圖 3.如果隊列已滿,則阻止發(fā)送者。

如圖所示,此機制僅適用于兩個任務(wù),因為不允許 ISR 掛在信號量上。

消息隊列的其他用途

圖 4 顯示了消息隊列的不同用途:

1-4。如前所述,消息隊列通常用于將消息從 ISR 或任務(wù)發(fā)送到另一個任務(wù)。

5.但是,如果消息適合指針的字長,則不必發(fā)送實際消息并分配存儲區(qū)域。例如,如果指針是 32 位寬,那么您可以將從 12 位 ADC 讀取的模數(shù)轉(zhuǎn)換器ADC) 轉(zhuǎn)換為指針并通過消息隊列發(fā)送它。只要接收者知道將值轉(zhuǎn)換回整數(shù),它就是完全合法的。

6-7。如果任務(wù)知道消息不會發(fā)送給它,它可以使用超時機制將自己延遲一段時間。在這種情況下,能夠容納單個條目的隊列就足夠了。事實上,如果另一個任務(wù)或 ISR 發(fā)送消息,延遲將被中止,這可能是您想要實現(xiàn)的行為。

8.消息隊列可以用作信號量來簡單地向任務(wù)發(fā)出事件發(fā)生的信號。在這種情況下,消息可以是任何東西。隊列的大小取決于應(yīng)用程序需要緩沖多少信號。

9-10。消息隊列也可以用作二進制信號量或計數(shù)信號量以進行資源共享。對于二進制信號量,隊列將包含單個消息,并且將在隊列中放置一條消息(任何值)。要訪問資源,任務(wù)將在隊列中掛起。如果隊列中有消息,則任務(wù)將獲得對資源的訪問權(quán)。一旦完成資源,隊列將被發(fā)布,從而根據(jù)需要放棄資源以供其他任務(wù)使用。相同的機制適用于實現(xiàn)具有N個 資源的計數(shù)信號量,并且隊列將預(yù)先填充N個 虛擬消息。

11.消息實際上可用于模擬事件標志,其中 32 位指針大小變量(轉(zhuǎn)換為整數(shù))的每一位都可以表示一個事件。

12.可以使用消息隊列來實現(xiàn)棧結(jié)構(gòu)。這基本上是 LIFO 機制的另一種用法。

poYBAGK7-CmAQBrlAAFPIRAHHRg171.png

圖 4.消息隊列的許多用途中的一些。

概括

消息隊列可以以多種不同的方式使用。事實上,您可以編寫可能只使用消息隊列的相當復(fù)雜的應(yīng)用程序。僅使用消息隊列可以減少代碼的大?。凑加每臻g),因為可以模擬許多其他服務(wù)(信號量、時間延遲和事件標志)。

審核編輯:郭婷

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

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209371
  • MPU
    MPU
    +關(guān)注

    關(guān)注

    0

    文章

    333

    瀏覽量

    48607
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

    119113
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式環(huán)形隊列與消息隊列的實現(xiàn)原理

    嵌入式環(huán)形隊列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊列,是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲區(qū)域中高效地存儲和訪問數(shù)據(jù)。其主要特點包括固定大小的數(shù)組和兩個指針(頭指針和尾指針),分別指向隊列的起始位置和結(jié)束位置。
    的頭像 發(fā)表于 09-02 15:29 ?144次閱讀

    freertos和rtos區(qū)別是什么

    FreeRTOS 和 RTOS(實時操作系統(tǒng))是兩個不同的概念,但它們之間有緊密的聯(lián)系。FreeRTOS 是一個特定的開源實時操作系統(tǒng),而 RTOS 是實時操作系統(tǒng)的一般概念。 概念定義 RTOS
    的頭像 發(fā)表于 09-02 14:18 ?330次閱讀

    RTOS的特性和類型

    實時操作系統(tǒng)(RTOS)是一種可運行實時計算應(yīng)用程序的軟件平臺,用于處理具有明確時間約束的事件和數(shù)據(jù)。與通用操作系統(tǒng)(GPOS)不同,RTOS必須在有限的硬件資源上調(diào)度應(yīng)用程序之間的處理和數(shù)據(jù)共享
    的頭像 發(fā)表于 08-20 11:29 ?286次閱讀

    RTOS開發(fā)最佳實踐

    基于RTOS編寫應(yīng)用程序時,有一些要注意事項。在本節(jié)中,您將學(xué)習(xí)RTOS開發(fā)最佳實踐,例如POSIX合規(guī)性、安全性和功能安全認證。
    的頭像 發(fā)表于 08-20 11:24 ?234次閱讀

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

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

    基于RTOS的應(yīng)用進程中的典型線程

    RTOS中的關(guān)鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應(yīng)速度或可預(yù)測性,而不是它在給定時間段內(nèi)可以執(zhí)行的工作量。
    發(fā)表于 03-05 09:32 ?416次閱讀
    基于<b class='flag-5'>RTOS</b>的應(yīng)用進程中的典型線程

    裸機中環(huán)形隊列RTOS中消息隊列有何區(qū)別呢?

    “環(huán)形隊列”和“消息隊列”在嵌入式領(lǐng)域有應(yīng)用非常廣泛,相信有經(jīng)驗的嵌入式軟件工程師對它們都不陌生。
    的頭像 發(fā)表于 01-26 09:38 ?577次閱讀
    裸機中環(huán)形<b class='flag-5'>隊列</b>與<b class='flag-5'>RTOS</b>中消息<b class='flag-5'>隊列</b>有何區(qū)別呢?

    labview 隊列最前端插入的應(yīng)用

    LabVIEW是一種用于實時測試、測量和控制系統(tǒng)的高級系統(tǒng)設(shè)計軟件。它采用了數(shù)據(jù)流編程方式,提供了一種直觀、可視化的方法來構(gòu)建復(fù)雜的測試和測量應(yīng)用程序。其中一個重要的功能是隊列,它可以在軟件設(shè)計中
    的頭像 發(fā)表于 01-08 11:45 ?970次閱讀

    labview隊列有什么實際作用

    LabVIEW隊列是一種數(shù)據(jù)結(jié)構(gòu),常用于解決多任務(wù)并發(fā)處理的問題。它被廣泛應(yīng)用于科學(xué)研究、工程項目和自動化控制等領(lǐng)域。在LabVIEW中,隊列提供了一種高效、方便的方式來處理不同任務(wù)之間的數(shù)據(jù)
    的頭像 發(fā)表于 01-05 16:42 ?1246次閱讀

    聊一聊消息隊列技術(shù)選型的7種消息場景

    我們在做消息隊列的技術(shù)選型時,往往會結(jié)合業(yè)務(wù)場景進行考慮。今天來聊一聊消息隊列可能會用到的 7 種消息場景。
    的頭像 發(fā)表于 12-09 17:50 ?1160次閱讀
    聊一聊消息<b class='flag-5'>隊列</b>技術(shù)選型的7種消息場景

    無鎖隊列解決的問題

    為什么需要無鎖隊列 無鎖隊列解決了什么問題?無鎖隊列解決了鎖引起的問題。 cache失效 當CPU要訪問主存的時候,這些數(shù)據(jù)首先要被copy到cache中,因為這些數(shù)據(jù)在不久的將來可能又會被處理器
    的頭像 發(fā)表于 11-10 15:33 ?743次閱讀
    無鎖<b class='flag-5'>隊列</b>解決的問題

    RTOS內(nèi)核源碼,非必要不建議閱讀

    在2011、12年讀書的時候,RTOS還不像現(xiàn)在這么流行(那時還是以“裸機”為主),那個時候網(wǎng)上RTOS的教程大多都還是以μCOS為主,其他RTOS的資料相對很少。像FreeRTOS、RT-Thread以及其他
    的頭像 發(fā)表于 10-30 16:37 ?585次閱讀
    <b class='flag-5'>RTOS</b>內(nèi)核源碼,非必要不建議閱讀

    消息隊列的發(fā)展歷史

    上一篇我們用一個秒殺案例探討了我們?yōu)槭裁葱枰?b class='flag-5'>隊列。今天我們來回顧一下消息隊列的發(fā)展歷史。
    的頭像 發(fā)表于 10-30 10:49 ?866次閱讀
    消息<b class='flag-5'>隊列</b>的發(fā)展歷史

    RTOS相比裸機有什么優(yōu)點?RTOS相比裸機更方便嗎?

    RTOS相比裸機有什么優(yōu)點?RTOS相比裸機更方便嗎? RTOS代表實時操作系統(tǒng),專門為需要高可靠性和可預(yù)測性的系統(tǒng)設(shè)計。相比之下,裸金屬或“裸”系統(tǒng)的硬件或軟件層最少,嚴重依賴開發(fā)人員的代碼來處
    的頭像 發(fā)表于 10-29 16:33 ?1404次閱讀

    兩個棧實現(xiàn)一個隊列方法

    棧和隊列是比較基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。無論在工作中,還是在面試中,棧和隊列都用的比較多。在計算機的世界,你會看到隊列和棧,無處不在。 棧:一個先進后出的數(shù)據(jù)結(jié)構(gòu) 隊列:一個先進先出的數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 10-08 15:54 ?716次閱讀