# dffifo **Repository Path**: badlyby/dffifo ## Basic Information - **Project Name**: dffifo - **Description**: 双因子FIFO 普通FIFO单个数据单元是固定大小不够灵活,双因子FIFO可以存储不同大小的数据单元。 可以在无系统的情况下实现消息队列的功能,相比消息队列还增加了预加载功能。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2022-10-24 - **Last Updated**: 2024-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dffifo #### 介绍 双因子FIFO,主要用于数据异步存取,跨线程数据交换,解决处理接收数据时阻塞接收线程,无法接收后续数据的问题,时间敏感型通信协议的解耦。 普通FIFO单个数据单元是固定大小不够灵活,双因子FIFO可以存储不同大小的数据单元。 可以在无系统的情况下实现消息队列的功能,相比消息队列还增加了预加载功能。 预加载功能适用于单一数据来源没有交错的情况,例如单一串口接收到的数据,如不使用预加载功能可以注释掉#define DFFIFO_PRELOAD。 #### 软件架构 双因子FIFO实际由两个FIFO组成,一个用于存储数据,另一个存储数据长度。 #### 使用说明 1. 定义运行所需的结构体和两个缓存区 2. 初始化 DFFIFO_Init(结构体指针,缓存区A指针(用于存放数据长度),缓存区A的大小,缓存区B指针(用于存放数据),缓存区B的大小) 3. 写入数据,调用DFFIFO_PreByte(结构体指针,一个字节数据)或DFFIFO_PreLoad(结构体指针,多个字节数据指针,数据长度) 4. 数据单元写入结束,调用DFFIFO_Complete(结构体指针) 5. 取出数据, 调用DFFIFO_Pop(结构体指针,缓存区指针(用于存放取出的数据),缓存区大小)返回取出数据长度 #### 使用场景举例 在单片机环境编写MODBUS RTU时 1. 串口接收到一个字节调用DFFIFO_PreByte存入一个字节 2. 定时器定时连续3.5个字节周期串口未收到数据时调用DFFIFO_Complete 3. 在主循环体里调用DFFIFO_Pop取出数据用于解析 #### 例程 1. 使用双因子FIFO实现Modbus RTU写单个线圈的例程 2. 硬件平台CH32V307-EVT-R1,沁恒RISC-V单片机评估板:赤兔 3. 连接PA0 <-> LED1 ,PA1 <-> LED2 4. 使用方法:打开官方例程USART_Printf,把例程文件和dffifo.c,dffifo.h复制到例程User文件夹下,替换main.c