隊列(FIFO)是一種常見的線性存儲結構,在嵌入式開發中經常用到,主要的應用場景有:
1. 高級一點的單片機內部串行通信模塊,像UART、SPI、CAN等串行通信,內部帶有FIFO緩存。有FIFO的模塊可以一次寫入或保存多個數據,而沒有FIFO的模塊只可以寫入或保存一個數據。
2. 在RTOS中,可以通過消息隊列實現任務(線程)間的通信
3. 解決CPU與外設由于速度差導致的阻塞

寫數據索引write,讀數據索引read,數據個數為write-read,普通隊列寫索引永遠不小于讀索引。但我們可利用的棧內存是有限的。
一種優化的隊列是環形隊列,也可以理解為首尾相連的隊列。當寫索引到達最大分配內存時,跳回到隊列的頭部繼續寫入,數據個數為(write+BUFFER_SIZE-read)%BUFFER_SIZE。

下面以使用環形隊列來解決單片機串口打印阻塞問題為例來說明軟件實現。




上面代碼已經注釋得夠詳細了,就不再描述了。
在需要打印數據時,直接調用printf函數格式化打印,在主函數大循環中執行debug_print_task就可以了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
cpu
+關注
關注
68文章
11268瀏覽量
224533 -
fifo
+關注
關注
3文章
407瀏覽量
45694 -
串口
+關注
關注
15文章
1617瀏覽量
82592
發布評論請先 登錄
相關推薦
熱點推薦
環形隊列在串口數據接收中的使用
前言??書接上回,前文主要介紹了環形隊列的實現原理以及C語言實現及測試過程,本文將回歸到嵌入式平臺的應用中,話不多說,淦,上干貨!實驗目的HAL庫下串口的配置及使用環形
發表于 12-06 06:27
聊一聊串口環形隊列常用的幾種方法
,必須通過標志位判斷上一個包數據是否發送完成,在把新的數據覆蓋到串口的緩沖區。DMA方式優點: 不占用系統資源,減少CPU對中斷的響應。如何不建立數據包的隊列,還是會出現,需要等待阻塞的問題。
發表于 07-21 15:17
cubeMX+STM32+Freertos 讀隊列時阻塞
讀隊列時阻塞本例內容是創建一個隊列,由多個任務往隊列中寫數據,以及從隊列中把數據讀出。這個隊列創
發表于 12-09 15:21
?10次下載
FreeRTOS+STM32F103串口通信錯誤解決方法
在調試FreeRTOS系統時,在串口中斷中用隊列存儲數據,然后再定時器中斷中用隊列接收數據,并通過串口打印出來。在調試代碼中編譯器報錯。在網
發表于 12-24 18:45
?11次下載
以太網阻塞的常見原因與解決方法
以太網阻塞的常見原因與解決方法 以太網阻塞是指在以太網中數據流量增加超過網絡設備處理能力的情況下,導致網絡性能下降、延遲增加、丟包率上升等問題。下面將詳細討論以太網阻塞的常見原因及
嵌入式環形隊列與消息隊列的實現原理
嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針
基于環形隊列的串口打印阻塞解決方法
評論