版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第第頁嵌入式開發(fā)中消息隊(duì)列的實(shí)現(xiàn)
在(嵌入式開發(fā))中經(jīng)常會(huì)看到消息隊(duì)列的身影,隊(duì)列的應(yīng)用是很廣泛的,它可以應(yīng)用的場景有很多,比如緩存(通信)消息,暫存執(zhí)行內(nèi)容,數(shù)據(jù)順序轉(zhuǎn)發(fā)等的操作。
那到底什么是隊(duì)列呢?
隊(duì)列屬于一種線性表的數(shù)據(jù)結(jié)構(gòu),跟棧有些類似,但是又不相同。隊(duì)列的不同之處在于它只允許在一端(front)進(jìn)行刪除操作,而在另外一端(rear)進(jìn)行插入操作,是一種有約束的線性表結(jié)構(gòu)。在隊(duì)列中進(jìn)行插入一端稱為隊(duì)列尾,進(jìn)行刪除操作的一端稱為隊(duì)列頭。
總而言之:
隊(duì)頭:指的是允許元素被刪除的一端;
隊(duì)尾:指的是允許元素被插入的一端;
入隊(duì):隊(duì)列的插入操作。
出隊(duì):隊(duì)列的刪除操作。
空隊(duì):隊(duì)列中沒有任何元素時(shí)稱為空隊(duì)列。
隊(duì)列的示意圖參見下面:
在開發(fā)中,特別是涉及到消息數(shù)據(jù)的接收或者發(fā)送的時(shí)候,消息多的時(shí)候可能(MCU)一時(shí)半會(huì)處理不來,就需要考慮先將消息先接收并緩存起來,然后由MCU按照消息的先后順序一一去處理,這種情況下隊(duì)列就是比較好的選擇。
隊(duì)列的實(shí)現(xiàn)可以自己寫一個(gè),也可以參考網(wǎng)上別人實(shí)現(xiàn)的開源代碼,原理都是差不多的,只是要注意一點(diǎn):消息的結(jié)構(gòu)的要按照自己的實(shí)際使用需求進(jìn)行定義。
本文分享一個(gè)guthub上的消息隊(duì)列的實(shí)現(xiàn):
倉庫鏈接如下:
/xiaoxinpro/QueueF(or)Mcu這個(gè)隊(duì)列是基于(單片機(jī))實(shí)現(xiàn)的隊(duì)列功能模塊,可以用于8位、16位、32位的單片機(jī),特別適合應(yīng)用在非(RTOS)的單片機(jī)應(yīng)用中,可以兼容大多數(shù)的單片機(jī)平臺,對資源比較稀缺的單片機(jī)也是可以應(yīng)用的。
這個(gè)隊(duì)列功能模塊的使用方式如下:
1、定義隊(duì)列的消息結(jié)構(gòu)隊(duì)列的消息結(jié)構(gòu)定義如下:
typedefstructQUEUE_HandleTypeDef{unsignedinthe(ad);//隊(duì)列頭指針unsignedintt(ai)l;//隊(duì)列尾指針unsignedintbuffer_length;//隊(duì)列緩存長度(初始化時(shí)賦值)QUEUE_DATA_T*buffer;//隊(duì)列緩存數(shù)組(初始化時(shí)賦值)}QUEUE_HandleTypeDef;在上面的消息結(jié)構(gòu)中,QUEUE_DATA_T需要自定義為自己項(xiàng)目中需要用到的數(shù)據(jù)類型。
在queue.h文件中可以找到QUEUE_DATA_T的定義如下:
#defineQUEUE_DATA_Tunsignedchar//隊(duì)列數(shù)據(jù)類型定義修改這個(gè)數(shù)據(jù)類型的定義即可。
2、創(chuàng)建隊(duì)列的緩存在創(chuàng)建隊(duì)列前要手動(dòng)創(chuàng)建一個(gè)隊(duì)列緩存區(qū),用于存放隊(duì)列數(shù)據(jù)。如下創(chuàng)建一個(gè)大小為512的隊(duì)列緩存區(qū)。
QUEUE_DATA_TBuffer(Uart)Tx[512];3、初始化隊(duì)列隊(duì)列的緩存區(qū)定義好以后,就需要調(diào)用初始化函數(shù)來進(jìn)行隊(duì)列的創(chuàng)建,初始化函數(shù)如下:
voidQueue_Init(QUEUE_HandleTypeDef*hqueue,QUEUE_DATA_T*buffer,unsignedintlen)參數(shù)說明:
參數(shù)名描述hqueue需要初始化的隊(duì)列結(jié)構(gòu),如果二次初始化將清空原隊(duì)列的內(nèi)容。buffer隊(duì)列緩存的首地址指針len隊(duì)列長度,不能比隊(duì)列緩存長度還要大。返回值說明:
該函數(shù)會(huì)返回一個(gè)QUEUE_StatusTypeDef枚舉數(shù)據(jù)類型,返回值會(huì)根據(jù)隊(duì)列狀態(tài)返回以下幾個(gè)值:
返回值描述QUEUE_OK數(shù)據(jù)壓入隊(duì)列成功。QUEUE_OVERLOAD未壓入數(shù)據(jù)到隊(duì)列中,原因隊(duì)列已滿。4、數(shù)據(jù)壓入隊(duì)列(1)單個(gè)消息壓入隊(duì)列
將數(shù)據(jù)壓入隊(duì)列尾部使用Queue_Push函數(shù),該函數(shù)原型如下:
QUEUE_StatusTypeDefQueue_Push(QUEUE_HandleTypeDef*hqueue,QUEUE_DATA_Tdata)參數(shù)說明:
參數(shù)名描述hqueue需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。data待壓入隊(duì)列的數(shù)據(jù)。返回值說明:
該函數(shù)會(huì)返回一個(gè)QUEUE_StatusTypeDef枚舉數(shù)據(jù)類型,返回值會(huì)根據(jù)隊(duì)列狀態(tài)返回以下幾個(gè)值:
返回值描述QUEUE_OK數(shù)據(jù)壓入隊(duì)列成功。QUEUE_OVERLOAD未壓入數(shù)據(jù)到隊(duì)列中,原因隊(duì)列已滿。(2)多個(gè)消息壓入隊(duì)列
若需要將多個(gè)數(shù)據(jù)(數(shù)組)壓入隊(duì)列可以使用Queue_Push_Array函數(shù),原理上循環(huán)調(diào)用Queue_Push函數(shù)來實(shí)現(xiàn)的,函數(shù)原型如下:
unsignedintQueue_Push_Array(QUEUE_HandleTypeDef*hqueue,QUEUE_DATA_T*pdatas,unsignedintlen)參數(shù)說明:
參數(shù)名描述hqueue需要壓入數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。pdatas待壓入隊(duì)列的數(shù)組首地址。len待壓入隊(duì)列的數(shù)組長度。當(dāng)數(shù)組長度大于隊(duì)列剩余長度時(shí),數(shù)組多余的數(shù)據(jù)將被忽略。
返回值說明:
該函數(shù)將返回實(shí)際被壓入到隊(duì)列中的數(shù)據(jù)長度。當(dāng)隊(duì)列中的剩余長度富余時(shí),返回值將等于參數(shù)len的值。當(dāng)隊(duì)列中的剩余長度不足時(shí),返回值為實(shí)際被壓入到隊(duì)列的數(shù)據(jù)長度。5、消息出隊(duì)(1)單數(shù)據(jù)彈出
將隊(duì)列頭部數(shù)據(jù)彈出隊(duì)列使用Queue_Pop函數(shù),需要注意的是,彈出的數(shù)據(jù)將從隊(duì)列中刪除,該函數(shù)原型如下:
QUEUE_StatusTypeDefQueue_Pop(QUEUE_HandleTypeDef*hqueue,QUEUE_DATA_T*pdata)參數(shù)說明:
參數(shù)名描述hqueue需要彈出數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。pdata用于保存彈出數(shù)據(jù)變量的指針。返回值說明:
該函數(shù)會(huì)返回一個(gè)QUEUE_StatusTypeDef枚舉數(shù)據(jù)類型,返回值會(huì)根據(jù)隊(duì)列狀態(tài)返回以下幾個(gè)值:
返回值描述QUEUE_OK數(shù)據(jù)彈出隊(duì)列成功。QUEUE_VOID未彈出數(shù)據(jù)到隊(duì)列中,原因隊(duì)列為空。(2)多數(shù)據(jù)彈出
若需要將多個(gè)數(shù)據(jù)彈出隊(duì)列可以使用Queue_Pop_Array函數(shù),原理上循環(huán)調(diào)用Queue_Pop函數(shù)來實(shí)現(xiàn)的,需要注意的是,成功彈出的數(shù)據(jù)將從隊(duì)列中刪除,函數(shù)原型如下:
unsignedintQueue_Pop_Array(QUEUE_HandleTypeDef*hqueue,QUEUE_DATA_T*pdatas,unsignedintlen)參數(shù)說明:
參數(shù)名描述hqueue需要彈出數(shù)據(jù)的隊(duì)列結(jié)構(gòu)。pdatas用于保存彈出數(shù)據(jù)數(shù)組的首地址。len需要彈出數(shù)據(jù)數(shù)組的長度。當(dāng)需要彈出數(shù)據(jù)的長度大于隊(duì)列中的數(shù)據(jù)長度時(shí),彈出數(shù)組多余的空間將不會(huì)被賦值。
返回值說明:
該函數(shù)將返回實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長度。當(dāng)隊(duì)列中的數(shù)據(jù)長度足夠時(shí),返回值將等于參數(shù)len的值。當(dāng)隊(duì)列中的數(shù)據(jù)長度不足時(shí),返回值為實(shí)際從隊(duì)列中彈出的數(shù)據(jù)長度。6、清空隊(duì)列當(dāng)需要清空隊(duì)列數(shù)據(jù)時(shí),無需彈出所有數(shù)據(jù),只需要調(diào)用Queue_Clear即可快速清空指定隊(duì)列,在創(chuàng)建隊(duì)列時(shí)會(huì)調(diào)用此函數(shù)來初始化隊(duì)列,因此對于剛創(chuàng)建完成的隊(duì)列無需調(diào)用清空隊(duì)列函數(shù)。
函數(shù)原型:
voidQueue_Clear(QUEUE_HandleTypeDef*hqueue)參數(shù)說明:
參數(shù)名描述hqueue需要清空的隊(duì)列結(jié)構(gòu)。7、獲取隊(duì)列的數(shù)據(jù)量長度當(dāng)需要獲取隊(duì)列中的數(shù)據(jù)長度時(shí),調(diào)用Queue_Count函數(shù),函數(shù)原型如下:
unsignedintQueue_Count(QUEUE_HandleTypeDef*hqueue)參數(shù)說明:
參數(shù)名描述hque
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年04月中國農(nóng)業(yè)發(fā)展銀行廣東省分行紀(jì)委辦調(diào)查專業(yè)人才社會(huì)招考筆試歷年參考題庫附帶答案詳解
- 2025年度常州消防設(shè)施檢測與鑒定合同4篇
- 2024版水泥混凝土運(yùn)輸合同書
- 2025年度城市基礎(chǔ)設(shè)施配套拆遷施工合同4篇
- 專業(yè)菊花供應(yīng)商2024年銷售協(xié)議版B版
- 《流行病癥:新型冠狀病毒肺炎》課件
- 二零二五年度玻璃原材料期貨交易合同6篇
- 2024年03月廣東中信銀行深圳分行社會(huì)招考筆試歷年參考題庫附帶答案詳解
- 二零二五版存量房市場政策研究合同3篇
- 2024簡易散伙協(xié)議規(guī)范格式
- 四川省高職單招電氣技術(shù)類《電子基礎(chǔ)》歷年考試真題試題庫(含答案)
- 竇性心動(dòng)過速的危害
- 深基坑工程基坑土方開挖及支護(hù)降水施工方案
- 2024年江西生物科技職業(yè)學(xué)院單招職業(yè)技能測試題庫帶解析答案
- 醫(yī)藥制造企業(yè)資本結(jié)構(gòu)優(yōu)化研究以貴州百靈為例
- GB 31335-2024鐵礦開采和選礦單位產(chǎn)品能源消耗限額
- 醫(yī)院高風(fēng)險(xiǎn)意外事件應(yīng)急措施和救護(hù)機(jī)制
- 橋本甲狀腺炎-90天治療方案
- 【復(fù)合附件版】個(gè)人借車免責(zé)協(xié)議書簡單
- 焊接工裝夾具設(shè)計(jì)手冊
- 醫(yī)院開展急救知識培訓(xùn)計(jì)劃方案
評論
0/150
提交評論