0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一款基于C語(yǔ)言實(shí)現(xiàn)的FIFO模塊:xqueue.

strongerHuang ? 來(lái)源:電子電路開(kāi)發(fā)學(xué)習(xí) ? 2023-04-26 09:21 ? 次閱讀

FIFO在嵌入式應(yīng)用的非常廣泛,可以說(shuō)有數(shù)據(jù)收發(fā)的地方,基本就有FIFO的存在,今天給大家分享一款基于C語(yǔ)言實(shí)現(xiàn)的FIFO模塊:xqueue.

1. 為什么需要FIFO

FIFO 是First-In First-Out的縮寫(xiě),它是一個(gè)具有先入先出特點(diǎn)的緩沖區(qū)。

可以理解成一個(gè)大的水池,水對(duì)應(yīng)數(shù)據(jù),注水速度對(duì)應(yīng)數(shù)據(jù)輸入的頻率,放水速度對(duì)應(yīng)數(shù)據(jù)處理的速度,當(dāng)注水速度和放水速度相同時(shí),我們不需要使用水池來(lái)緩沖,但是當(dāng)注水速度大于放水速度,或者注水速度突然變大時(shí)(突發(fā)),為了保證水池不溢出(數(shù)據(jù)不丟失),就需要水池(緩沖區(qū))來(lái)處理這種突發(fā)情況,并設(shè)置合理大小的水池空間(FIFO的深度)。

2c92f226-e3be-11ed-ab56-dac502259ad0.jpg

或者為了降低CPU負(fù)擔(dān),提高數(shù)據(jù)處理效率,可以在積累到一定的數(shù)據(jù)量之后,再一次性處理。

FPGA中,F(xiàn)IFO一般是使用RAM存儲(chǔ)器作為緩沖區(qū),可以分為同步FIFO或異步FIO,一般用于數(shù)據(jù)緩沖,或者不同時(shí)鐘域之間的數(shù)據(jù)傳遞。

單片機(jī)中,一般是基于一維數(shù)組和結(jié)構(gòu)體實(shí)現(xiàn)的循環(huán)隊(duì)列(Queue),或者叫環(huán)形隊(duì)列。

2ca0b5e6-e3be-11ed-ab56-dac502259ad0.jpg

FIFO的使用,既可以保證數(shù)據(jù)的完整性,還可以讓數(shù)據(jù)被及時(shí)的處理。

本文介紹,基于C語(yǔ)言的循環(huán)隊(duì)列緩沖區(qū)原理、設(shè)計(jì)與實(shí)現(xiàn)。

2. FIFO的存取順序

定義一個(gè)一維數(shù)組當(dāng)作存儲(chǔ)區(qū),數(shù)組長(zhǎng)度為6,再定義兩個(gè)讀寫(xiě)指針變量。

初始化時(shí),F(xiàn)IFO為空,讀寫(xiě)指針相等,并都置為0。

2cb4a10a-e3be-11ed-ab56-dac502259ad0.jpg

寫(xiě)入一個(gè)數(shù)據(jù)1之后,寫(xiě)指針遞增,讀指針不變:

2cbf7076-e3be-11ed-ab56-dac502259ad0.jpg

再寫(xiě)兩個(gè)數(shù)據(jù)2和3,寫(xiě)指針遞增,讀指針不變:

2cc4c2c4-e3be-11ed-ab56-dac502259ad0.jpg

寫(xiě)了三個(gè)數(shù)據(jù)之后,我們讀出一個(gè)數(shù)據(jù)1,寫(xiě)指針不變,讀指針遞增:

2ccb611a-e3be-11ed-ab56-dac502259ad0.jpg

讀出一個(gè)數(shù)據(jù)2,再寫(xiě)兩個(gè)數(shù)據(jù)4和5,讀寫(xiě)指針變化:

2cd2b9a6-e3be-11ed-ab56-dac502259ad0.jpg

