💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
># 说明 使用zynq系列的FPGA或者使用其他的一些嵌入式的器件进行开发,我们会经常使用串口来调试,如果开发裸机的代码,那么很多事会在中断中去做,如果我们想查看某些数据,少量的可以在中断中直接传输,但是会存在一部分数据很多,传输会影响到系统的稳定性,为此我门可以做一个软件的FIFO,产生数据后直接压入FIFO,然后在主循环中查询FIFO,存在数据则可以以数据头和数据为保住数据发送到上位机进行分析。 > # C语言实现简单的FIFO 直接参考如下代码: ```c #include <stdio.h> 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:队列为空 ```