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

循环队列元素的数据类型,可以根据需要指定,也可以是结构体类型。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303074
  • 存储器
    +关注

    关注

    38

    文章

    7448

    浏览量

    163587
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1367

    浏览量

    114518
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136128
  • FIFO芯片
    +关注

    关注

    0

    文章

    10

    浏览量

    8801

原文标题:分享一款基于C语言实现的FIFO模块

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言实现:见缝插针游戏!代码思路+源码分享

    见缝插圆我们昨天已经用C语言实现了,今天将实现个见缝插针的游戏。
    发表于 12-05 11:02 702次阅读

    如何用C语言实现一款猜数字游戏

    如何用C语言实现一款猜数字游戏
    发表于 01-06 07:10

    基于Proteus和C语言实现

    基于Proteus和C语言实现共四个题目,有没有人愿意尝试下?
    发表于 07-14 06:20

    C语言实现FFT算法

    C语言实现FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct compx EE(struct compx
    发表于 10-30 13:39 6328次阅读

    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次下载

    使用C语言实现静态网页的代码免费下载

    本文档的主要内容详细介绍的是使用C语言实现静态网页的代码免费下载。
    发表于 11-22 16:20 2次下载

    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 2010次阅读

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 858次阅读