国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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.消息隊列的許多用途中的一些。

概括

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

審核編輯:郭婷

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

    關注

    68

    文章

    11277

    瀏覽量

    224954
  • MPU
    MPU
    +關注

    關注

    0

    文章

    454

    瀏覽量

    51325
  • RTOS
    +關注

    關注

    25

    文章

    866

    瀏覽量

    122976
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RDMA設計43:隊列刪除及連接斷開功能測試

    在接收到正確的刪除隊列請求后,首先進入連接斷開流程,即四次揮手斷鏈,如圖中紅框部分。隨后進行隊列刪除操作。返回隊列操作狀態 0x2b,符合設計預期,驗證通過。
    的頭像 發表于 02-24 07:50 ?547次閱讀
    RDMA設計43:<b class='flag-5'>隊列</b>刪除及連接斷開功能測試

    RDMA設計25:隊列管理模塊之發送模塊詳細設計分析

    發送隊列存儲為所有發送隊列共用的存儲空間,根據用戶環境和開發板環境不同可由 BRAM、URAM 或 LUTRAM 實現。發送隊列管理單元則負責管理這個存儲空間,并處理用戶指令和發送隊列
    的頭像 發表于 01-25 16:27 ?3347次閱讀
    RDMA設計25:<b class='flag-5'>隊列</b>管理模塊之發送模塊詳細設計分析

    RDMA設計26:隊列管理模塊設計之接收隊列模塊詳細分析

    本文主要交流設計思路,在本博客已給出相關博文100多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 (2)接收隊列 接收隊列由一個接收隊列管理單元組成。與發送
    發表于 01-22 09:03

    RDMA設計24:隊列管理模塊設計

    隊列管理模塊采用管理與存儲分離的結構進行設計,由發送隊列存儲、發送隊列管理、接收隊列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
    的頭像 發表于 01-20 11:45 ?1356次閱讀
    RDMA設計24:<b class='flag-5'>隊列</b>管理模塊設計

    RDMA設計17:隊列管理模塊設計2

    。 (2)接收隊列 接收隊列由一個接收隊列管理單元組成。與發送隊列類似的是,接收隊列管理單元也由若干表單構成,其中包括 RQ1 表單和用戶
    發表于 01-04 14:54

    如何在Zephyr RTOS中實現延時和計時函數

    在實時操作系統(RTOS)中,時間管理是核心功能之一。無論是任務調度、超時控制,還是周期性事件,延時和計時機制都扮演著至關重要的角色。Zephyr RTOS作為一個輕量級、模塊化的開源系統,提供了
    的頭像 發表于 12-26 10:32 ?5431次閱讀
    如何在Zephyr <b class='flag-5'>RTOS</b>中實現延時和計時函數

    RTOS在嵌入式開發中的作用

    每個任務可以被認為是一個項目。通過RTOS提供的資源(隊列、信號量等)來定義輸入輸出。將系統定義為一個個的任務,可以更容易的部署更多開發人員到一個項目。 易于調試和驗證 系統劃分為功能明確的任務,不依賴
    發表于 12-26 07:53

    使用RTOS時需要注意的幾點內容分享

    系統具有帶不同特性的多種定時器來滿足不同的要求。一些定時器可被同步用以為電機控制應用提供同時的脈寬調制(PWM)流。對RTOS來說,一個定時器通??捎靡詫崿F時鐘和提供時間切片支持。 定時器也支持時間
    發表于 12-23 06:34

    RTOS Crash 問題全維度分析與解決指南

    ) RT-Thread:動態內存耗盡觸發rt_system_heap_init失敗;FreeRTOS:隊列滿時xQueueSend超時無響應 中斷處理異常 1. 中斷優先級高于RTOS內核(搶占調度器)2. 中斷服務函數
    發表于 12-08 03:56

    RTOS 必學概念:任務、信號量、隊列一次搞懂

    如果你剛接觸RTOS(實時操作系統),很可能會有這樣的困惑:“RTOS和裸機程序到底有什么區別?”“任務是線程嗎?為什么要分任務?”“信號量和互斥鎖有什么區別,不都是同步手段嗎?”“隊列是不是就是一
    的頭像 發表于 11-17 10:53 ?465次閱讀
    <b class='flag-5'>RTOS</b> 必學概念:任務、信號量、<b class='flag-5'>隊列</b>一次搞懂

    基于環形隊列的UART收發回顯實驗

    在實際項目開發中,由于有些串口不具備FIFO(如SCI1和SCI2)或FIFO的buffer比較小,這可能會在數據處理速度小于數據接收速度的時候,導致數據的丟失。因此我們可以設計一個隊列來避免這一
    的頭像 發表于 10-27 13:51 ?1976次閱讀
    基于環形<b class='flag-5'>隊列</b>的UART收發回顯實驗

    請問編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?

    編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?
    發表于 07-11 07:22

    RabbitMQ消息隊列解決方案

    在現代分布式系統架構中,消息隊列作為核心組件,承擔著系統解耦、異步處理、流量削峰等重要職責。RabbitMQ作為一款成熟的消息隊列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業的首選方案。本文將從運維工程師的角度,詳細闡述RabbitMQ從單機部署到集群搭建的完
    的頭像 發表于 07-08 15:55 ?632次閱讀

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數
    的頭像 發表于 05-03 15:32 ?656次閱讀
    NVME控制器之<b class='flag-5'>隊列</b>管理模塊

    詳解RTOS中的Hook函數

    Hook函數是RTOS中的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?1077次閱讀