色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分享一款基于C語言實現的FIFO模塊:xqueue.

strongerHuang ? 來源:電子電路開發學習 ? 2023-04-26 09:21 ? 次閱讀

FIFO在嵌入式應用的非常廣泛,可以說有數據收發的地方,基本就有FIFO的存在,今天給大家分享一款基于C語言實現的FIFO模塊:xqueue.

1. 為什么需要FIFO

FIFO 是First-In First-Out的縮寫,它是一個具有先入先出特點的緩沖區。

可以理解成一個大的水池,水對應數據,注水速度對應數據輸入的頻率,放水速度對應數據處理的速度,當注水速度和放水速度相同時,我們不需要使用水池來緩沖,但是當注水速度大于放水速度,或者注水速度突然變大時(突發),為了保證水池不溢出(數據不丟失),就需要水池(緩沖區)來處理這種突發情況,并設置合理大小的水池空間(FIFO的深度)。

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

或者為了降低CPU負擔,提高數據處理效率,可以在積累到一定的數據量之后,再一次性處理。

FPGA中,FIFO一般是使用RAM存儲器作為緩沖區,可以分為同步FIFO或異步FIO,一般用于數據緩沖,或者不同時鐘域之間的數據傳遞。

單片機中,一般是基于一維數組和結構體實現的循環隊列(Queue),或者叫環形隊列。

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

FIFO的使用,既可以保證數據的完整性,還可以讓數據被及時的處理。

本文介紹,基于C語言的循環隊列緩沖區原理、設計與實現

2. FIFO的存取順序

定義一個一維數組當作存儲區,數組長度為6,再定義兩個讀寫指針變量。

初始化時,FIFO為空,讀寫指針相等,并都置為0。

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

寫入一個數據1之后,寫指針遞增,讀指針不變:

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

再寫兩個數據2和3,寫指針遞增,讀指針不變:

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

寫了三個數據之后,我們讀出一個數據1,寫指針不變,讀指針遞增:

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

讀出一個數據2,再寫兩個數據4和5,讀寫指針變化:

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

再寫一個數據6,此時超過數組長度,但是數組頭部還有空間,所以寫指針回到數組起始地址0:

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

再寫一個數據7,此時判斷FIFO滿:

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

可能會有朋友疑惑,不是還有一個空位置可以存放數據嗎?

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

如果再存入一個數據之后,讀寫指針相等,此時可以判斷是滿狀態嗎?

顯然是不能,因為當FIFO為空時,也是讀寫指針相等,所以這種情況就無法判斷滿和空。

這里就涉及到FIFO設計中,最重要的滿和空的判斷條件,需要遵循FIFO讀寫的兩個規則:

FIFO為空時,不能執行讀操作

FIFO為滿時,不能執行寫操作

為了避免這種情況發生,我們空出一個元素位置,寫指針指向的位置永遠為空,這樣就會有兩種滿的情況:

rd < wr

rd > wr

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

對于第一種情況,當(wr + 1) % FIFO_SIZE == rd時,可以認為FIFO滿,FIFO_SIZE是指數組長度;

對于第二種情況,當wr + 1 == rd時,可以認為FIFO滿。

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

所以這種判斷方式,會犧牲一個存儲位置,實際可以存儲的元素個數為FIFO_SIZE-1。

同理,獲取當前FIFO內元素的個數,也可以分為兩種情況:

當wr > rd時, count = wr - rd

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

當wr < rd時,count = wr + FIFO_SIZE - rd

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

3. FIFO的代碼實現

根據以上FIFO存取邏輯,我們可以使用一維數組來構造一個環形緩沖區,讀寫地址循環遞增,分別實現FIFO初始化、讀寫操作、判斷空滿、獲取元素個數等函數,并封裝成模塊。

xqueue.h

wKgZomRIfQaAVdsGAAFcEQkeVuE365.jpg

xqueue.c文件

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

實際應用:

wKgaomRIfZSAe036AABpNjyQcK4769.jpg
wKgZomRIfZyAfXHvAADiBJnf2UM605.jpg

運行結果:

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

