C语言实现FIFO环形存储器

Farrah ·
更新时间:2024-11-13
· 612 次阅读

前言

在CSDN社区看了很多FIFO的C语言实现,发现大多写的很复杂,看不懂。FIFO机制在嵌入式开发中串口数据收发处理相当方便,因此决定分享一下C语言的实现方法。代码很简单,就两个函数:fifo_put和fifo_get,可以结合串口直接进行调用,在项目中使用过。

FIFO环形存储器读写说明

为了解释方便,定义几个变量fifo.in:写入地址指针,fifo.out:读取地址指针,fifo.count已经存储数量,fifo.size:存储器总容量,fifo.buffer:存储器存储内容空间。以下以10个字节大小的空间说明对环形存储器的读写机制。
1.初始化时存储器状态如下:
1
2.写入5个字节数据后存储器状态如下:
2
3.再读取4个字节数据后状态如下:
3
4.再写入9个字节数据后状态如下:
4
以上图示描述是针对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


作者:李启爸爸



存储器 存储 fifo C语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号