最近笔者在做项目时需要C语言来实现一个FIFO,开始参考了以下这两位大神的代码。
大神一:
大神二:
结合两位大神所写代码的优缺点,本人在大神一的基础上增加了is_empty成员变量,实现了环形FIFO。先写后读,写满不能再写,读空不能再读。
fifo.c文件代码如下:
#include "fifo.h"
#include "xil_types.h"
/**
* @brief fifo结构
*/
typedef struct
{
int ptr_write;
int ptr_read;
bool is_full;
bool is_empty;
// fifo中存储的元素数,不是字节大小
int item_sum;
// 元素大小.单位: 字节
int item_size;
void *fifo_ptr;
} Fifo;
int FifoAddr;
/**
* @brief 创建fifo
* @param item_sum:fifo中元素数.注意不是字节数
* @param item_size: 元素大小.单位: 字节
* @return fifo索引
*/
int fifo_create(int item_sum, int item_size)
{
Fifo *fifo = (Fifo *)malloc(sizeof(Fifo));
fifo->item_sum = item_sum;
fifo->item_size = item_size;
fifo->ptr_write = 0;
fifo->ptr_read = 0;
fifo->is_full = false;
fifo->is_empty = true;
fifo->fifo_ptr = (void *)malloc(item_sum * item_size);
if(NULL == fifo->fifo_ptr)
{
xil_printf("malloc failed");
}
return (int)fifo;
}
void fifo_init(int fifo_index)
{
Fifo *fifo = (Fifo *)fifo_index;
fifo->ptr_write = 0;
fifo->ptr_read = 0;
fifo->is_full = false;
fifo->is_empty = true;
}
/**
* @brief 删除fifo
* @param fifo_index: fifo索