[资源分享] 【杰发科技AC7802x测评】6 DFlash存储测试(TinyFlashDB)

[复制链接]
2064|0
 楼主| 6552918 发表于 2023-7-4 22:52 | 显示全部楼层 |阅读模式
本帖最后由 6552918 于 2023-7-4 22:52 编辑

#申请原创# #技术资源#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
TFDB
Tiny Flash Database for MCU.
TinyFlashDB设计前言
在单片机日常开发中,总会需要存储一些信息,这时就需要使用单片机FLASH存储的方案,目前单片机存储的方案有很多,比如:EASYFLASH、FLASHDB、OSAL_NV等等方案,他们程序都非常大,在存储不多的变量时不值得。而且很少有考虑到flash写入出错的情况。在实际产品中,嵌入式产品flash写入可能会受各种因素影响(电池供电、意外断电、气温等)从而并不是很稳定,一旦出现错误,会导致产品一系列问题。
TinyFlashDB设计理念
不同于其他很多的KV型数据库,TinyFlashDB每一个需要存储的变量都会分配一个单独的单片机flash扇区,变量长度不可变。所以TinyFlashDB仅适用于存储几个关键性变量(例如:IAP跳转标志、系统断电时间等等),不适合大规模数据存储(大规模数据存储可使用EASYFLASH等)。TinyFlashDB在设计时就考虑了写入错误的影响,追求力所能及的安全保障、资源占用方面尽可能的缩小(不到1kb代码占用)、尽可能的通用性(可以移植到51等8位机,无法逆序写入的stm32L4系列,某些flash加密的单片机和其他普通32位机上)。
TinyFlashDB API介绍
53a0dad0dc3b7cadca4102c396269b72
结构体功能:在TinyFlashDB中,API的操作都需要指定的参数index,该index结构体中存储了flash的地址,flash的大小,存储的变量的长度,结束标志位。在读取flash扇区时会去校验此信息。
1197c015d97278f52f49001f8fb9a881
函数功能:从index指向的扇区中获取一个index中指定变量长度的变量,flash头部数据校验出错不会重新初始化flash。
参数 index:tfdb操作的index指针。
参数 rwbuffer:写入和读取的缓存,所有flash的操作最后都会将整理后的数据拷贝到该buffer中,再调用tfdbport_write或者tfdbportread进行写入。当芯片对于写入的数据区缓存有特殊要求(例如4字节对齐,256字节对齐等),可以通过该参数将符合要求的变量指针传递给函数使用。至少为4字节长度。
参数 addrcache:可以是NULL,或者是地址缓存变量的指针,当addrcache不为NULL,并且也不为0时,则认为addrcache已经初始化成功,不再校验flash头部,直接从该addrcache的地址读取数据。
参数 value_to:要存储数据内容的地址。
返回值:TFDBNOERR成功,其他失败。
e57ce916bd2bb588393ec0f75efc0829
函数功能:在index指向的扇区中写入一个index中指定变量长度的变量,flash头部数据校验出错重新初始化flash。
参数 index:tfdb操作的index指针。
参数 rwbuffer:写入和读取的缓存,所有flash的操作最后都会将整理后的数据拷贝到该buffer中,再调用tfdbport_write或者tfdbportread进行写入。当芯片对于写入的数据区缓存有特殊要求(例如4字节对齐,256字节对齐等),可以通过该参数将符合要求的变量指针传递给函数使用。至少为4字节长度。
参数 addrcache:可以是NULL,或者是地址缓存变量的指针,当addrcache不为NULL,并且也不为0时,则认为addrcache已经初始化成功,不再校验flash头部,直接从该addrcache的地址读取数据。
参数 value_from:要存储的数据内容。
返回值:TFDBNOERR成功,其他失败。
TinyFlashDB设计原理
观察上方代码,可以发现TinyFlashDB的操作都需要tfdbindext定义的index参数。Flash初始化后头部信息为4字节,所以只支持1、2、4、8字节操作的flash:头部初始化时会读取头部,所以函数中rw_buffer指向的数据第一要求至少为4字节,如果最小写入单位是8字节,则为第一要求最少为8字节。
b2a8e3fcef193f6e249a80ba37647670
数据存储时,会根据flash支持的字节操作进行对齐,所以函数中rwbuffer指向的数据第二要求至少为下面函数中计算得出的alignedvalue_size个字节:
b669dd490681e8c080937b213be7d31d eb276c2245d967b8ae4450e4b83ece1c 每次写入后都会再读取出来进行校验,如果校验不通过,就会继续在下一个地址继续尝试写入。直到达到最大写入次数(TFDBWRITEMAX_RETRY)或者头部校验错误。
读取数据时也会计算和校验,不通过的话继续读取,直到返回校验通过的最新数据,或者读取失败。
TinyFlashDB移植和配置
添加源码到工程
9f20a368eedb03f416a6158d40c5642f
添加头文件路径
1407bc76c7683dbe4966f6117c4acfab
移植使用只需要在tfdb_port.c中,编写完成三个接口函数,也要在tfdb_port.h中添加相应的头文件和根据不同芯片修改宏定义
3960ff91219c4128e779c49362b91d63
6c7c487bcf8ccb7706a87f6bcb82d3c8
3513a4654ddbc2d200657bb45c2d19e5
需要注意头文件问题
0017d8d9ad121674e736e4f4cf6e9a61
所有的配置项都在tfdb_port.h中
c4f5c3b87d5470d5613108d558de470f
TFDB.h内可以配置存储器地址和存储器大小选择
951e234538ebbfa23c914491588a7328
测试程序在TFDB.c内,调试操作过程如下:
d1ca62059142355c647a94b26919a2ae
更改程序运行函数变量
2da91ceaee3a4ec031aba427820ef419
读取成功后,内存缓存区重新被赋值
3d2f580be7549f5fd9aeb632752fdeb3
经过上述操作,读写都是正确的,整个移植过程就介绍完了。**对大家有所帮助。
TFDB项目地址:https://github.com/smartmx/TFDB/tree/main
测试工程源码: EFLASH_Basic(TFDB).zip (1.37 MB, 下载次数: 11)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:北京汇冠触摸技术有限公司/电子工程师
简介:电子工程师,嵌入式应用爱好者。

102

主题

1290

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部