FreeRTOS 隊列

隊列是一種任務到任務、任務到中斷、中斷到任務數據交流的一種機制。在隊列中可以存 儲數量有限、大小固定的多個數據,隊列中的每一個數據叫做隊列項目,隊列能夠存儲隊列項 目的最大數量稱為隊列的長度,在創建隊列的時候,就需要指定所創建隊列的長度及隊列項目 的大小。

因為隊列是用來在任務與任務或任務于中斷之間傳遞消息的一種機制,因此隊列也叫 做消息隊列。 基于隊列,FreeRTOS 實現了多種功能,其中包括隊列集、互斥信號量、計數型信號量、二 值信號量、遞歸互斥信號量,因此很有必要深入了解 FreeRTOS 的隊列。

數據存儲

隊列的原則是先進先出(FIFO),當有新的數據寫入隊列時,都是寫入到隊列的尾部,當讀出數據時,先從隊列的頭部進行讀取。FreeRTOS也支持將數據寫到隊列的頭部,也可以覆蓋之前寫入的數據。

多任務訪問

隊列不屬于某個特定的任務,可以在任何的任務或中斷中往隊列中寫入消息,或者從隊列 中讀取消息。

隊列的寫入阻塞

當想某一個隊列寫入數據時,如果此時的隊列已經滿了,就是沒有空位置了,這時任務實際上是阻塞住了,因為想要寫入但是無法寫入,我們可以設定一個等待阻塞時間,等待的時間在設定范圍內,任務就會被添加到阻塞列表中進行等待,等待隊列中有空位置。如果在阻塞超時時間到達之前,隊列有空閑的位置,那么隊列寫入阻塞任務將會解除阻塞, 并往隊列中寫入消息,如果達到指定的阻塞超時時間,隊列依舊沒有空閑的位置寫入消息,那 么隊列寫入阻塞任務將會自動轉移到就緒態任務列表中,但不會往隊列中寫入消息。這個阻塞時間可以是0,可以是在系統規定的最大阻塞時間范圍之內。

注意:如果多個任務寫入同一個隊列時,那么多個任務會一起等待,會按照阻塞的先后和任務的優先級,決定應該解除哪一個隊列寫入阻塞任務,也就是同一個優先級先來的先解除,高優先級比低優先級先解除。

隊列的讀取阻塞

同寫入相同,當想某一個隊列讀取數據時,如果此時的隊列是空的,因為沒有數據讓任務讀取,這時任務實際上是阻塞住了,因為想要讀取卻沒有數據,我們可以設定一個等待阻塞時間,等待的時間在設定范圍內,任務就會被添加到阻塞列表中進行等待,等待隊列中有空位置。在任務從隊列讀取消息時,可以指定一個阻塞超時時間。如果任務在讀取隊列時,隊列為 空,這時任務將被根據指定的阻塞超時時間添加到阻塞態任務列表中進行阻塞,以等待隊列中 有可用的消息。當有其他任務或中斷將消息寫入隊列中,因等待隊列而阻塞任務將會被添加到 就緒態任務列表中,并讀取隊列中可用的消息。如果任務因等待隊列而阻塞的時間超過指定的 阻塞超時時間,那么任務也將自動被轉移到就緒態任務列表中,但不再讀取隊列中的數據。 因為同一個隊列可以被多個任務讀取,因此可能會有多個任務因等待同一個隊列,而被阻 塞,在這種情況下,如果隊列中有可用的消息,那么也只有一個任務會被解除阻塞并讀取到消 息,并且會按照阻塞的先后和任務的優先級,決定應該解除哪一個隊列讀取阻塞任務。

隊列的結構體

typedef struct QueueDefinition
{int8_t * pcHead; /* 存儲區域的起始地址 */int8_t * pcWriteTo; /* 下一個寫入的位置 *//* 信號量是由隊列實現的,* 此結構體能用于隊列和信號量,* 當用于隊列時,使用聯合體中的 xQueue,* 當用于信號量時,使用聯合體中的 xSemaphore*/union{QueuePointers_t xQueue;SemaphoreData_t xSemaphore;} u;List_t xTasksWaitingToSend; /* 寫入阻塞任務列表 */List_t xTasksWaitingToReceive; /* 讀取阻塞任務列表 */volatile UBaseType_t uxMessagesWaiting; /* 非空閑項目的數量 */UBaseType_t uxLength; /* 隊列的長度 */UBaseType_t uxItemSize; /* 隊列項目的大小 */volatile int8_t cRxLock; /* 讀取上鎖計數器 */volatile int8_t cTxLock;
}

結構體示意圖

