logo资料库

C语言实现FIFO环形存储器.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
C语言实现 语言实现FIFO环形存储器 环形存储器 前言前言 在CSDN社区看了很多FIFO的C语言实现,发现大多写的很复杂,看不懂。FIFO机制在嵌入式开发中串口数据收发处理相当 方便,因此决定分享一下C语言的实现方法。代码很简单,就两个函数:fifo_put和fifo_get,可以结合串口直接进行调用,在项目 中使用过。 FIFO环形存储器读写说明 环形存储器读写说明 为了解释方便,定义几个变量fifo.in:写入地址指针,fifo.out:读取地址指针,fifo.count已经存储数量,fifo.size:存储器总容 量,fifo.buffer:存储器存储内容空间。以下以10个字节大小的空间说明对环形存储器的读写机制。 1.初始化时存储器状态如下: 2.写入5个字节数据后存储器状态如下:
3.再读取4个字节数据后状态如下: 4.再写入9个字节数据后状态如下:
以上图示描述是针对FIFO读取速度快于或者等于写入速度的情况,如果读取速度慢于写入速度,则数据有覆盖的危险。以下 的代码实现不考虑写入速度大于读取速度的情况。 代码实现 代码实现 只需要两个函数fifo_put、fifo_get,直接调用两个函数即可实现FIFO环形存储器读写。 /** Description: 向缓冲区写入若干字节数据 Parameter: fifo 环形缓冲区指针 buffer 待写入数据缓冲区指针 len 待写入数据长度 Return: 写入了多少字节 */ uint16_t fifo_put(cfifo *fifo, uint8_t *buffer, uint16_t len) { uint16_t m,n; define_critical(); enter_critical(); m = fifo->in; n = fifo->count; exit_critical();// len = min(len, fifo->size - n);//how much to put n = min(len, fifo->size - m);//first put num memcpy(fifo->buffer + m, buffer, n);//自己编写拷贝函数 if(len > n) { m = len – n;//last put num memcpy(fifo->buffer, buffer + n, m); } else { m += n; } enter_critical(); fifo->in = m; fifo->count += len; exit_critical(); return len; } /** Description: 从缓冲区读取若干字节数据 Parameter: fifo 环形缓冲区指针 buffer 待读取存放数据缓冲区指针 len 读取数据长度 Return: 读取了多少字节 */
uint16_t fifo_get(cfifo *fifo, uint8_t *buffer, uint16_t len) { uint16_t m,n; define_critical(); enter_critical(); m = fifo->out; n = fifo->count; exit_critical(); len = min(len, n);//how much to get n = min(len, fifo->size - m);//first get num memcpy(buffer, fifo->buffer + m, n);//自己编写拷贝函数 if(len > n) { m = len - n;//last get num memcpy(buffer + n, fifo->buffer, m);//自己编写拷贝函数 } else { m += n; } enter_critical(); fifo->out = m; fifo->count -= len; exit_critical(); return len; } https://download.csdn.net/download/weixin_47057981/12331906 作者:李启爸爸
分享到:
收藏