再寫(xiě)一個(gè)數(shù)據(jù)6,此時(shí)超過(guò)數(shù)組長(zhǎng)度,但是數(shù)組頭部還有空間,所以寫(xiě)指針回到數(shù)組起始地址0:

2cd89a6a-e3be-11ed-ab56-dac502259ad0.jpg

再寫(xiě)一個(gè)數(shù)據(jù)7,此時(shí)判斷FIFO滿:

2cdd6a54-e3be-11ed-ab56-dac502259ad0.jpg

可能會(huì)有朋友疑惑,不是還有一個(gè)空位置可以存放數(shù)據(jù)嗎?

2ce19304-e3be-11ed-ab56-dac502259ad0.jpg

如果再存入一個(gè)數(shù)據(jù)之后,讀寫(xiě)指針相等,此時(shí)可以判斷是滿狀態(tài)嗎?

顯然是不能,因?yàn)楫?dāng)FIFO為空時(shí),也是讀寫(xiě)指針相等,所以這種情況就無(wú)法判斷滿和空。

這里就涉及到FIFO設(shè)計(jì)中,最重要的滿和空的判斷條件,需要遵循FIFO讀寫(xiě)的兩個(gè)規(guī)則:

FIFO為空時(shí),不能執(zhí)行讀操作

FIFO為滿時(shí),不能執(zhí)行寫(xiě)操作

為了避免這種情況發(fā)生,我們空出一個(gè)元素位置,寫(xiě)指針指向的位置永遠(yuǎn)為空,這樣就會(huì)有兩種滿的情況:

rd < wr

rd > wr

2ceb1a28-e3be-11ed-ab56-dac502259ad0.jpg

對(duì)于第一種情況,當(dāng)(wr + 1) % FIFO_SIZE == rd時(shí),可以認(rèn)為FIFO滿,F(xiàn)IFO_SIZE是指數(shù)組長(zhǎng)度;

對(duì)于第二種情況,當(dāng)wr + 1 == rd時(shí),可以認(rèn)為FIFO滿。

以上兩種情況可以合并為一種,即(wr + 1) % FIFO_SIZE == rd時(shí),判斷FIFO滿。

所以這種判斷方式,會(huì)犧牲一個(gè)存儲(chǔ)位置,實(shí)際可以存儲(chǔ)的元素個(gè)數(shù)為FIFO_SIZE-1。

同理,獲取當(dāng)前FIFO內(nèi)元素的個(gè)數(shù),也可以分為兩種情況:

當(dāng)wr > rd時(shí), count = wr - rd

2cf41074-e3be-11ed-ab56-dac502259ad0.jpg

當(dāng)wr < rd時(shí),count = wr + FIFO_SIZE - rd

2cf8e4b4-e3be-11ed-ab56-dac502259ad0.jpg

3. FIFO的代碼實(shí)現(xiàn)

根據(jù)以上FIFO存取邏輯,我們可以使用一維數(shù)組來(lái)構(gòu)造一個(gè)環(huán)形緩沖區(qū),讀寫(xiě)地址循環(huán)遞增,分別實(shí)現(xiàn)FIFO初始化、讀寫(xiě)操作、判斷空滿、獲取元素個(gè)數(shù)等函數(shù),并封裝成模塊。

xqueue.h

wKgZomRIfQaAVdsGAAFcEQkeVuE365.jpg

xqueue.c文件

wKgZomRIfTaABEjkAADzU1ybQp4533.jpg
wKgZomRIfUCAaydXAAEq1bzTgmQ594.jpg
wKgZomRIfWWAWLRcAAEdA4yGOjM469.jpg
wKgZomRIfW6AQum-AABMZf2AQeI026.jpg

實(shí)際應(yīng)用:

wKgaomRIfZSAe036AABpNjyQcK4769.jpg
wKgZomRIfZyAfXHvAADiBJnf2UM605.jpg

運(yùn)行結(jié)果:

2d01393e-e3be-11ed-ab56-dac502259ad0.jpg

