Closed DarryZh closed 1 year ago
没有太看懂你的意思,方便再描述详细些吗?也包括你设置的 ALIGN 是多大
我的配置文件中FDB_WRITE_GRAN是8,即1byte;
https://github.com/armink/FlashDB/blob/master/src/fdb_tsdb.c 中search_start_tsl_addr函数,计算 tsl.addr.index = start + FDB_ALIGN((end - start) / 2, LOG_IDX_DATA_SIZE) 时异常。 输入参数为start:48,end:68, LOG_IDX_DATA_SIZE为20, 所以有FDB_ALIGN((end - start) / 2, LOG_IDX_DATA_SIZE)计算出来为12, 进一步tsl.addr.index = start + 12, 结果为60。
但我的tsdb的log所在的正确位置为tsl.addr.index = start,即48。如果描述不清楚或者错误,还请不吝赐教。
进一步的原因,我认为是FDB_ALIGN 宏定义的实现出了问题,第二个参数 align如果不为2^n,则会出现奇怪的对齐数据,这是我下面做的最小测试的结果:
FDB_ALIGN(10, 10) : 18 FDB_ALIGN(10, 20) : 12 FDB_ALIGN(20, 20) : 36 FDB_ALIGN(20, 10) : 20 FDB_ALIGN(10, 8) : 16 FDB_ALIGN(32, 16) : 32
确实是的呢,你方便优化下这块代码吗?
已解决
https://github.com/armink/FlashDB/blob/master/src/fdb_tsdb.c 中的search_start_tsl_addr函数,处理index:tsl.addr.index = start + FDB_ALIGN((end - start) / 2, LOG_IDX_DATA_SIZE); 这条语句在出现FDB_ALIGN(10, 20)的时候(size小于align),会出现异常,不太确定这里的对齐操作是不是必须的,当我去掉之后,功能则正常了