循環隊列元素的數據類型,可以根據需要指定,也可以是結構體類型。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304815
  • 存儲器
    +關注

    關注

    38

    文章

    7484

    瀏覽量

    163763
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114641
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • FIFO芯片
    +關注

    關注

    0

    文章

    10

    瀏覽量

    8803

原文標題:分享一款基于C語言實現的FIFO模塊

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言實現:見縫插針游戲!代碼思路+源碼分享

    見縫插圓我們昨天已經用C語言實現了,今天將實現個見縫插針的游戲。
    發表于 12-05 11:02 ?729次閱讀

    如何用C語言實現一款猜數字游戲

    如何用C語言實現一款猜數字游戲
    發表于 01-06 07:10

    基于Proteus和C語言實現

    基于Proteus和C語言實現共四個題目,有沒有人愿意嘗試下?
    發表于 07-14 06:20

    如何使用C語言實現模糊PID控制?

    如何使用C語言實現模糊PID控制?
    發表于 09-24 08:54

    C語言實現FFT算法

    C語言實現FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct compx EE(struct compx
    發表于 10-30 13:39 ?6341次閱讀

    DSP算法的c語言實現

    DSP算法的c語言實現,又需要的朋友下來看看。
    發表于 05-09 10:59 ?0次下載

    PID控制算法的C語言實現(完整版)

    PID控制算法的C語言實現 PID算法原理
    發表于 11-05 15:45 ?0次下載

    C++語言實現火車排序功能

    C++語言實現火車排序功能
    發表于 01-05 11:27 ?2次下載

    c語言實現fifo算法及代碼

    C語言門通用計算機編程語言,應用廣泛。C語言的設計目標是提供
    發表于 12-15 17:08 ?1.8w次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言實現</b><b class='flag-5'>fifo</b>算法及代碼

    4個重要算法C語言實現源代碼

    4個重要算法C語言實現源代碼
    發表于 06-10 08:00 ?12次下載

    CRC校驗算法原理及c語言實現

    CRC校驗算法原理及c語言實現
    發表于 11-30 10:04 ?9次下載

    累加校驗和C語言實現

    累加校驗和C語言實現
    發表于 11-29 18:06 ?10次下載
    累加校驗和<b class='flag-5'>C</b><b class='flag-5'>語言實現</b>

    怎么用C語言實現多態

    這里我想主要介紹下在C語言中是如何實現的面向對象。知道了C語言實現面向對象的方式,我們再聯想下,C
    的頭像 發表于 10-12 09:12 ?2044次閱讀

    C語言實現Web參數傳遞

    電子發燒友網站提供《C語言實現Web參數傳遞.docx》資料免費下載
    發表于 03-24 09:14 ?2次下載

    使用C語言實現的CRC計算單元的例子

    使用C語言實現的CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?960次閱讀
    主站蜘蛛池模板: 在线电影一区二区| 久久re这里视频精品8| 亚洲午夜精品A片久久软件| 女性BBWBBWBBWBBW| 久草色在线| 国产精品人妻无码77777| 99精品国产免费观看视频| 亚洲精品久久AV无码蜜桃| 全彩acg无翼乌火影忍者| 麻豆国产99在线中文| 精品国产在线观看福利| 国产ts调教| 成人无码国产AV免费看直播| 中字幕视频在线永久在线| 亚洲精品福利在线| 午夜性爽视频男人的天堂在线 | 女王羞辱丨vk| 蜜桃狠狠色伊人亚洲综合网站| 黄色片网站下载| 和美女啪啪啪动态图| 国产一卡 二卡三卡四卡无卡乱码视频| av天堂电影网| jk白丝袜美女被男人桶| 本庄优花aⅴ全部在线影片| 97视频在线观看视频最新| 2020国产成人免费视频| 最新中文字幕在线视频| 2020最新国产自产精品| 9420高清免费观看在线大全| 97伦理97伦理2018最新| 北原夏美 快播| 国产白丝精品爽爽久久蜜臀| 国产精品18久久久久网站| 国产又黄又粗又爽又色的视频软件| 国产特级毛片AAAAAAA高清 | 老阿姨才是最有味的一区二区| 久久九九免费| 欧美最猛性XXXXX肛交| 天上人间影院久久国产| 亚洲午夜电影| 99久久蜜臀亚洲AV无码精品|