FAL 上的FlashDB、EasyFlash、EasyLogger调试经历

发布于 2020-09-27 00:29:20

经过这几天的调试,一定要把这个经历写下来。。。。

需求:实现设备运行期间的 日志打印,日志保存

第一阶段

发现 FlashDB pack
在移植 FlashDB的时候发现了,FAL这个管理中间层,它可以管理底层的任何存储介质

移植FAL

这个时候我发现FAL 需要一个 fal_cfg.h 的文件列表我可以加载STM32F407 Flash,可以使用SPI FLASH,

  • SPI Flash ,初始化SPI 后,增加fal_flash_sfud_port.c文件,对应的填写fal_cfg.h 中的表格就可以了,简单的就实现了。
  • STM32F407 Flash,这个我直接添加fal_flash_stm32f4.c 文件,编译之后发现错误,原因是Hal库的flash文件未添加,我认为rtthread做的这么优秀,不可能出现自己添加的文件呀,无奈手动添加了一下,编译通过。自己强迫症,为什么需要手动添加,寻找库文件,我发现如下图依赖,

4992E503-A308-43a0-BE20-0B4CE8BBFC0E.png
果断在board文件的kconfig中添加此依赖项,但是编译报错,因为还会带来一个文件drv_flash_f4.c,这个文件中的几个宏未定义,我添加上如下图所示44C618C4-3A52-42a1-A1F4-627EC470789A.png
对应的填写fal_cfg.h 中的表格就可以了。在main函数中调用fal初始化,这时候效果如下图所示
D2B2FB3D-51C8-4b7b-AA8A-1546A4E32044.png
然后移植,FlashDB 就很简单了,直接在ENV 中配置一下,就实现了

第二阶段

在写FlashDB的时候,发现这个Pack是刚刚开始的一些配套说明文件还未完全,对于我的项目可能并不适用,还是考虑用 EasyFlash + Easylogger吧,此时把FlashDB 组件删除,留下Fal,反正Fal就是管理存储介质的一个工具!

移植EasyFlash

直接在Env中添加,这时候要注意配置,如下图5DE53083-8B67-4f7c-8144-F29C0E3176B5.png
编译出错,读取写入文件没有,需要手动添加Port中ef_sfud_port.c 文件,还需要如下图所示,把fal_cfg.h 中定义的分区名字给EasyFlash,如下图所示
33EF4C62-ACC9-4aaf-8997-022D6F251045.png
main函数中,添加easyflash初始化,此时编译下载,如下图
0C37AAAA-D0CE-40bc-B41F-BAE99B475A32.png

移植EasyLogger

直接在ENV中添加EasyLogger组件,此时需要注意一下各个分区大小,我存在SPI Flash中,设置如下的空间配置BFF4885E-DCCB-4d9b-9C57-1EB202D3932C.png编译下载,这时候Fal + EasyFlash + EasyLogger 都成功了,如下图所示
1C08106D-A58E-4128-93FB-5946DFD59012.png
这时候遇到了一个问题,调试了将近一下午时间,我在添加这些之后习惯性的在Shell中输入Tab键输出支持的指令,我发现每次我输入Tab后设备都重启,找了好久问题,最后发现是看门狗溢出了。可能是Tab输出的字符比较多,在输出的时候使用的是循环空闲任务钩子函数喂狗未得到运行重启了吧。大家调试的时候,设备无辜重启,首先看看狗是不是没喂。

改进

我在看论坛中得知,这个EasyLogger日志是可以存储在文件中的,并且RThread工程师已经实现了这个File文件存储的功能,那么我为什么不把这个文件存储一下,后期设备出现问题,我直接通过网络,把这个文件输出到计算机中,在计算机中查看那就方便多了,我不用麻烦的使用shell查看吧?那么问题来了,这个文件存储在哪里,第一感觉存储在文件系统中,那么文件系统可以构建在SPI FLASH上吧,这个是肯定的。