循環(huán)隊(duì)列元素的數(shù)據(jù)類型,可以根據(jù)需要指定,也可以是結(jié)構(gòu)體類型。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5086

    文章

    19142

    瀏覽量

    306036
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7509

    瀏覽量

    163975
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1369

    瀏覽量

    114763
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137080
  • FIFO芯片
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    8832

原文標(biāo)題:分享一款基于C語(yǔ)言實(shí)現(xiàn)的FIFO模塊

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言實(shí)現(xiàn):見(jiàn)縫插針游戲!代碼思路+源碼分享

    見(jiàn)縫插圓我們昨天已經(jīng)用C語(yǔ)言實(shí)現(xiàn)了,今天將實(shí)現(xiàn)個(gè)見(jiàn)縫插針的游戲。
    發(fā)表于 12-05 11:02 ?750次閱讀

    如何用C語(yǔ)言實(shí)現(xiàn)一款猜數(shù)字游戲

    如何用C語(yǔ)言實(shí)現(xiàn)一款猜數(shù)字游戲
    發(fā)表于 01-06 07:10

    基于Proteus和C語(yǔ)言實(shí)現(xiàn)

    基于Proteus和C語(yǔ)言實(shí)現(xiàn)共四個(gè)題目,有沒(méi)有人愿意嘗試下?
    發(fā)表于 07-14 06:20

    如何使用C語(yǔ)言實(shí)現(xiàn)模糊PID控制?

    如何使用C語(yǔ)言實(shí)現(xiàn)模糊PID控制?
    發(fā)表于 09-24 08:54

    C語(yǔ)言實(shí)現(xiàn)FFT算法

    C語(yǔ)言實(shí)現(xiàn)FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct compx EE(struct compx
    發(fā)表于 10-30 13:39 ?6344次閱讀

    DSP算法的c語(yǔ)言實(shí)現(xiàn)

    DSP算法的c語(yǔ)言實(shí)現(xiàn),又需要的朋友下來(lái)看看。
    發(fā)表于 05-09 10:59 ?0次下載

    PID控制算法的C語(yǔ)言實(shí)現(xiàn)(完整版)

    PID控制算法的C語(yǔ)言實(shí)現(xiàn) PID算法原理
    發(fā)表于 11-05 15:45 ?0次下載

    C++語(yǔ)言實(shí)現(xiàn)火車(chē)排序功能

    C++語(yǔ)言實(shí)現(xiàn)火車(chē)排序功能
    發(fā)表于 01-05 11:27 ?2次下載

    c語(yǔ)言實(shí)現(xiàn)fifo算法及代碼

    C語(yǔ)言門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供
    發(fā)表于 12-15 17:08 ?1.8w次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b><b class='flag-5'>fifo</b>算法及代碼

    4個(gè)重要算法C語(yǔ)言實(shí)現(xiàn)源代碼

    4個(gè)重要算法C語(yǔ)言實(shí)現(xiàn)源代碼
    發(fā)表于 06-10 08:00 ?12次下載

    CRC校驗(yàn)算法原理及c語(yǔ)言實(shí)現(xiàn)

    CRC校驗(yàn)算法原理及c語(yǔ)言實(shí)現(xiàn)
    發(fā)表于 11-30 10:04 ?9次下載

    累加校驗(yàn)和C語(yǔ)言實(shí)現(xiàn)

    累加校驗(yàn)和C語(yǔ)言實(shí)現(xiàn)
    發(fā)表于 11-29 18:06 ?10次下載
    累加校驗(yàn)和<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b>

    怎么用C語(yǔ)言實(shí)現(xiàn)多態(tài)

    這里我想主要介紹下在C語(yǔ)言中是如何實(shí)現(xiàn)的面向?qū)ο蟆V懒?b class='flag-5'>C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮姆绞?,我們?cè)俾?lián)想下,C
    的頭像 發(fā)表于 10-12 09:12 ?2067次閱讀

    C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞.docx》資料免費(fèi)下載
    發(fā)表于 03-24 09:14 ?2次下載

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?1020次閱讀