隊(duì)列(FIFO)是一種常見的線性存儲結(jié)構(gòu),在嵌入式開發(fā)中經(jīng)常用到,主要的應(yīng)用場景有:
1. 高級一點(diǎn)的單片機(jī)內(nèi)部串行通信模塊,像UART、SPI、CAN等串行通信,內(nèi)部帶有FIFO緩存。有FIFO的模塊可以一次寫入或保存多個數(shù)據(jù),而沒有FIFO的模塊只可以寫入或保存一個數(shù)據(jù)。
2. 在RTOS中,可以通過消息隊(duì)列實(shí)現(xiàn)任務(wù)(線程)間的通信
3. 解決CPU與外設(shè)由于速度差導(dǎo)致的阻塞

寫數(shù)據(jù)索引write,讀數(shù)據(jù)索引read,數(shù)據(jù)個數(shù)為write-read,普通隊(duì)列寫索引永遠(yuǎn)不小于讀索引。但我們可利用的棧內(nèi)存是有限的。
一種優(yōu)化的隊(duì)列是環(huán)形隊(duì)列,也可以理解為首尾相連的隊(duì)列。當(dāng)寫索引到達(dá)最大分配內(nèi)存時,跳回到隊(duì)列的頭部繼續(xù)寫入,數(shù)據(jù)個數(shù)為(write+BUFFER_SIZE-read)%BUFFER_SIZE。

下面以使用環(huán)形隊(duì)列來解決單片機(jī)串口打印阻塞問題為例來說明軟件實(shí)現(xiàn)。




上面代碼已經(jīng)注釋得夠詳細(xì)了,就不再描述了。
在需要打印數(shù)據(jù)時,直接調(diào)用printf函數(shù)格式化打印,在主函數(shù)大循環(huán)中執(zhí)行debug_print_task就可以了。

-
cpu
+關(guān)注
關(guān)注
68文章
11250瀏覽量
223855 -
fifo
+關(guān)注
關(guān)注
3文章
407瀏覽量
45607 -
串口
+關(guān)注
關(guān)注
15文章
1614瀏覽量
82306
發(fā)布評論請先 登錄
基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)
請問串口接受用環(huán)形隊(duì)列,發(fā)送也能用嗎?
環(huán)形隊(duì)列在串口數(shù)據(jù)接收中的使用
如何使用隊(duì)列實(shí)現(xiàn)STM32串口環(huán)形緩沖?
實(shí)現(xiàn)隊(duì)列環(huán)形緩沖的方法
聊一聊串口環(huán)形隊(duì)列常用的幾種方法
cubeMX+STM32+Freertos 讀隊(duì)列時阻塞
FreeRTOS+STM32F103串口通信錯誤解決方法
STM32串口環(huán)形緩沖--使用隊(duì)列實(shí)現(xiàn)(開放源碼)
基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試心得
基于環(huán)形隊(duì)列的串口打印阻塞解決方法
評論