mirror of
https://github.com/RoCry/blozi-etag.git
synced 2025-12-06 09:02:49 +08:00
tinyFlash
一种轻量级的flash数据存储方案
设计原理
本方案采用两个扇区轮流使用的方法存储数据,每个扇区4096字节,扇区状态如下表:
| 扇区编号 | 使用状态 | 数据分布 |
|---|---|---|
| 扇区一 | 使用中 | 0xAA ······················································· |
| 扇区二 | 未使用 | 0xFF ······················································· |
使用中的扇区数据分布如下表:
| 扇区头部 | K1 | V1 | K2 | V2 | ..... | Kn | Vn |
|---|---|---|---|---|---|---|---|
| 32字节 | 3字节 | n字节 | 3字节 | n字节 | ..... | 3字节 | n字节 |
每个K-V数据存储形式如下表:
| 第一字节 | 第二字节 | 第三字节 | n个字节 |
|---|---|---|---|
| Key | ~Key | Len | Len个字节数据内容 |
第一个字节存放的是数据的Key,取值范围是 0x01 - 0xFE
第二个字节的数据为Key取反,如果第二个字节的数据为0x00,表示该处存储的数据已被废弃
第三个自己表示数据长度,取值范围是0x01 - 0xFF
之后的字节是数据的内容,最长不得超过0xFF
API介绍
bool tinyFlash_Init(unsigned long start_addr, unsigned long len);
函数功能:初始化tinyFlash
参数 start_addr:tinyFlash区域在Flash芯片上的起始地址
参数 len: tinyFlash区域总长度,单位字节
int tinyFlash_Read(unsigned char KEY, unsigned char * buf, unsigned char * len);
函数功能:从tinyFlash中读取Key中存储的数据内容,数据长度,或者删除数据
参数 KEY:要读取的Key
参数 buf:Key中存储的数据内容的传出指针,如果该指针为NULL,则只传输数据长度
参数 len: 传入的是最大能接受的数据长度,传输的是读取到的实际数据长度,如果为NULL则为删除该KEY
int tinyFlash_Write(unsigned char KEY, unsigned char * buf, unsigned char len);
函数功能: 向tinyFlash中存储一个数据
参数 KEY: 要存储的数据的Key值
参数 buf: 要存储的数据内容
参数 len: 要存储的数据长度
void tinyFlash_Format(void);
函数功能:格式化tinyFlash数据区域,擦除全部tinyFlash扇区
接下来的工作
- 多扇区支持
- 数据加密
- 优化查找及存储速度
- 意外掉电防护