隊(duì)列(FIFO)是一種常見(jiàn)的線性存儲(chǔ)結(jié)構(gòu),在嵌入式開(kāi)發(fā)中經(jīng)常用到,主要的應(yīng)用場(chǎng)景有:
1. 高級(jí)一點(diǎn)的單片機(jī)內(nèi)部串行通信模塊,像UART、SPI、CAN等串行通信,內(nèi)部帶有FIFO緩存。有FIFO的模塊可以一次寫入或保存多個(gè)數(shù)據(jù),而沒(méi)有FIFO的模塊只可以寫入或保存一個(gè)數(shù)據(jù)。
2. 在RTOS中,可以通過(guò)消息隊(duì)列實(shí)現(xiàn)任務(wù)(線程)間的通信
3. 解決CPU與外設(shè)由于速度差導(dǎo)致的阻塞
寫數(shù)據(jù)索引write,讀數(shù)據(jù)索引read,數(shù)據(jù)個(gè)數(shù)為write-read,普通隊(duì)列寫索引永遠(yuǎn)不小于讀索引。但我們可利用的棧內(nèi)存是有限的。
一種優(yōu)化的隊(duì)列是環(huán)形隊(duì)列,也可以理解為首尾相連的隊(duì)列。當(dāng)寫索引到達(dá)最大分配內(nèi)存時(shí),跳回到隊(duì)列的頭部繼續(xù)寫入,數(shù)據(jù)個(gè)數(shù)為(write+BUFFER_SIZE-read)%BUFFER_SIZE。
下面以使用環(huán)形隊(duì)列來(lái)解決單片機(jī)串口打印阻塞問(wèn)題為例來(lái)說(shuō)明軟件實(shí)現(xiàn)。
上面代碼已經(jīng)注釋得夠詳細(xì)了,就不再描述了。
在需要打印數(shù)據(jù)時(shí),直接調(diào)用printf函數(shù)格式化打印,在主函數(shù)大循環(huán)中執(zhí)行debug_print_task就可以了。
-
cpu
+關(guān)注
關(guān)注
68文章
10901瀏覽量
212664 -
fifo
+關(guān)注
關(guān)注
3文章
389瀏覽量
43813 -
串口
+關(guān)注
關(guān)注
14文章
1557瀏覽量
76859
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論