项目简介
Fluffer是一个基于ANSI C99的持久FIFO缓冲区系统,其将数据存储在永久闪存而非RAM,有效解决了物联网设备在连接中断期间遥测数据丢失的问题。当设备在低功耗模式下唤醒,RAM内容会被擦除,而Fluffer可存储最后N条未发送的消息,且系统复位后数据依然保留。
项目的主要特性和功能
- 持久存储:数据存于微控制器闪存,系统复位数据不丢失。
- 多实例支持:同一内存可共存多个实例,各实例独立配置且互不重叠。
- 支持多类型闪存:支持片上闪存和片外(外部)闪存。
- 标准API:提供简洁清晰API,支持初始化、入队、出队、判断空和满等基本FIFO缓冲区功能。
- 智能内存管理:循环使用多块写入、标记删除条目、缓冲区满时迁移数据,有效管理闪存内存,减少块擦除次数。
安装使用步骤
前提条件
假设用户已下载本项目源码文件,且具备ANSI C99的编译环境。
配置
在fluffer_config.h
文件中,配置以下#define
:
- FLUFFER_MAX_MEMORY_WORD_SIZE
:所有Fluffer实例的最大内存字长(字节)。
- FLUFFER_MAX_ELEMENT_SIZE
:所有Fluffer实例的最大元素大小(字节)。
- FLUFFER_CLEAN_BYTE_CONTENT
:擦除后字节的内容,需设置为0xFF
。
示例代码使用
```C
include
include
// 定义内存读写和擦除操作的句柄函数 Fluffer_Handle_Error_t FlfrReadHandle(uint32_t u32Offset, uint8_t * pu8Buffer, uint16_t u16Len) { // 从地址u32Offset开始读取数据到pu8Buffer,读取u16Len字节 }
Fluffer_Handle_Error_t FlfrWriteHandle(uint32_t u32Offset, uint8_t * pu8Data, uint16_t u16Len) { // 从pu8Data缓冲区写入数据到地址u32Offset,写入u16Len字节 }
Fluffer_Handle_Error_t FlfrEraseHandle(uint8_t u8PageIndex) { // 擦除指定索引u8PageIndex的内存页 }
int main(void) { // 初始化Fluffer实例和相关变量 Fluffer_t Local_sFluffer; Fluffer_Reader_t Local_sReader; uint8_t Local_au8TempBuffer[100];
// 初始化Fluffer内存配置
Local_sFluffer.cfg.page_size = MEMORY_PAGE_SIZE;
Local_sFluffer.cfg.blocks = 2;
Local_sFluffer.cfg.pages_pre_block = 1;
Local_sFluffer.cfg.start_page = 0;
Local_sFluffer.cfg.word_size = 1;
Local_sFluffer.cfg.element_size = 20;
// 设置内存操作句柄
Local_sFluffer.handles.read_handle = FlfrReadHandle;
Local_sFluffer.handles.write_handle = FlfrWriteHandle;
Local_sFluffer.handles.erase_handle = FlfrEraseHandle;
// 初始化Fluffer实例
Fluffer_enInitialize(&Local_sFluffer);
// 初始化读取器实例
Fluffer_enInitReader(&Local_sFluffer, &Local_sReader);
// 读取条目
if(Fluffer_enReadEntry(&Local_sFluffer, &Local_sReader, Local_au8TempBuffer) == FLUFFER_ERROR_EMPTY)
{
// 处理空缓冲区情况
}
else
{
// 标记条目为待移除
Fluffer_enMarkEntry(&Local_sFluffer);
}
// 写入新条目
Fluffer_enWriteEntry(&Local_sFluffer, Local_au8TempBuffer);
while(1)
{
// 主循环
}
return 0;
} ```
编译运行
将上述代码保存为.c
文件,使用支持ANSI C99的编译器进行编译,然后将生成的可执行文件烧录到目标设备上运行。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】