當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號」一起進(jìn)步!1隊列類比通信最近開啟了一個新的項目,與以往的產(chǎn)品有點差異,存在一些技術(shù)盲區(qū)和難點,所以大部分時間都在查閱資料、仿真、交流等等,有時候吃飯都在思考設(shè)計上的一些問題~對于研發(fā)人員而言,能夠接手一個新的綜合性項目,不僅僅能夠在其中吸收...


關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號」一起進(jìn)步!

1

隊列類比通信

最近開啟了一個新的項目,與以往的產(chǎn)品有點差異,存在一些技術(shù)盲區(qū)和難點,所以大部分時間都在查閱資料、仿真、交流等等,有時候吃飯都在思考設(shè)計上的一些問題~對于研發(fā)人員而言,能夠接手一個新的綜合性項目,不僅僅能夠在其中吸收到新的技術(shù)和思路,也可以反過來思考老項目的方案和設(shè)計,最終達(dá)到技術(shù)上的整體提升。所以一個字"忙",今天好不容易抽出了一些時間,跟大家分享一個好玩的東西-“?隊列?”~隊列還要講嗎?不就是一種FIFO的數(shù)據(jù)結(jié)構(gòu)嗎?你說得很對,不過今天不單單講隊列,如下圖所示:可以看出隊列主要有兩個功能:?1)用來轉(zhuǎn)移數(shù)據(jù);2)進(jìn)行數(shù)據(jù)緩存類比平時的通信過程,也主要是進(jìn)行數(shù)據(jù)轉(zhuǎn)移,當(dāng)通信的雙方可能存在處理速度、響應(yīng)上的較大差異時,就需要我們構(gòu)建軟件上的數(shù)據(jù)緩存或者其他同步機(jī)制,當(dāng)然目前一些高性能的外設(shè)都存在硬件上的FIFO。這樣類比下來,平時實現(xiàn)的串口通信,IIC通信的等等通信過程,在軟件里面進(jìn)行抽象與虛擬用隊列這樣的數(shù)據(jù)結(jié)構(gòu)就再合適不過了,玩過OS的朋友都知道,OS中一般都會提供消息隊列等等這樣的通信服務(wù),也是類似的道理~2

思路

既然我們把通信與隊列統(tǒng)一起來了,那么你還會選擇一個包一個包的直接數(shù)據(jù)處理嗎?類似于你直接拿著一幀串口來規(guī)定其每個bit的含義一樣~有些朋友可能會說,那我把數(shù)據(jù)包定義大一點,隊列的元素以struct_pack來作為整包入隊,確實這樣也是可行的,一般大家也是這么做的。但是如果你所傳遞的數(shù)據(jù)包格式、大小等等差異較大,是不是就會存在傳遞小數(shù)據(jù)包而浪費(fèi)內(nèi)存,并且降低隊列傳遞效率的問題呢?為了設(shè)計一個隊列支持多種格式的數(shù)據(jù)傳遞,并且能夠達(dá)到較大的節(jié)省內(nèi)存和提高效率,那么核心思想就是"化時間為空間"。思路回到通信上來~

不管什么通信過程,其實對于大多數(shù)的情況都是一個個的字節(jié)傳遞即字節(jié)流,讓通信過程變得更加有意義,無非就是承載了各種各樣的通信協(xié)議,那么不同的通信協(xié)議就展現(xiàn)出了不同的效果~

3

設(shè)計

我們來大致實現(xiàn)這個過程~
在資源緊張的MCU中一般會這樣做,使用隊列主要涉及到3個函數(shù):入隊列、出隊列以及隊列當(dāng)前大小 :

1//入隊列
2uint8_t?QueueIn(uint8_t?uByte);??
3
4//出隊列
5uint8_t?QueueOut(void);
6
7//當(dāng)前隊列大小
8uint8_t?QueueSize(void);

指定通信協(xié)議,非常的簡潔,不需要考慮丟包和重發(fā)機(jī)制。數(shù)據(jù)格式定義如下 :1數(shù)據(jù)長度1? ?數(shù)據(jù)區(qū)1? ?...?數(shù)據(jù)長度N? ?數(shù)據(jù)區(qū)N
2
3byte1???|??byte2?~?byteX?|?...?|byteY?|?byte(Y 1)?~?byteZ

參考偽代碼:
1/*********************************************
2?*?隊列數(shù)據(jù)包定義
3?********************************************/

4typedef?struct?_tag_pack
5{
6????uint8_t?len;
7????uint8_t?dataBuff[MAX_DATA_LEN];
8}QueuePack;
9
10/*********************************************
11?*?Function:?SendPack
12?*?Description:用于發(fā)送數(shù)據(jù)包的打包入隊過程
13?*?Author:?bug菌
14?********************************************/

15uint8_t?SendPack(QueuePack?*?pQueuePack)
16{
17????uint8_t?Cnt?=?0;
18
19????//進(jìn)入臨界區(qū)--對于多任務(wù)系統(tǒng)
20????if(QueueIn(pQueuePack->len))
21????{
22????????return?false;?//queue?overflow
23????}
24
25????for(Cnt?=?0;Cnt?len;Cnt )
26????{
27????????if(QueueIn(pQueuePack->dataBuff[Cnt]))
28????????{
29????????????return?false;?//queue?overflow
30????????}
31????}
32????//出臨界區(qū)--對于多任務(wù)系統(tǒng)
33????return?return;?//queue?success
34}
35/*********************************************
36?*?Function:?RevPack
37?*?Description:由于接受隊列數(shù)據(jù)包解析過程
38?*?Author:?bug菌
39?********************************************/

40uint8_t?RevPack(QueuePack?*?pQueuePack)
41{
42????uint8_t?Cnt?=?0;
43
44????//進(jìn)入臨界區(qū)--對于多任務(wù)系統(tǒng)
45????if(QueueSize()?return?false;
46????????pQueuePack->len?=?QueueOut();
47
48????for(Cnt?=?0;Cnt?len;Cnt )
49????{
50????????if(QueueSize()?return?false;?//queue?empty
51????????pQueuePack->dataBuff[Cnt]?=?QueueOut();
52????}
53????//出臨界區(qū)--對于多任務(wù)系統(tǒng)
54????return?return;?//queue?success
55}

這樣我們就可以發(fā)送不同格式的數(shù)據(jù)包,并且在接收端進(jìn)行解析獲得最終的數(shù)據(jù)區(qū)。接受到數(shù)據(jù)區(qū)域以后,比如數(shù)據(jù)區(qū)的第一個字節(jié)表示數(shù)據(jù)包類型,接受端即可識別對應(yīng)的數(shù)據(jù)類型來使用~其實還有很多軟件上的處理都是類比的處理辦法,一旦你把它們統(tǒng)一起來就非常容易了~
最后再小提一下臨界區(qū)的事,對于多任務(wù)系統(tǒng),由于不同任務(wù)的出入隊需要對打包過程進(jìn)行互斥,這樣每個包才具有完整性~最后

?? ?如果覺得本文不錯的話,一定要記得跟bug菌點個再走哦~

往期干貨:

往期推薦



實用 | 10分鐘教你搭建一個嵌入式web服務(wù)器

RT-Thread和Freertos的區(qū)別?

程序如何運(yùn)行?編譯、鏈接、裝入?

串口通信 | 簡單明了的基礎(chǔ)知識

一種無OS的MCU實用軟件框架


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