使用情况
芯片: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的异步线程的方式那样。
写入数据库并不要求实时性,只需要确保数据的准确就好了。
异步方式需要一个缓冲区,缓冲区满了才能传入数据,可能导致缓冲区未满时掉电,导致数据缺失了一部分。
但是这个情况,可以添加一个函数,立刻刷新缓冲区。然后给用户使用。 用户自己实现掉电保存与硬件。
所以可以增加一个异步线程的选项,提供用户使用。看用户是选择实时,还是效率。
原作者:用户名由3_15位
|