前面說過 FreeRTOS 基于隊列實現了互斥信號量和遞歸互斥信號量功能,在隊列的結構體 中,就包含了一個聯合體 u,當隊列結構體用作隊列時,使用聯合體 u 中的 xQueue

typedef struct QueuePointers
{int8_t * pcTail; /* 存儲區域的結束地址 */int8_t * pcReadFrom; /* 最后一次讀取隊列的位置 */
} QueuePointers_t;

pcHead是存儲區的起始地址,pcWriteTo是下一個寫入的地址

pcTail是存儲區的結束地址,pcReadFrom是最后一次讀取隊列的位置

?xTasksWaitingToSend,當寫入發生阻塞時,任務會被添加到此列表中。

?xTasksWaitingToReceive,當讀取發生阻塞時,任務會被添加到此列表中。

uxMessagesWaiting時隊列中已經有數據的項目數量?

uxLength就是隊列的長度

uxItemSize就是隊列項目的大小?

隊列的鎖

在FreeRTOS中,隊列是一種用于在任務之間傳遞數據的通信機制。它可以實現生產者任務將數據發送到隊列中,然后消費者任務從隊列中接收數據。隊列的上鎖和解鎖操作是用來保護隊列數據的完整性和一致性的。

當一個任務要向隊列發送數據時,首先需要對隊列進行上鎖操作。這是為了防止其他任務同時訪問隊列,從而導致數據的錯誤讀寫。在上鎖期間,其他任務無法訪問隊列,直到上鎖任務完成發送操作并解鎖隊列。類似地,當一個任務要從隊列接收數據時,也需要對隊列進行上鎖操作。這是為了保證在接收數據的過程中,隊列中的數據不會被其他任務修改。在上鎖期間,其他任務無法修改隊列中的數據,直到上鎖任務完成接收操作并解鎖隊列。

通過對隊列進行上鎖和解鎖操作,可以確保在多任務環境下,隊列的數據操作是安全和可靠的。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43858.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

揭秘與應對:病毒偽裝文件夾的數據恢復策略

在數字時代,數據安全是每個人不可忽視的重要議題。而偽裝文件夾,作為一種狡猾的數據安全威脅,正逐漸浮出水面,成為用戶需要警惕的對象。這些偽裝文件夾看似普通,實則隱藏著不為人知的秘密,它們通過模仿正常…

linux系統操作/基本命令/vim/權限修改/用戶建立

Linux的目錄結構: 一:在Linux系統中,路徑之間的層級關系,使用:/來表示 注意:1、開頭的/表示根目錄 2、后面的/表示層級關系 二:在windows系統中,路徑之間的層級關系,使用:\來表示 注意:1、D:表示…

數電票真偽查驗接口、發票查驗接口

數電發票是現代稅務系統升級的重要體現,因其開票流程簡化、發票信息全面數字化、票面版式簡潔化、高效環保等優勢,深受納稅人好評。但隨之而來的數電票真偽查驗問題也讓各位財務小伙伴頭疼不已,那么,數電票如何實現快速、批量、精…

移動應用性能收集工具原理解析

性能收集分析相關工具總覽 收集、分析、展示移動應用性能數據的工具很多,大致可以分為如下幾類。例如可收集多項性能指標的移動性能工具,perfdog,Solopi,其中Solopi開源,pefdog商業工具。可進行Crash分析的工具&#x…

貓超卡怎么使用?

天貓超市卡好像只能買天貓的東西 但是有時候淘寶、京東打折比天貓的單價還便宜 這樣的話,貓超卡好像也沒多大用處 這不,上個月618湊單的東西比在天貓超市買劃算多了 最后我直接把貓超卡在收卡云上折現了,超劃算

Chmod 特殊權限舉例

chmod 4777 的例子: 比如,在安裝某些服務如PostgreSQL時,服務的初始化腳本(如initdb)可能需要以超級用戶(root)的權限運行,以執行一些系統級的操作。在這種情況下,如果你設置 initdb 腳本為 ch…

flink 大數據處理資源分配

Flink在大數據處理中的資源分配是一個復雜但至關重要的過程,它直接影響到作業的性能和穩定性。以下將從幾個方面詳細闡述Flink的資源分配機制和優化策略: 一、資源分配概述 Flink是一個用于無界和有界數據流處理的分布式計算框架,它通過集群…

Git-Updates were rejected 解決

Updates were rejected 1. 雜話2. 問題3. 解決3.1 拉去遠程的最新版本(AC)3.2 解決可能的沖突3.3 提交3.4 再次推送 1. 雜話 大伙兒應該都用過Git吧,具體是個啥東西我就不說了哈。之前我在用git push的時候遇到了這個報錯,我仔細思…

