FIFO在嵌入式應用的非常廣泛,可以說有數(shù)據(jù)收發(fā)的地方,基本就有FIFO的存在,今天給大家分享一款基于C語言實現(xiàn)的FIFO模塊:xqueue.
1. 為什么需要FIFO
FIFO 是First-In First-Out的縮寫,它是一個具有先入先出特點的緩沖區(qū)。
可以理解成一個大的水池,水對應數(shù)據(jù),注水速度對應數(shù)據(jù)輸入的頻率,放水速度對應數(shù)據(jù)處理的速度,當注水速度和放水速度相同時,我們不需要使用水池來緩沖,但是當注水速度大于放水速度,或者注水速度突然變大時(突發(fā)),為了保證水池不溢出(數(shù)據(jù)不丟失),就需要水池(緩沖區(qū))來處理這種突發(fā)情況,并設置合理大小的水池空間(FIFO的深度)。
或者為了降低CPU負擔,提高數(shù)據(jù)處理效率,可以在積累到一定的數(shù)據(jù)量之后,再一次性處理。
在FPGA中,F(xiàn)IFO一般是使用RAM存儲器作為緩沖區(qū),可以分為同步FIFO或異步FIO,一般用于數(shù)據(jù)緩沖,或者不同時鐘域之間的數(shù)據(jù)傳遞。
在單片機中,一般是基于一維數(shù)組和結(jié)構(gòu)體實現(xiàn)的循環(huán)隊列(Queue),或者叫環(huán)形隊列。
FIFO的使用,既可以保證數(shù)據(jù)的完整性,還可以讓數(shù)據(jù)被及時的處理。
本文介紹,基于C語言的循環(huán)隊列緩沖區(qū)原理、設計與實現(xiàn)。
2. FIFO的存取順序
定義一個一維數(shù)組當作存儲區(qū),數(shù)組長度為6,再定義兩個讀寫指針變量。
初始化時,F(xiàn)IFO為空,讀寫指針相等,并都置為0。
寫入一個數(shù)據(jù)1之后,寫指針遞增,讀指針不變:
再寫兩個數(shù)據(jù)2和3,寫指針遞增,讀指針不變:
寫了三個數(shù)據(jù)之后,我們讀出一個數(shù)據(jù)1,寫指針不變,讀指針遞增:
讀出一個數(shù)據(jù)2,再寫兩個數(shù)據(jù)4和5,讀寫指針變化:
再寫一個數(shù)據(jù)6,此時超過數(shù)組長度,但是數(shù)組頭部還有空間,所以寫指針回到數(shù)組起始地址0:
再寫一個數(shù)據(jù)7,此時判斷FIFO滿:
可能會有朋友疑惑,不是還有一個空位置可以存放數(shù)據(jù)嗎?
如果再存入一個數(shù)據(jù)之后,讀寫指針相等,此時可以判斷是滿狀態(tài)嗎?
顯然是不能,因為當FIFO為空時,也是讀寫指針相等,所以這種情況就無法判斷滿和空。
這里就涉及到FIFO設計中,最重要的滿和空的判斷條件,需要遵循FIFO讀寫的兩個規(guī)則:
FIFO為空時,不能執(zhí)行讀操作
FIFO為滿時,不能執(zhí)行寫操作
為了避免這種情況發(fā)生,我們空出一個元素位置,寫指針指向的位置永遠為空,這樣就會有兩種滿的情況:
rd < wr
rd > wr
對于第一種情況,當(wr + 1) % FIFO_SIZE == rd時,可以認為FIFO滿,F(xiàn)IFO_SIZE是指數(shù)組長度;
對于第二種情況,當wr + 1 == rd時,可以認為FIFO滿。
以上兩種情況可以合并為一種,即(wr + 1) % FIFO_SIZE == rd時,判斷FIFO滿。
所以這種判斷方式,會犧牲一個存儲位置,實際可以存儲的元素個數(shù)為FIFO_SIZE-1。
同理,獲取當前FIFO內(nèi)元素的個數(shù),也可以分為兩種情況:
當wr > rd時, count = wr - rd
當wr < rd時,count = wr + FIFO_SIZE - rd
3. FIFO的代碼實現(xiàn)
根據(jù)以上FIFO存取邏輯,我們可以使用一維數(shù)組來構(gòu)造一個環(huán)形緩沖區(qū),讀寫地址循環(huán)遞增,分別實現(xiàn)FIFO初始化、讀寫操作、判斷空滿、獲取元素個數(shù)等函數(shù),并封裝成模塊。
xqueue.h
xqueue.c文件
實際應用:
運行結(jié)果:
循環(huán)隊列元素的數(shù)據(jù)類型,可以根據(jù)需要指定,也可以是結(jié)構(gòu)體類型。
審核編輯:劉清
-
嵌入式
+關(guān)注
關(guān)注
5068文章
19021瀏覽量
303322 -
存儲器
+關(guān)注
關(guān)注
38文章
7453瀏覽量
163608 -
RAM
+關(guān)注
關(guān)注
8文章
1367瀏覽量
114533 -
C語言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136210 -
FIFO芯片
+關(guān)注
關(guān)注
0文章
10瀏覽量
8802
原文標題:分享一款基于C語言實現(xiàn)的FIFO模塊
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論