C语言实现一个简易的环形FIFO
设计一个环形FIFO缓冲区,用于存储原始数据。环形FIFO缓冲区最大有10个节点,每个节点有200个原始数据,即200个unsigned int类型的数据。其中,包括写FIFO函数,读FIFO函数,删除某节点函数,删除整个FIFO函数等。
#define FIFO_NODE_NUM 10
#define FIFO_NODE_DATA_NUM 200
#define FIFO_DATA_TYPE unsigned int
typedef struct
{
FIFO_DATA_TYPE data[FIFO_NODE_DATA_NUM];
}FIFO_NODE;
typedef struct
{
FIFO_NODE fifo_node[FIFO_NODE_NUM];
unsigned int write_index;
unsigned int read_index;
}FIFO;
FIFO raw_data_fifo;
/**
* @brief 初始化FIFO
*/
void raw_data_fifo_init(void)
{
raw_data_fifo.write_index = 0;
raw_data_fifo.read_index = 0;
}
/**
* @brief 向FIFO中写入原始数据
* @param data 指向FIFO_DATA_TYPE类型的指针,用于存储要写入的数据
* @param data_num 要写入的数据数量
*/
void raw_data_fifo_write(FIFO_DATA_TYPE *data, unsigned int data_num)
{
unsigned int i;
for(i = 0; i < data_num; i++)
{
raw_data_fifo.fifo_node[raw_data_fifo.write_index].data[i] = data[i];
}
raw_data_fifo.write_index++;
if(raw_data_fifo.write_index >= FIFO_NODE_NUM)
{
raw_data_fifo.write_index = 0;
}
}
/**
* @brief 从FIFO中读取原始数据
* @param data 指向FIFO_DATA_TYPE类型的指针,用于存储读取的数据
* @param data_num 要读取的数据数量
*/
void raw_data_fifo_read(FIFO_DATA_TYPE *data, unsigned int data_num)
{
unsigned int i;
for(i = 0; i < data_num; i++)
{
data[i] = raw_data_fifo.fifo_node[raw_data_fifo.read_index].data[i];
}
raw_data_fifo.read_index++;
if(raw_data_fifo.read_index >= FIFO_NODE_NUM)
{
raw_data_fifo.read_index = 0;
}
}
/**
* @brief 删除FIFO中的某个节点
* @param node_index 要删除的节点的索引
*/
void raw_data_fifo_delete_node(unsigned int node_index)
{
unsigned int i;
for(i = 0; i < FIFO_NODE_DATA_NUM; i++)
{
raw_data_fifo.fifo_node[node_index].data[i] = 0;
}
}
/**
* @brief 删除FIFO中的所有节点
*/
void raw_data_fifo_delete_all(void)
{
unsigned int i;
for(i = 0; i < FIFO_NODE_NUM; i++)
{
raw_data_fifo_delete_node(i);
}
}
/**
* @brief 测试FIFO
*/
void raw_data_fac_test(void)
{
unsigned int i;
unsigned int data[FIFO_NODE_DATA_NUM];
unsigned int data_num = 200;
raw_data_fifo_init();
for(i = 0; i < 10; i++)
{
data[0] = i;
raw_data_fifo_write(data, data_num);
}
raw_data_fifo_read(data, data_num);
raw_data_fifo_delete_node(0);
raw_data_fifo_delete_all();
}