在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

RTOS消息隊列的多種用途

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

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

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

應用程序(即最終產品)基本上分為多個任務,每個任務負責應用程序的一部分。任務是一個簡單的程序,它認為它自己擁有 CPU。每個任務都根據任務的重要性分配一個優先級。

什么是消息隊列?

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

poYBAGK7-BCAa0fqAADeuVJW2Rk395.png

圖 1.消息隊列是用于將內容傳遞給任務的內核對象。

消息通常是指向包含實際消息的存儲區域的空指針。但是,指針可以指向任何東西,甚至是接收任務要執行的函數。因此,消息的含義取決于應用程序。每個消息隊列都可以配置其將容納的存儲量。可以將消息隊列配置為保存單個消息(也稱為郵箱)或N條消息。隊列的大小取決于應用程序以及接收任務在隊列填滿之前處理消息的速度。

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

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

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

poYBAGK7-BiAUElQAABCfnUEn9Q907.png

圖 2.消息存儲區池

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

1.計數信號量初始化為隊列可以接受的最大條目數對應的值。

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

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

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

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

poYBAGK7-B-AHFZkAADUyYSwCO4928.png

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

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

消息隊列的其他用途

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

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

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

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

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

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

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

12.可以使用消息隊列來實現棧結構。這基本上是 LIFO 機制的另一種用法。

poYBAGK7-CmAQBrlAAFPIRAHHRg171.png

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

概括

消息隊列可以以多種不同的方式使用。事實上,您可以編寫可能只使用消息隊列的相當復雜的應用程序。僅使用消息隊列可以減少代碼的大小(即占用空間),因為可以模擬許多其他服務(信號量、時間延遲和事件標志)。

審核編輯:郭婷

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

    關注

    68

    文章

    10896

    瀏覽量

    212520
  • MPU
    MPU
    +關注

    關注

    0

    文章

    374

    瀏覽量

    48878
  • RTOS
    +關注

    關注

    22

    文章

    818

    瀏覽量

    119781
收藏 人收藏

    評論

    相關推薦

    使用任務通知提高RTOS應用的效率

    在實時嵌入式系統中,性能和資源效率是決定設計成敗的關鍵因素。傳統的實時操作系統(RTOS)提供了如隊列、信號量和事件組機制,實現任務之間的同步和通信。FreeRTOS/SAFERTOS還提供一種方法可以使這些過程更快、更輕量化,即任務通知。
    的頭像 發表于 12-27 14:54 ?278次閱讀

    JavaWeb消息隊列使用指南

    在現代的JavaWeb應用中,消息隊列(Message Queue)是一種常見的技術,用于異步處理任務、解耦系統組件、提高系統性能和可靠性。 1. 消息隊列的基本概念 消息隊列是一種應用程序對應
    的頭像 發表于 11-25 09:27 ?176次閱讀

    RTOS正在縮小與Linux的差距

    RTOS與Linux的物聯網設備操作系統之爭已經持續了很多年。Linux以其強大的計算能力和豐富的軟件生態,在需要復雜處理和軟件支持的物聯網設備上占據一席之地;RTOS憑借實時響應和資源節約的特性
    的頭像 發表于 09-10 08:07 ?813次閱讀
    <b class='flag-5'>RTOS</b>正在縮小與Linux的差距

    嵌入式環形隊列與消息隊列的實現原理

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

    freertos和rtos區別是什么

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

    RTOS與Linux有什么區別

    RTOS(Real-Time Operating System,實時操作系統)與Linux是兩種在不同應用場景下發揮重要作用的操作系統,它們在設計理念、功能特性、應用場景以及性能表現等方面存在顯著差異。以下是對RTOS與Linux區別的詳細分析。
    的頭像 發表于 08-20 16:05 ?4034次閱讀

    RTOS的特性和類型

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

    RTOS開發最佳實踐

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

    玩轉RT-Thread之消息隊列的應用

    在嵌入式系統開發中,實時處理串口和ADC數據是一項重要的任務。本文將介紹如何在RT-Thread實時操作系統中,利用消息隊列來同時處理來自串口和ADC的數據。通過這種方法,我們能夠高效地管理和處理
    的頭像 發表于 07-23 08:11 ?643次閱讀
    玩轉RT-Thread之消息<b class='flag-5'>隊列</b>的應用

    ESP8266_RTOS3.0串口0傳輸大量數據丟包的原因?

    傳輸數據最大1500字節,使用的ESP8266_RTOS3.0,先使用的example示例中的uart_events,結果發現當我向串口0發送長度大約800字節的數據時,重復收到消息隊列,數據被分為
    發表于 07-09 06:32

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

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

    MCU專屬隊列功能模塊之QueueForMcu應用

    當需要從隊列頭部獲取多個數據,但又不希望數據從隊列中刪除時,可以使用 Queue_Peek_Array 函數來實現,該函數的參數與返回值與 Queue_Pop_Array 完全相同。
    發表于 03-20 11:44 ?543次閱讀
    MCU專屬<b class='flag-5'>隊列</b>功能模塊之QueueForMcu應用

    基于RTOS的應用進程中的典型線程

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

    裸機中環形隊列RTOS中消息隊列有何區別呢?

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

    有沒有辦法或示例來編寫一個函數來檢查CAN硬件的接收緩沖區并以更符合RTOS的輪詢方式提取任何新消息?

    CAN 接收緩沖區并將它們放入 RTOS 隊列。 我面臨的挑戰是,唯一的 CAN 接收示例使用中斷驅動的回調,這需要全局范圍的命名函數。 這是非常具有挑戰性的,因為我可以直接鏈接到類函數的名稱,而無
    發表于 01-25 06:47
    主站蜘蛛池模板: 久久这里只有精品免费视频| 美女全黄网站免费观看| 成人精品一级毛片| 99久久国产免费中文无字幕| 2020国产v亚洲v天堂高清| 7086bt伙计 福利一区| 亚洲欧美日韩国产一区二区三区精品 | 色老成人精品视频在线观看| 色在线看| 免费能直接在线观看黄的视频| 九色97| www欧美在线观看| 天堂中文资源在线地址| 国产资源网| 一区二区中文字幕在线观看| 狠狠gao| 色五月激情五月| 久久人视频| 夜夜爽66| 黄黄视频免费看| 中文字幕在线观看一区二区| 成年人污视频| 色多多在线看| 国产三级精品视频| 窝窝午夜看片成人精品| 狠狠操91| 午夜欧美性欧美| 亚洲狠狠婷婷综合久久久久图片| 日韩免费一区| 丁香婷婷久久| 久草狼人| 能可以直接看的av网址| 天堂网2014| 国产午夜剧场| 欧洲性开放大片免费观看视频| 美女免费视频一区二区三区| 特级全毛片| 国产主播在线观看| 清纯漂亮小美女准备啪啪| 中文字幕在线观看一区| 五月婷婷在线免费观看|