chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

RTOS消息隊(duì)列的多種用途

星星科技指導(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ù)處理、中斷管理、通過消息隊(duì)列的任務(wù)間通信、信令、資源管理、時間管理、內(nèi)存分區(qū)管理等等。

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

什么是消息隊(duì)列?

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

poYBAGK7-BCAa0fqAADeuVJW2Rk395.png

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

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

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

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

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

poYBAGK7-BiAUElQAABCfnUEn9Q907.png

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

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

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

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

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

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

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

poYBAGK7-B-AHFZkAADUyYSwCO4928.png

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

如圖所示,此機(jī)制僅適用于兩個任務(wù),因?yàn)椴辉试S ISR 掛在信號量上。

消息隊(duì)列的其他用途

圖 4 顯示了消息隊(duì)列的不同用途:

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

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

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

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

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

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

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

poYBAGK7-CmAQBrlAAFPIRAHHRg171.png

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

概括

消息隊(duì)列可以以多種不同的方式使用。事實(shí)上,您可以編寫可能只使用消息隊(duì)列的相當(dāng)復(fù)雜的應(yīng)用程序。僅使用消息隊(duì)列可以減少代碼的大?。凑加每臻g),因?yàn)榭梢阅M許多其他服務(wù)(信號量、時間延遲和事件標(biāo)志)。

審核編輯:郭婷

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

    關(guān)注

    68

    文章

    11250

    瀏覽量

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

    關(guān)注

    0

    文章

    445

    瀏覽量

    51151
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    865

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    RDMA設(shè)計24:隊(duì)列管理模塊設(shè)計

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

    RDMA設(shè)計17:隊(duì)列管理模塊設(shè)計2

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

    如何在Zephyr RTOS中實(shí)現(xiàn)延時和計時函數(shù)

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

    RTOS在嵌入式開發(fā)中的作用

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

    使用RTOS時需要注意的幾點(diǎn)內(nèi)容分享

    系統(tǒng)具有帶不同特性的多種定時器來滿足不同的要求。一些定時器可被同步用以為電機(jī)控制應(yīng)用提供同時的脈寬調(diào)制(PWM)流。對RTOS來說,一個定時器通常可用以實(shí)現(xiàn)時鐘和提供時間切片支持。 定時器也支持時間
    發(fā)表于 12-23 06:34

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

    ) RT-Thread:動態(tài)內(nèi)存耗盡觸發(fā)rt_system_heap_init失敗;FreeRTOS:隊(duì)列滿時xQueueSend超時無響應(yīng) 中斷處理異常 1. 中斷優(yōu)先級高于RTOS內(nèi)核(搶占調(diào)度器)2. 中斷服務(wù)函數(shù)
    發(fā)表于 12-08 03:56

    優(yōu)先級隊(duì)列介紹

    隊(duì)列(Queue)的知識點(diǎn):「概念」:隊(duì)列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),類似于排隊(duì)的概念?!富静僮鳌梗篹nqueue(item): 將元素添加到隊(duì)列的末尾。dequeue(): 從隊(duì)
    發(fā)表于 11-26 07:56

    RTOS 必學(xué)概念:任務(wù)、信號量、隊(duì)列一次搞懂

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

    基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)

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

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

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

    RabbitMQ消息隊(duì)列解決方案

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

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER實(shí)時軟件分析工具SystemView已經(jīng)在ThreadX v6.4.2上進(jìn)行了測試。SystemView從v3.60c版本支持Eclipse ThreadX(Azure RTOS),用戶
    的頭像 發(fā)表于 05-06 17:11 ?1330次閱讀

    NVME控制器之隊(duì)列管理模塊

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

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個關(guān)鍵特性,通過該函數(shù),用戶可以增強(qiáng)對任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?977次閱讀

    RTOS中的本地存儲指針使用

    本地存儲指針是RTOS中的一個重要特性,增強(qiáng)了任務(wù)管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務(wù)或?qū)ο蟮臄?shù)據(jù)。通常與任務(wù)本地存儲(Task Local Storage,TLS)有關(guān),其中數(shù)據(jù)存儲在任務(wù)控制塊(TCB)中,允許每個任務(wù)具有私有的、特
    的頭像 發(fā)表于 02-28 16:33 ?1239次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲指針使用