Skip to content

[功能建议] 请求支持 FDB_WRITE_GRAN 配置为 128 (最小16字节颗粒度),适配 STM32H5 等新平台 #397

Description

@Oliver0927i

@armink 您好,
首先非常感谢您开发并维护 FlashDB 这个优秀的开源项目!它在我们的多个嵌入式项目中提供了稳定可靠的存储方案,帮我们节省了大量开发时间。
此次提 Issue 是想咨询一下,TSDB 模块未来是否有计划支持 FDB_WRITE_GRAN 配置为 128 (即 16 字节写入粒度)?

背景说明:
我们目前的项目正在迁移到 STM32H563ZI 平台。由于该系列 MCU 的 Flash 控制器 ECC 校验机制以及我们使用的底层驱动优化策略(为了减少固件体积和简化逻辑),底层驱动强制要求 Flash 的写入地址和长度必须严格 16 字节对齐。如果传入非 16 字节倍数的长度,驱动会直接报错。

当前问题:
目前 FlashDB 的 TSDB 配置中,FDB_WRITE_GRAN 最大似乎仅支持到 64 (8 字节)。当我们尝试将其配置为 128 以适配硬件约束时,发现现有逻辑可能无法兼容或不被支持。

诉求与建议:
想请教您:
后续版本是否有计划将 FDB_WRITE_GRAN 的支持范围扩展到 128?
我们非常希望能继续在该项目上使用 TSDB 功能,如果能得到您的指导或支持,我们将不胜感激。
期待您的回复,祝好!

