flashDB/Easyflash触发GC导致系统卡死的解决方法分享

电子说

1.3w人已加入

描述

使用情况

芯片:SMT32F429
操作系统:RTT 5.0.0
文件系统:littlefs + romfs
flashdb:kvdb + 文件模式 使用

使用场景

分配5个扇区情况

创建一个线程,1秒写入一次当前时间戳至kvdb数据库中

发现如果分配五个扇区,前四个扇区都可以正常读写。

当五个扇区都写满的时候,需要搬运数据到第0扇区去。

日志如下,没有空扇区了。

The remain empty sector is 1, GC threshold is 1.

这个日志已出现,系统就会卡死,看门狗复位

尝试debug调试,总是调到没有使用的函数里面,函数地址0x00000xx开头。

解决方法

经过不断尝试,ps打印当前线程状态时,发现时间戳保存线程的最大使用率高达81%.一般来说都要控制在75%左右合适。

分析是不是应该堆栈不够导致系统卡死

将该线程从2048改为4096后,不会出现卡死问题了。线程的最大使用率变为51%

分析

flshdb在扇区都满的情况下,会进行Collect操作。这个操作是在当前线程完成的,会增加占用率。

然而这个运行操作并不是会频繁出现的,所以很难判断到是堆栈不够导致的问题。

建议

能否增加一个异步模式来专门执行gc与Collect操作?

就像ulog的异步线程的方式那样。

写入数据库并不要求实时性,只需要确保数据的准确就好了。

异步方式需要一个缓冲区,缓冲区满了才能传入数据,可能导致缓冲区未满时掉电,导致数据缺失了一部分。

但是这个情况,可以添加一个函数,立刻刷新缓冲区。然后给用户使用。 用户自己实现掉电保存与硬件。所以可以增加一个异步线程的选项,提供用户使用。看用户是选择实时,还是效率。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分