那么问题1,我的Easy Flash 存储的Env 和 LOG 都是在SPI Flash中,我的文件系统是不是也可以挂载在SPI Flash 上呢?我的第一感觉是不行。。。就引来了第三阶段

第三阶段

Easy Flash 存储位置,放在Stm32 F407 片上存储,初始化Fal,如下图所示39845768-0018-4213-8E17-29CDA3794DB3.png

下载调试成功,接下来添加EasyFlash了开始,直接初始化配置空间如下图
B7A9E0A1-4861-417f-B973-3074FB3D0258.png

因为 SPI Flash 和 Chip Flash 地址擦除写入等空间不一致,所以做了调整。
这时候我初始化EasyFlash,发现报错了,如下图Error.png

跟中了一下代码发现,0D10CA67-6AC0-47a2-AC23-2F49FDD2EABF.png
这里报错,意思是现在的地址,大于了这块的长度,那我就疑问了,0x080xxxxx地址,怎么都会大于我这片空间的长度呀。

总结疑问

  • 日志存储在文件中,文件是不是放在文件系统中?
  • 日志存储在文件中时,是不是把文件系统的起始地址,设置在Fal中(SPI Flash 为0.长度自己设定,不越界即可)?然后EasyFlash初始化的ef_port_init中直接把文件系统的分区名给他。EasyFlash的读写依然是SPI 的读写函数。
  • EasyFlash配置文件中,有EF_START_ADDR为起始地址,有ENV_AREA_SIZE环境变量空间大小,有LOG_AREA_SIZE日志空间大小,但是没有日志的起始地址,是不是EF_START_ADDR + ENV_AREA_SIZE 也就等于了日志的起始地址呢?
  • 不管我的日志存储在哪的文件中,还是我上诉表述不清楚,或者我的思路有问题,但是我把EasyFlash 配置在Chip的Flash上都应该对呀,为什么会出现如下问题!

CCE0681E-9200-4ae0-B38D-E9BFF99E2D14.png

哎~直至今天,上诉这些问题刚刚好调试一周了!但是还未解决

刚刚开始学习,思路可能有问题,大神勿怪。请熟悉了解的人麻烦指点一下,谢谢!

@armink 抱歉再次打扰一下 Rtthread 朱工,因为这里大多数组件都是出自您的经典之作。

查看更多

关注者
0
被浏览
1.2k
whj467467222
whj467467222 认证专家 2020-09-28

建议写成文章,楼主太棒了

4 个回答
HappyTime
HappyTime 2020-09-27

可以写成文章啊。

zhujie
zhujie 2020-09-27

我知道问题所在了,记录下来,避免大家烦我这种低级错误。

Env中配置的Env Start Addr 应该设置成为 “0”
Env.png
也就是代码中这个宏定义
daima.png

是相对于 fal 分区 EasyFlashEnv 的起始地址,而不是相对于chip Flash 的起始地址。
fal_cfg.png

低级错误,不好意思!

开启PKG_EASYFLASH_LOG

接下来 开启PKG_EASYFLASH_LOG,注意分配空间大小,对应的修改Fal_cfg.h 文件配置大小,如下图所示
Log.png
fal_cfg2.png
至此,设备初始化成功,测试一下看看,测试代码直接参考RTthread官方demo,如下
Test.png
测试结果,再用fal看一下
TestShell.png,对于这些“EF40”、“KV40”字段,我也不知道什么意思。。。
printenv看一下,
printenv.png
看着结果正常,先这样吧,

这些“EF40”、“KV40”字段,有大神知道什么原因,请指点。。。

下面是 EasyLogger 组件添加啦!

armink
armink 2020-09-28

楼主厉害了,终于把 Easy 全家桶用起来了,其实 EasyLogger 自动的文件插件应该是可以直接配合文件系统使用的,但是就得需要开启文件系统,系统的资源占用也会变的更大

如果追求轻量级,后面也可以试试 FlashDB 哈,KV 及日志存储功能一个软件包也都统统搞定,就是目前文档偏少,后面很快就会加强起来,敬请期待

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览