当前位置: 首页 > article >正文

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();
}


http://www.kler.cn/a/234918.html

相关文章:

  • 华为大咖说 | 浅谈智能运维技术
  • F5全新报告揭示AI时代API安全面临严峻挑战
  • Android Profiler 内存分析
  • 行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设
  • 分布式----Ceph部署
  • vite构建的react程序放置图片
  • 跟着GPT学设计模式之原型模式
  • Java图形化界面编程——弹球游戏 笔记
  • jvm体系结构
  • 电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列)
  • Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)
  • 登录报下面错误The remembered identity will be forgotten and not used for this request
  • 2024.02.11作业
  • FPGA_简单工程_VGA显示驱动器
  • 机器学习系列——(十三)多项式回归
  • openssl3.2 - exp - RAND_bytes_ex
  • 【Linux】信号保存与信号捕捉处理
  • ubuntu20安装mongodb
  • opencv C++ dnn模块调用yolov5以及Intel RealSense D435深度相机联合使用进行目标检测
  • [office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法
  • 牛客——递归实现组合型枚举(枚举,dfs)
  • 浅谈人工智能之深度学习~
  • CPP项目:Boost搜索引擎
  • 【并发编程】原子累加器
  • 企业飞书应用机器人,使用python发送图文信息到群
  • SpringCloud-Eureka服务注册中心测试实践