C/C++開發,IniFile源碼下載

C/C開發,IniFile源碼下載。 地址:CIniFile download | SourceForge.net

編程學單詞:delta(希臘字母Δ/δ)

希臘字母表的第四個字母,大寫為Δ,小寫為δ。 (筆記模板由python腳本于2024年07月11日 12:32:56創建,本篇筆記適合喜歡寫代碼,更喜歡鼓搗Python的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網:https://www.pyth…

算法 | NOIP1999 Cantor表

算法篇——Cantor的數表 - SteveWang - 博客園 (cnblogs.com) #include <bits/stdc.h> using namespace std; int high(int n) {return n*(n1)/2; } int main() {int k;cin>>k;int n1;while(1){if(high(n)>k){break;}n;} int mhigh(n);int wm-k1;if(n%20){cout…

Arcgis Api 三維聚合支持最新版API

Arcgis Api 三維聚合支持最新版API 最近有同學問我Arcgis api 三維聚合&#xff0c;官方還不支持三維聚合API&#xff0c;二維可以。所以依舊是通過GraphicLayers 類來實現&#xff0c;可支持最新Arcgis Api版本 效果圖&#xff1a;

k8s中Service暴露的種類以及用法

一、說明 在 Kubernetes 中&#xff0c;有幾種不同的方式可以將服務&#xff08;Service&#xff09;暴露給外部流量。這些方式通過定義服務的 spec.type 字段來確定。 二、詳解 1. ClusterIP 定義&#xff1a;默認類型&#xff0c;服務只能在集群內部訪問。 作用&#xff1a;通…

《計算機研究與發展》投稿經驗

前言 記錄下投計研展正刊的經驗。跟專刊不同哈&#xff0c;專刊會更快&#xff0c;我看好像也有專刊的經驗分享。【計算機研究與發展投稿記錄】 期刊簡介 來源計研展官網&#xff1a; 《計算機研究與發展》是中國科學院計算技術研究所和中國計算機學會聯合主辦的學術性期刊&a…

盲人出行體驗攻略:蝙蝠避障,點亮前行的明燈

在繁華喧囂的都市中&#xff0c;每一步都充滿了未知與挑戰&#xff0c;而對于盲人朋友們來說&#xff0c;出行更是一場無聲的冒險。他們憑借著內心的勇氣和堅韌的意志&#xff0c;在黑暗中摸索前行&#xff0c;每一步都承載著對生活的熱愛與追求。今天&#xff0c;我們要深入探…

FLStudio21.3.12中文破解版本安裝包win+mac電腦安裝包下載

&#x1f3a4; FL Studio 21中文版&#xff1a;音樂制作新寵&#xff0c;讓你的創作起飛&#xff01; 嗨&#xff0c;親愛的音樂創作者們&#xff01;&#x1f44b;今天要和大家分享一個讓我超級興奮的寶藏軟件——FL Studio 21中文版&#xff01;這不僅僅是一款音樂制作軟件&…

STM32串口工作原理

STM32的串口是相當豐富的&#xff0c;功能也很強勁。最多可提供5 路串口&#xff0c;有分數波特率發生器、支持單線光通信和半雙工單線通訊、支持LIN、智能卡協議和IrDA SIRENDEC 規范(僅串口3支持)、具有DMA等。 串口最基本的設置&#xff0c;就是波特率的設置。STM32的串口使…

移動應用穩定性測試

移動應用穩定性測試 使用Monkey等工具進行移動應用穩定性測試是一種常見的自動化測試方法。Monkey工具可以自動生成各種隨機事件來模擬用戶操作&#xff0c;從而測試應用在不同情況下的表現。在執行monkey命令后&#xff0c;主要觀察以下的結果信息來評估移動應用的穩定性。 崩…

前后端通信 —— HTTP/HTTPS

目錄 一、HTTP/HTTPS 簡介 1、HTTP 2、HTTPS 二、HTTP 工作過程 三、HTTP 消息 1、HTTP消息結構 2、HTTP消息示例 四、HTTP 方法&#xff08;常用&#xff09; 1、GET 2、POST 3、PUT 4、DELETE 5、GET與POST對比 五、HTTP 狀態碼&#xff08;常用&#xff09; …

常用的簡單的ps快捷鍵

常用快捷鍵&#xff1a; V移動工具 M矩形選框工具 W快速選擇工具 C裁剪工具 P鋼筆工具 T文字工具 U矩形工具 Z放大/縮放 altshiftctrls儲存為web格式的快捷鍵 altVE新建參考線 ctrlj 復制當前圖層 d 快速把前景色背景色變為黑白 x 切換前景色和背景色 ctrldelete 填充顏色 ct…