Activity

  1. armink commented on Mar 5, 2026

    @armink
    Owner

    你好,现在应该是支持 128 bit 写粒度的,可以在 fdb_cfg.h 进行配置,请问你是遇到了什么问题呢?

  2. armink commented on Mar 5, 2026

    @armink
    Owner

    确实是 TSDB 还不支持 64 128 bit 写粒度,你可以试着加一下?参考 KVDB

  3. Oliver0927i commented on Mar 6, 2026

    @Oliver0927i
    ContributorAuthor

    好的,我先试着加一下。感谢您的支持,

  4. Oliver0927i commented on Mar 12, 2026

    @Oliver0927i
    ContributorAuthor

    @armink 您好,
    感谢您的指导和信任!参考您提到的 KVDB 实现逻辑,我已经完成了 TSDB 模块对 FDB_WRITE_GRAN 128 (16字节) 粒度的适配开发。
    相关代码已提交至 MR [https://github.com//pull/398]

    主要改动包括:
    更新了写入对齐检查逻辑,以支持 16 字节粒度;
    确保了在 STM32H5 等强对齐要求平台上的兼容性。

    麻烦您在方便时帮忙 Review 一下。如果代码没有问题,不知近期是否方便合入主干并发布一个新版本?这样我们项目就能尽快用上这个特性,也能让更多受限于 Flash 硬件特性的用户受益。
    再次感谢 FlashDB 带来的便利!

  5. armink commented on Mar 16, 2026

    @armink
    Owner

    已经合入啦,感谢你的 PR 贡献哈~~

  6. reopened this on Mar 16, 2026
  7. armink commented on Mar 16, 2026

    @armink
    Owner

    Hi @Oliver0927i ,我尝试给 FlashDB 增加了各种写粒度的自动化测试用例(详见 #399 )。但在自动化测试的过程中发现,当写粒度等于:

    • 64bit
    • 128bit

    时,自动化测试会失败。我在模拟器上手动跑了一下有如下一些错误

    错误1, test_tsdb_data_by_time 用例失败:

    Image

    错误2,test_fdb_tsl_iter_by_time_1 用例失败:

    Image

    错误3,错误2导致了系统宕机,可能哪里有非法内存访问的情况

    Image

    你看方便查找下具体的问题原因嘛?最好在模拟器上开启类似 KASAN 等内存检测工具,提前侦测到非法访问的调用栈

  8. Oliver0927i commented on Mar 17, 2026

    @Oliver0927i
    ContributorAuthor

    @armink 好的,我看下

  9. armink commented on Mar 17, 2026

    @armink
    Owner

    另外,这里的宏定义要完善下,用 SECTOR_HDR_PADDING_SIZE 会更准确

    Image
  10. Oliver0927i commented on Mar 17, 2026

    @Oliver0927i
    ContributorAuthor

    hello @armink
    关于当写粒度等于:64bit 和 128bit时,自动化测试会失败的问题。经过初步分析,找到了两个原因:

    1. test_fdb_tsl_iter_by_time_1 case 在append数据的时候,应该保持 TEST_TIME_STEP 整除的时间戳数量,但实际数据库中并不一定有这些时间戳对应的数据节点。当颗粒度为64或者128时,数据库会被覆盖。我适当的减少append次数,case测试通过
    Image 2. 当设置颗粒度为128时,我屏蔽掉KVDB里面的这几个 test casse,测试通过 Image

    麻烦您看一下,感谢您的时间。我会继续增加更多的测试,希望能早日发版本~

  11. armink commented on Mar 17, 2026

    @armink
    Owner
    • 1、即便数据库覆盖了,那是不是也不应该导致异常,TSDB 是支持覆盖模式的
    • 2、我看了下 KVDB 的测试结果,确实只有写粒度为 128 才异常,这个你要仔细看下呢
    Image Image
  12. armink commented on Mar 17, 2026

    @armink
    Owner

    TSDB 测试失败的问题已经修好了 02c0db9

  13. armink commented on Mar 17, 2026

    @armink
    Owner

    KVDB 测试失败的问题也已经修复好了 db383a1

  14. Oliver0927i commented on Mar 19, 2026

    @Oliver0927i
    ContributorAuthor

    @armink hello, 刚刚我在测试的时候发现,枚举值这样定义,在编译阶段好像没生效,麻烦您也验证下,看下是不是和我一致,感谢!

    Image Image
  15. Oliver0927i commented on Mar 19, 2026

    @Oliver0927i
    ContributorAuthor

    确实这样用不行,枚举常量(如 LOG_IDX_PADDING_SIZE)不能用于结构体成员数组长度的条件编译(#if LOG_IDX_PADDING_SIZE > 0),因为 LOG_IDX_PADDING_SIZE 的值依赖于 sizeof,而 sizeof 只能在编译阶段求值,不能在预处理阶段用。

    现在的问题是:当结构体正好满足最小颗粒长度时,导致padding数组的大小为0,这样会导致在某些编译器下报错。
    解决办法:我想到的办法是当padding数组的大小为0时,再加一个最小颗粒度长度,但是这样会导致占用空间太大。

    Image

    想问下您有什么更好的办法吗?

  16. armink commented on Mar 19, 2026

    @armink
    Owner

    LOG_IDX_PADDING_SIZE 为啥要用枚举,直接用宏定义可以吗?

  17. Oliver0927i commented on Mar 19, 2026

    @Oliver0927i
    ContributorAuthor

    LOG_IDX_PADDING_SIZE 的值依赖于 sizeof,而 sizeof 只能在编译阶段求值,不能在预处理阶段用。最后结果就是结构体里没有定义padding数组

  18. armink commented on Mar 19, 2026

    @armink
    Owner

    这样试试呢?

    Image
  19. Oliver0927i commented on Mar 20, 2026

    @Oliver0927i
    ContributorAuthor

    @armink 这样可以了

  20. Oliver0927i commented on Mar 20, 2026

    @Oliver0927i
    ContributorAuthor

    后来想了下,当这个结构体成员发生变化时,anyway LOG_IDX_PADDING_SIZE宏定义都需要修改,用sizeof计算和用立即数效果一样~

    Image
  21. armink commented on Mar 20, 2026

    @armink
    Owner

    点赞,那你再提交一个 PR 吧。

    另外,上面提到的这一点也一起完善下吧。

    另外,这里的宏定义要完善下,用 SECTOR_HDR_PADDING_SIZE 会更准确

    Image
  22. reopened this on Mar 20, 2026
  23. Oliver0927i commented on Mar 23, 2026

    @Oliver0927i
    ContributorAuthor

    @armink 好的,我重新提了一个PR~ #402

  24. Oliver0927i commented on Mar 23, 2026

    @Oliver0927i
    ContributorAuthor

    @armink 基于master branch 的PR~ #403

  25. armink commented on Mar 23, 2026

    @armink
    Owner

    OK,已经合并啦

  26. armink commented on Mar 23, 2026

    @armink
    Owner
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions