2023-06-23 17:40:30來源:博客園
循環(huán)隊列多用于通信數(shù)據(jù)緩存中,尤其是在雙方設(shè)備接收數(shù)據(jù)與處理數(shù)據(jù)不同步的情況下,使用循環(huán)隊列先緩存通信數(shù)據(jù),然后按照時間戳數(shù)據(jù)出隊作出相應(yīng)的處理,是一種比較合適的做法,在嵌入式編程中亦是如此。使用循環(huán)隊列的數(shù)據(jù)結(jié)構(gòu)可以實現(xiàn)上述功能,在一些低端的編程平臺手寫一個循環(huán)隊列既滿足了功能需求又不會開銷太多資源。
設(shè)計思想實現(xiàn)一個隊列可以使用順序表(數(shù)組)或鏈表實現(xiàn)。前者訪問速度塊,但是要占用連續(xù)的存儲空間,適用于內(nèi)存小但是速度要求較快的存儲場合。后者訪問速度慢但是基于鏈表式的結(jié)構(gòu),可以使用碎片內(nèi)存,適用內(nèi)存大,速度慢的場合。本文面向的編程平臺是中低端MCU,時鐘主頻、RAM空間有限,因此選用順序表來實現(xiàn)循環(huán)隊列。關(guān)于順序表實現(xiàn)循環(huán)隊列的文章網(wǎng)上又很多,但是大多都基于一個明確的數(shù)據(jù)類型,如果在一個工程中兩種完全不同的數(shù)據(jù)類型都想使用循環(huán)隊列的數(shù)據(jù)結(jié)構(gòu)就會使得相同的代碼出現(xiàn)多次,導(dǎo)致代碼冗余。泛類型循環(huán)隊列的思想是將順序表中每個節(jié)點都看作一個uint8_t*類型的指針,在隊列初始化時,要傳入節(jié)點占用空間字節(jié)數(shù),對每個節(jié)點malloc一個相應(yīng)的存儲空間,當(dāng)數(shù)據(jù)入隊時使用memcpy函數(shù)將源地址字節(jié)數(shù)拷貝到目標(biāo)地址即可,隊列數(shù)據(jù)表的結(jié)構(gòu)有點類似于哈希表,操作與定類型循環(huán)隊列類似。
代碼實現(xiàn)隊列實現(xiàn)包含兩個文件:queue.h和queue.cqueue.h:使用枚舉自定義BOOL類型,C99標(biāo)準(zhǔn)之后包含stdbool.h可使用標(biāo)準(zhǔn)布爾型
(資料圖)
typedef enum { FALSE, TRUE } BOOL;
宏定義順序表中的節(jié)點類型
#define NODTETYPE uint8_t*
定義循環(huán)隊列結(jié)構(gòu)體
typedef struct Queue{uint32_t capacity; // 隊列總?cè)萘縰int32_t size; // 當(dāng)前隊列大小uint32_t front; // 隊列頭節(jié)點uint32_t rear; // 隊列尾節(jié)點 NODTETYPE* data; //存儲節(jié)點的順序表} Queue;
接口函數(shù)
/* 初始化一個隊列 */BOOL init_queue(Queue *queue,uint32_t _capacity,uint32_t DataWidth);/* 數(shù)據(jù)入隊 */BOOL en_queue(Queue* _queue, NODTETYPE _data,uint32_t DataWidth);/*隊列判空*/BOOL isempty_queue(Queue* _queue);/*隊列判滿*/BOOL isfull_queue(Queue* _queue);/* 數(shù)據(jù)出隊 */NODTETYPE de_queue(Queue* _queue);/* 清空隊列 */void clear_queue(Queue* _queue);
queue.c隊列初始化,此處必須傳入節(jié)點的數(shù)據(jù)占用字節(jié)數(shù)DataWidth,注意可用隊列容量總是比傳入?yún)?shù)_capacity小一,因為要判空和判滿。
BOOL init_queue(Queue *queue,uint32_t _capacity,uint32_t DataWidth){ NODTETYPE *buff= (NODTETYPE*)malloc(_capacity*sizeof(NODTETYPE)); if(buff==NULL) return FALSE; for(int i=0;i<_capacity;i++) { NODTETYPE NodeTemp=(NODTETYPE)malloc(DataWidth); if(NodeTemp==NULL) return FALSE; else buff[i]=NodeTemp; } queue->data=buff; queue->capacity = _capacity; queue->size = 0; queue->front = 0; queue->rear = 0; return TRUE;}
數(shù)據(jù)節(jié)點入隊
BOOL en_queue(Queue* _queue, NODTETYPE _data,uint32_t DataWidth){ BOOL isFull; isFull = isfull_queue(_queue); if (isFull == TRUE) { _queue->front = (_queue->front + 1) % _queue->capacity; } memcpy(_queue->data[_queue->rear], _data,DataWidth); _queue->rear = (_queue->rear + 1) % _queue->capacity; _queue->size++; return isFull;}
數(shù)據(jù)節(jié)點出隊
NODTETYPE de_queue(Queue* _queue){ if (isempty_queue(_queue)) return NULL; NODTETYPE result = _queue->data[_queue->front]; _queue->front = (_queue->front + 1) % _queue->capacity; _queue->size--; return result;}
隊列清空,但是不釋放存儲空間
void clear_queue(Queue* _queue){ _queue->front = _queue->rear = 0; _queue->size = 0;}
隊列判空
BOOL isempty_queue(Queue* _queue){if (_queue->front == _queue->rear)return TRUE;elsereturn FALSE;}
隊列判滿
BOOL isfull_queue(Queue* _queue){if ((_queue->rear + 1) % _queue->capacity == _queue->front)return TRUE;elsereturn FALSE;}
隊列清空并釋放內(nèi)存
void release_queue(Queue* _queue){ for(int i=0;i<_queue->capacity;i++) { free(_queue->data[i]); _queue->data[i]=NULL; } clear_queue(_queue); free(_queue); _queue = NULL;}
調(diào)用時入隊時,要先將節(jié)點數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)化為uint8_t類型,傳入形參,出隊時獲取一個uint8_t的指針,然后強(qiáng)制轉(zhuǎn)換為定義的節(jié)點類型指針,之后就可以訪問到出隊節(jié)點的數(shù)據(jù),舉例如下:
#include "queue.h"typedef struct ClassTest //定義測試類型{ uint8_t a; uint16_t b; uint32_t c;}ClassTest;int main(int argc, char *argv[]){ Queue queue1; Queue queue2; init_queue(&queue1,100,sizeof (ClassTest)); init_queue(&queue2,200,1); //測試隊列2就用uint8_t int i=0; uint8_t queue1_node=0; ClassTest queue2_node={0,0,0}; while(isfull_queue(&queue1)==FALSE) { queue1_node=i++; en_queue(&queue1,&queue1_node,sizeof (queue1_node)); } i=0; while(isfull_queue(&queue2)==FALSE) { queue2_node.a=i++; queue2_node.b=2*i; en_queue(&queue2,(uint8_t*)(&queue2_node),sizeof (queue2_node)); } while(isempty_queue(&queue1)==FALSE) { NODTETYPE node=de_queue(&queue1); printf("%d;",*((uint8_t*)(node))); } while(isempty_queue(&queue2)==FALSE) { NODTETYPE node=de_queue(&queue2); prinf("%d;",((ClassTest*)(node))->b); }}
關(guān)鍵詞:
責(zé)任編輯:1、向左轉(zhuǎn)|向右轉(zhuǎn)。相信通過里程表是什么意思這篇文章能幫到你,在和好
1、全國6大體院是:北京體育學(xué)院,武漢體院,上海體院,沈陽體院,廣州
養(yǎng)老金調(diào)整好消息傳來!2023年退休人員養(yǎng)老金已進(jìn)行調(diào)整,并且下發(fā)消息
【土烏防長通電話討論黑海港口農(nóng)產(chǎn)品外運協(xié)議問題】財聯(lián)社6月23日電,
1、向左轉(zhuǎn)|向右轉(zhuǎn)。相信通過里程表是什么意思這篇文章能幫到你,在和好
剛剛宜昌市教育招考辦發(fā)布2023年宜昌中考試卷及參考答案一起來看(點擊
1、(1)馬山紅扣黑山羊南寧馬山縣被譽(yù)為“中國黑山羊之鄉(xiāng)”,紅扣黑山
吃粽子、聽音樂、購好物、享好禮……為迎接傳統(tǒng)端午佳節(jié),豐富市民游客
1、失業(yè)即達(dá)到就業(yè)年齡具備工作能力謀求工作但未得到就業(yè)機(jī)會的狀態(tài)。2
從高原到海防,從繁華都市到遠(yuǎn)??仗?hellip;…端午節(jié)的夜晚,軍人總能看到不
綠粽飄香,又是一年端午節(jié)。為進(jìn)一步傳承和弘揚中華民族優(yōu)秀傳統(tǒng)文化,
研究團(tuán)隊使用FAST探測到M71E雙星系統(tǒng),長期觀測后確定這一系統(tǒng)兩顆星繞
中新網(wǎng)???月21日電(王子謙 尹建軍)海南省自然資源和規(guī)劃廳21日介
本報記者黃群近日,《證券日報》記者從安徽省量子計算工程研究中心獲悉
1、創(chuàng)建QQ郵箱的具體步驟如下:2、首先打開電腦,點擊打開電腦桌面上的
1、有人看守鐵路道口的道路交通(警告)標(biāo)志:其形狀為等邊三角形,頂角
此前在考察“泰坦尼克”號郵輪殘骸途中失蹤的“泰坦”號美國深海潛水器
1、Linux下vi命令編輯器怎樣編輯及保存退出方法如下:如圖,vi文件名,
TheFirstChinaLeisureSportsChallengeandthe11thNeijiangDaqianDragonB
恒生科技指數(shù)跌幅擴(kuò)大至逾2%,恒指跌1 8%。汽車股普跌,小鵬汽車跌超7%
1、全國6大體院是:北京體育學(xué)院,武漢體院,上海體院,沈陽體院,廣州
三湘都市報·新湖南客戶端6月23日訊(全媒體記者虢燦實習(xí)生陸婷通訊員
美國國會或修改貿(mào)易法案加強(qiáng)小額郵包監(jiān)管,將影響跨境電商,美國國會可
碩世生物(688399)06月21日在投資者關(guān)系平臺上答復(fù)了投資者關(guān)心的問題。
來為大家解答以上問題,一寸照片尺寸多大電子版,一寸照片尺寸很多人還
湖人歡迎席菲諾&劉易斯兩名新秀:歡迎加入紫金軍團(tuán)!,湖人,胡德,韋爾,
來為大家解答以上問題,小米換機(jī)app,小米換機(jī)很多人還不知道,現(xiàn)在讓
福彩快樂8第2023163期開出獎號:020407101226414546495458596364707172
生肖鼠的人心態(tài)樂觀,事業(yè)高升,具有想象力,大財富和小財富都?xì)g迎你進(jìn)
IT之家6月21日消息,微軟近日推出了適用于Win11系統(tǒng)的LinkedIn預(yù)覽版(
高考填報志愿時,北京師范大學(xué)-香港浸會大學(xué)聯(lián)合國際學(xué)院招生計劃是廣
近年來,隨著人民生活水平的不斷提高,機(jī)動車保有量快速增長。城區(qū)停車
陜西省氣象臺2023年6月23日9時30分發(fā)布高溫藍(lán)色預(yù)警:受偏北氣流影響,
為進(jìn)一步弘揚中國傳統(tǒng)文化,豐富社區(qū)工作者精神文化生活,提升社區(qū)工作
中國網(wǎng)財經(jīng)6月21日訊(記者李冰)近日,宿州銀保監(jiān)分局披露行政處罰信息
云南網(wǎng)訊(記者段芃)隨著端午假期來臨,昆明公交積極響應(yīng)民生所需,提
內(nèi)蒙古2023年主管護(hù)師考試成績單打印入口已開通由主管護(hù)師考試欄目提供
兩條顏色鮮艷的龍,中間擺著小龍蝦、螃蟹等玩偶,輪胎中心的圓畫的是各
6月22日,端午小長假第一天。傍晚,成都東二環(huán)萬達(dá)廣場,人聲鼎沸,一
養(yǎng)老金調(diào)整好消息傳來!2023年退休人員養(yǎng)老金已進(jìn)行調(diào)整,并且下發(fā)消息
1、建議1 你更換一下ip地址,有可能管理員把你的ip屏蔽了。2、2 請確定
清朝是中國歷史上最后一個封建王朝,其歷史長達(dá)268年。雖然在清朝的前
【土烏防長通電話討論黑海港口農(nóng)產(chǎn)品外運協(xié)議問題】財聯(lián)社6月23日電,
這兩個人一死,李唐宗室就只剩唐玄宗一個人了,那時的唐玄宗也已年邁六
App6月21日消息,欣旺達(dá)公告,無錫國壽、中銀資產(chǎn)、建信領(lǐng)航、重慶制造
直播日照6月22日訊日前召開的全市質(zhì)量發(fā)展暨標(biāo)準(zhǔn)化創(chuàng)新與知識產(chǎn)權(quán)保護(hù)
在5月、6月的周末南京鐘山風(fēng)景區(qū)日均客流量都在8-10萬左右“停車難”一
1、《柯云路文集:汾城軼聞(修訂版)》是2018年11月1日中國文聯(lián)出版社
受佛山方向移近的強(qiáng)雷雨云團(tuán)影響,預(yù)計未來1~3小時廣州市越秀區(qū)、天河
6月14日,平和縣“一橋一公園”防范和處置非法集資主題公園啟用,縣委
循環(huán)隊列多用于通信數(shù)據(jù)緩存中,尤其是在雙方設(shè)備接收數(shù)據(jù)與處理數(shù)據(jù)不
如果像英偉達(dá)及其客戶所認(rèn)為的那樣,生成式人工智能領(lǐng)域?qū)⒂瓉肀l(fā)期,
吉林松原市長嶺縣,湖南省張家界市桑植縣,兩個相距甚遠(yuǎn)的地方。因為一
如何與大股東劃清界限是眾安智慧生活急需考慮的問題。
1、第20集。2、小熊隊和銀鷹隊相遇。相信通過我的少年時代這篇文章能幫
國王認(rèn)真考慮今夏給薩博尼斯提前續(xù)約合同,續(xù)約合同,美國籃球,自由球員,
6月20日,濟(jì)源召開道路交通安全大整治大提升專項行動工作總結(jié)暨電動車
針對有報道稱,日方已決定不再向韓方就解除禁止進(jìn)口福島水產(chǎn)品施壓,也
經(jīng)歷了好幾次推遲上市的風(fēng)波,長城董事長魏建軍喊出“寧可辜負(fù)消費者一
江岸區(qū)的“星湖灣”,有業(yè)主表示,項目按精裝房標(biāo)準(zhǔn)銷售和交付,約2 2
1、USB接口:通用串行總線(英語:UniversalSerialBus,縮寫:USB)是
女性生完孩子之后想要避孕,除了結(jié)扎還有什么更安全的方法?1、除了結(jié)扎
1、北京安防系統(tǒng)批發(fā)很多,北京是一個安防行業(yè)主要的集中地,建議根據(jù)
海外網(wǎng)6月21日電綜合俄羅斯RBC電視臺、日本NHK電視臺21日報道,俄羅斯
1、有太原北辰雙語學(xué)校、山西通寶育杰學(xué)校、金太陽小學(xué)、太原杏嶺實驗
【這些年,我們創(chuàng)造的奇跡⑩】記者從國家林草局獲悉,最新公布的2022年
6月23日消息,據(jù)燈塔專業(yè)版實時數(shù)據(jù),截至6月23日14時49分,2023年端午
安置房上市交易要補(bǔ)土地出讓金嗎依據(jù)我國相關(guān)法律的規(guī)定,如果安置房是
本報記者熊家明湖北省宜昌市高新區(qū)市場監(jiān)管局創(chuàng)新舉措、科技賦能,依托
?6月20日,新疆維吾爾自治區(qū)第二屆大學(xué)生鄉(xiāng)村振興創(chuàng)意大賽在新疆理工
慈禧是漢人還是滿人1、對于慈禧是漢人的說法,最先是來自一群山西長治
申請工傷的條件可以是職工在用人單位工作時因為工作原因受傷;在單位工
報道稱,一架裝備了“維捷布斯克-25”對抗套件的俄羅斯卡-52武裝直升機(jī)
我市南水北調(diào)中線工程寶坻引江供水工程正式通過通水驗收,具備向?qū)氎鎱^(qū)
1、第三關(guān):【把右下角更換成‘主題’,輸入‘睡衣’,衣服盡量多穿。2
世界杯!中國男籃有5大免檢球員,已經(jīng)得到喬爾杰維奇認(rèn)可,周琦,周鵬,世
調(diào)圖后,全國鐵路安排圖定旅客列車10592列,較現(xiàn)圖增加46列;開行貨物
6月20日,人們在日本福島市參加反對核污染水排海的抗議活動。6月20日,
端午在海外丨賽龍舟學(xué)書法英國小伙體驗中國傳統(tǒng)文化
普京當(dāng)天還表示,俄羅斯將繼續(xù)發(fā)展“三位一體”核力量,一半以上的俄羅
6月23日,據(jù)廣東省教育考試院消息,2023年廣東省普通高考評卷工作已經(jīng)
距離初次玩《大富翁4》已經(jīng)過了差不多25年了,一直不能忘懷當(dāng)初和幾位
為發(fā)揮我校省特色高中和省物理學(xué)科基地的優(yōu)勢,為國家培養(yǎng)綜合素質(zhì)優(yōu)秀
據(jù)應(yīng)急管理部消息,6月21日20時40分許,寧夏回族自治區(qū)銀川市興慶區(qū)一
端午浴芳蘭,流香滿晴川,歲歲端午,今又端午。2023年6月22日上午10點
中企與柬埔寨學(xué)生“沉浸式”過端午
加州初創(chuàng)公司Pebble今天宣布,已從Lightspeed光速光合,元璟資本,UpHo
上海交通大學(xué)醫(yī)學(xué)院附屬第九人民醫(yī)院專技崗位招聘啟事根據(jù)《上海市事業(yè)
1、深圳市明正科技有限公司于2017年04月11日成立。2、法定代表人張富強(qiáng)
雖然今年的《星空》直面會長達(dá)45分鐘,展示了很多東西,但還有很多問題
1、環(huán)境不錯,學(xué)校教學(xué)樓不錯,管得比較嚴(yán),對學(xué)生要求很高,宿舍很干
均普智能(688306)06月21日在投資者關(guān)系平臺上答復(fù)了投資者關(guān)心的問題。
2024初級護(hù)師考試備考知識點:上消化道大量出血護(hù)理措施由初級護(hù)師考試
今年江蘇養(yǎng)老金調(diào)整通告出爐嗎?端午節(jié)即將來臨了,一般來說端午節(jié)假期
近日,《名偵探柯南》漫畫最新的1115話已經(jīng)更新了,這一話依舊是新篇章
尤其是學(xué)生們步入高中之后,進(jìn)入了青春期,難免會對異性比較好奇。換做
1、在白紙上用線條和曲線勾勒出媽媽的頭部輪廓,畫出她的五官和頭發(fā)。2
天眼查App顯示,6月19日,恒大地產(chǎn)集團(tuán)有限公司新增3條被執(zhí)行人信息,
成都國色天鄉(xiāng)水陸樂園端午節(jié)活動匯總2023陸地樂園超多端午限定互動游戲
蘇州專業(yè)網(wǎng)頁設(shè)計公司:如何為你的企業(yè)打造高質(zhì)量的網(wǎng)站?在如今數(shù)字化
大會以“氫城之鏈,生態(tài)共建”為主題,聚焦氫能產(chǎn)業(yè)熱點,重點圍繞氫能
正值一年一度的端午假期,市場上各類粽子琳瑯滿目。然而,廣州一女子在
目前,恒大地產(chǎn)存在529條被執(zhí)行人信息,被執(zhí)行總金額421 29億元。
1、1 梨花頭公主造型齊劉海是最有公主范的發(fā)型,可愛甜美。2、側(cè)戴一朵