># 说明
使用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:队列为空
```