隊(duì)列(FIFO)是一種常見的線性存儲(chǔ)結(jié)構(gòu),在嵌入式開發(fā)中經(jīng)常用到,主要的應(yīng)用場景有:
1. 高級一點(diǎn)的單片機(jī)內(nèi)部串行通信模塊,像UART、SPI、CAN等串行通信,內(nèi)部帶有FIFO緩存。有FIFO的模塊可以一次寫入或保存多個(gè)數(shù)據(jù),而沒有FIFO的模塊只可以寫入或保存一個(gè)數(shù)據(jù)。
2. 在RTOS中,可以通過消息隊(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ì)列來解決單片機(jī)串口打印阻塞問題為例來說明軟件實(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文章
11013瀏覽量
215303 -
fifo
+關(guān)注
關(guān)注
3文章
397瀏覽量
44512 -
串口
+關(guān)注
關(guān)注
14文章
1580瀏覽量
78383
發(fā)布評論請先 登錄
請問串口接受用環(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ì)列的相關(guān)資料分享
聊一聊串口環(huán)形隊(duì)列常用的幾種方法
cubeMX+STM32+Freertos 讀隊(duì)列時(shí)阻塞

FreeRTOS+STM32F103串口通信錯(cuò)誤解決方法

STM32串口環(huán)形緩沖--使用隊(duì)列實(shí)現(xiàn)(開放源碼)

基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試心得

評論