linux c语言fifo例程,3.6 使用C实现一个简单的FIFO

本文介绍了在Zynq系列FPGA或其他嵌入式设备开发中,如何利用串口调试并实现软件FIFO来优化大量数据传输。通过创建一个简单的C语言FIFO结构体,并提供初始化、入队和出队操作,解决了在中断中传输大量数据可能影响系统稳定性的问题。在示例代码中展示了如何使用这个FIFO结构进行数据入队和出队,以及在主循环中检查并发送数据到上位机进行分析。
摘要由CSDN通过智能技术生成

># 说明

使用zynq系列的FPGA或者使用其他的一些嵌入式的器件进行开发,我们会经常使用串口来调试,如果开发裸机的代码,那么很多事会在中断中去做,如果我们想查看某些数据,少量的可以在中断中直接传输,但是会存在一部分数据很多,传输会影响到系统的稳定性,为此我门可以做一个软件的FIFO,产生数据后直接压入FIFO,然后在主循环中查询FIFO,存在数据则可以以数据头和数据为保住数据发送到上位机进行分析。

> # C语言实现简单的FIFO

直接参考如下代码:

```c

#include

typedef float Dtype; //自定义qmini的数据类型

typedef struct _queue_{

char empty;

char full;

Dtype *buf;

unsigned int rptr; //读指针

unsigned int wptr; //写指针

int depth; //fifo深度

int len; //现存的数据量

} QMINI;

/********************************************

* Qinit

* 初始化 mini 队列

* 参数1:QMINI对象

* 参数2:数据缓存buf

* 参数3:mini 队列大小(fifo深度)

* 返回值:操作成功返回 0 ,否则返回 正数

********************************************/

int Qinit(QMINI *q,Dtype *buf, int bufSize){

if(buf == 0 || bufSize <= 0) return 1;

q->buf = buf;

q->empty = 1;

q->full = 0 ;

q->rptr = 0;

q->wptr = 0;

q->depth = bufSize;

q->len = 0;

return 0;

}

/********************************************

* Qpush

* 数据入队操作

* 参数1:QMINI对象

* 参数2:入队数据

* 返回值:操作成功返回 0 ,否则返回 正数

********************************************/

int Qpush(QMINI *q,Dtype data){

if(q == 0 && q->buf == 0) return 1;//未创建 mini 队列

q->buf[q->wptr] = data ;

q->wptr ++ ;

if( q->wptr == q->depth ) q->wptr = 0;

q->full = ( ++ q->len >= q->depth) ? 1 : 0;

q->empty = 0;

return 0;

}

/********************************************

* Qpop

* 数据出队操作

* 参数1:QMINI对象

* 返回值:出队的数据

********************************************/

Dtype Qpop(QMINI *q){

if( -- q->len <= 0) { q->empty = 1; }

q->full = 0;

Dtype rt = q->buf[q->rptr];

q->rptr = (q->rptr >= q->depth ) ? 0 : q->rptr + 1;

return rt;

}

//---------------------------

Dtype a[10] ;

QMINI mq;

int main(){

int i ;

if( Qinit(&mq,a,10) ){

printf("初始化失败\r\n");

}

for(i=0;i<=mq.depth;i++){

if( !mq.full ) Qpush(&mq,i*3.3);

else printf("%d:队列已满\r\n",i);

}

printf("-----------------------\r\n");

for(i=0;i<=mq.depth;i++){

if( !mq.empty ) {

Dtype data = Qpop(&mq);

printf("%d:获得数据为%f\r\n",i,data);

}

else printf("%d:队列为空\r\n",i);

}

return 0;

}

```

运行结果

```

++++++++++++ 测 试 +++++++++++++++

10:队列已满

-----------------------

0:获得数据为0.000000

1:获得数据为3.300000

2:获得数据为6.600000

3:获得数据为9.900000

4:获得数据为13.200000

5:获得数据为16.500000

6:获得数据为19.799999

7:获得数据为23.100000

8:获得数据为26.400000

9:获得数据为29.700001

10:队列为空

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值