欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

FreeRTOS實(shí)時(shí)操作系統(tǒng)隊(duì)列基礎(chǔ)

 更新時(shí)間:2022年04月08日 13:28:53   作者:zhzht19861011  
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)隊(duì)列基礎(chǔ),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

前言

本文介紹隊(duì)列的基本知識(shí),詳細(xì)源碼分析見FreeRTOS進(jìn)階之隊(duì)列示例分析

1.FreeRTOS隊(duì)列

隊(duì)列是主要的任務(wù)間通訊方式??梢栽谌蝿?wù)與任務(wù)間、中斷和任務(wù)間傳送信息。大多數(shù)情況下,隊(duì)列用于具有線程保護(hù)的FIFO(先進(jìn)先出)緩沖區(qū):新數(shù)據(jù)放在隊(duì)列的后面。當(dāng)然,數(shù)據(jù)也可以放在隊(duì)列的前面,在下一篇講隊(duì)列API函數(shù)時(shí),會(huì)涉及到數(shù)據(jù)的存放位置。

圖1-1:讀寫隊(duì)列

圖1-1所示的隊(duì)列中,最多能保存5個(gè)項(xiàng)目,并且假設(shè)隊(duì)列永遠(yuǎn)不會(huì)滿。任務(wù)A使用API函數(shù)xQueueSendToBack()向隊(duì)列發(fā)送數(shù)據(jù),每次發(fā)送一個(gè)數(shù)據(jù),新入隊(duì)的數(shù)據(jù)置于上一次入隊(duì)數(shù)據(jù)的后面。任務(wù)B使用API函數(shù)xQueueReceive()將數(shù)據(jù)從隊(duì)列取出,先入隊(duì)的數(shù)據(jù)先出隊(duì)。

2.使用模型:最簡單、最靈活

通常情況下,魚和熊掌是不可兼得的,但FreeRTOS的隊(duì)列用戶模型管理卻兼顧簡單和靈活。發(fā)送到隊(duì)列的消息是通過拷貝實(shí)現(xiàn)的,這意味著隊(duì)列存儲(chǔ)的數(shù)據(jù)是原數(shù)據(jù),而不是原數(shù)據(jù)的引用。FreeRTOS隊(duì)列具有以下特性:

C變量(整形、簡單結(jié)構(gòu)體等等)中的簡單信息可以直接傳送到隊(duì)列。這樣就不需要為信息分配緩存也不需要再進(jìn)行什么拷貝工作。同樣的,信息可以直接從隊(duì)列讀取到C變量中。用直接拷貝的方法入隊(duì),可以允許任務(wù)立即覆寫已經(jīng)入隊(duì)的變量或者緩存,實(shí)際上隊(duì)列中已經(jīng)保存了這些變量或緩沖區(qū)攜帶的信息。因?yàn)樽兞恐械臄?shù)據(jù)內(nèi)容是以拷貝的方式入隊(duì)的,所以變量自身是允許重復(fù)使用的。發(fā)送信息的任務(wù)和接收信息的任務(wù)并不需要就哪個(gè)任務(wù)擁有信息、哪個(gè)任務(wù)釋放信息(當(dāng)信息不再使用時(shí))而達(dá)成一致。

隊(duì)列是通過拷貝傳遞數(shù)據(jù)的,但這并不妨礙隊(duì)列通過引用來傳遞數(shù)據(jù)。當(dāng)信息的大小到達(dá)一個(gè)臨界點(diǎn)后,逐字節(jié)拷貝整個(gè)信息是不實(shí)際的,可以定義一個(gè)指針隊(duì)列,只拷貝指向消息的指針來代替整個(gè)信息拷貝。FreeRTOS+UDP IP棧例程正是使用這種方法向FreeRTOS協(xié)議棧傳遞大量網(wǎng)絡(luò)數(shù)據(jù)的。

隊(duì)列內(nèi)存區(qū)域分配由內(nèi)核完成。

變長消息可以通過定義保存一個(gè)結(jié)構(gòu)體變量的隊(duì)列實(shí)現(xiàn),結(jié)構(gòu)體一個(gè)成員指向要入隊(duì)的緩存,另一個(gè)成員保存緩存數(shù)據(jù)的大小。

