Open Zmmfly opened 5 months ago
是的,我也遇到这个问题,第一次初始化时如果用了操作系统的锁功能会出现死锁卡死,我的环境是:STM32F429+FreeRTOS.使用互斥锁会卡死在: / all sector header check failed / if (check_failed_count == SECTOR_NUM) { FDB_INFO("All sector header is incorrect. Set it to default.\n"); fdb_kv_set_default(db); },我看好多人反馈这个问题了,作者是不继续维护了吗?
我的解决方法:进入fdb_kv_set_default()前先解锁。
/ all sector header check failed /
if (check_failed_count == SECTOR_NUM) {
FDB_INFO("All sector header is incorrect. Set it to default.\n");
/ unlock the KVDB /
db_unlock(db); //if not unlock will cause a deadlock in "fdb_kv_set_default(db);"
fdb_kv_set_default(db);
}
我这边没有用过 FreeRTOS 呢,RT-Thread/Zephyr 及 PC 系统 Linux/Windows/MACOS + GCC 都没有问题的
欢迎提交 PR 哈
设了锁后,fdb_kvdb_init里调了一次db_lock: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1757-L1758
再在
_fdb_kv_load
里检查到失败计数check_failed_count
和SECTOR_NUM
相等时,调用fdb_kv_set_default
: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1643-L1646fdb_kv_set_default
里又调一次db_lock: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1392-L1399用递归锁可以规避,但是文档中没有见到相关描述