單個(gè)隊(duì)列可以接收不同類型信息,并且信息可以來自不同的位置。通過定義保存一個(gè)結(jié)構(gòu)體變量的隊(duì)列來實(shí)現(xiàn),結(jié)構(gòu)體的一個(gè)成員保存信息類型,另一個(gè)成員保存信息數(shù)據(jù)(或者指向信息數(shù)據(jù)的指針)。數(shù)據(jù)如何解讀取決于信息類型。管理FreeRTOS+UDP IP棧的任務(wù)正是使用單個(gè)隊(duì)列接收ARP定時(shí)器時(shí)間通知、以太網(wǎng)硬件傳送來的數(shù)據(jù)包、從應(yīng)用層傳送來的數(shù)據(jù)包、網(wǎng)絡(luò)關(guān)閉事件等等。

天生適用于那些內(nèi)存保護(hù)(MPU)場合。一個(gè)具有內(nèi)存區(qū)域保護(hù)的任務(wù)可以向另一個(gè)具有內(nèi)存區(qū)域保護(hù)的任務(wù)傳遞數(shù)據(jù),因?yàn)檎{(diào)用隊(duì)列發(fā)送函數(shù)會(huì)引起RTOS提升微控制器特權(quán)級別。只有RTOS(具有所有特權(quán))才可以訪問隊(duì)列存儲(chǔ)區(qū)域。

在中斷函數(shù)中使用獨(dú)立的API。將RTOS任務(wù)API和中斷服務(wù)例程API分來實(shí)現(xiàn)意味著可以避免執(zhí)行時(shí)的上下文調(diào)用檢查開銷,還意味著在大多數(shù)情況下,與其它RTOS產(chǎn)品相比,用戶創(chuàng)建中斷服務(wù)例程會(huì)更簡單。

API函數(shù)很簡單。

3.隊(duì)列阻塞

API函數(shù)允許指定阻塞時(shí)間。

每當(dāng)任務(wù)企圖從一個(gè)空的隊(duì)列讀取數(shù)據(jù)時(shí),任務(wù)會(huì)進(jìn)入阻塞狀態(tài)(這樣任務(wù)不會(huì)消耗任何CPU時(shí)間并且另一個(gè)任務(wù)可以運(yùn)行)直到隊(duì)列中出現(xiàn)有效數(shù)據(jù)或者阻塞時(shí)間到期。

每當(dāng)任務(wù)企圖向一個(gè)滿的隊(duì)列寫數(shù)據(jù)時(shí),任務(wù)會(huì)進(jìn)入阻塞狀態(tài),直到隊(duì)列中出現(xiàn)有效空間或者阻塞時(shí)間到期。

如果多個(gè)任務(wù)阻塞在一個(gè)隊(duì)列上,那么最高優(yōu)先級別的任務(wù)會(huì)第一個(gè)解除阻塞。

注:中斷程序中必須使用“FromISR”結(jié)尾的API函數(shù)!

總結(jié)一下隊(duì)列的基本用法:

定義一個(gè)隊(duì)列句柄變量,用于保存創(chuàng)建的隊(duì)列:xQueueHandle xQueue1;

使用API函數(shù)xQueueCreate()創(chuàng)建一個(gè)隊(duì)列。

如果希望使用先進(jìn)先出隊(duì)列,使用API函數(shù)xQueueSend()或xQueueSendToBack()向隊(duì)列投遞隊(duì)列項(xiàng)。如果希望使用后進(jìn)先出隊(duì)列,使用API函數(shù)xQueueSendToFront()向隊(duì)列投遞隊(duì)列項(xiàng)。如果在中斷服務(wù)程序中,切記使用它們的帶中斷保護(hù)版本。

使用API函數(shù)xQueueReceive()從隊(duì)列讀取隊(duì)列項(xiàng),如果在中斷服務(wù)程序中,切記使用它們的帶中斷保護(hù)版本。

以上使用的API函數(shù)將在下一篇文章中介紹,更多關(guān)于FreeRTOS隊(duì)列基礎(chǔ)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論