NXP MCU 技术论坛
直播中

张涛

8年用户 1407经验值
私信 关注
[问答]

请问单调计数器的值可以在断电后持续保持吗?

我正在考虑使用 imx8mm 中的单调计数器,以保持该值仅增加。
但似乎当断电时,计数器值将被重置。
是否有人尝试在电源重置后保留该值?


回帖(1)

LL-LING宁

2025-3-2 13:15:56

在基于i.MX8M Mini的应用中,保持单调计数器(Monotonic Counter)在断电后持续存在是一个需要结合硬件和软件设计的挑战。以下是针对该问题的技术分析和解决方案:




问题根源分析




  1. i.MX8MM硬件特性



    • 芯片内置的单调计数器(如通过 OCOTP 模块)通常是基于OTP(One-Time Programmable)存储的,不可重复递增,仅能写入一次。

    • 如果依赖易失性寄存器或SRAM实现计数器,断电后必然丢失。




  2. 常见误区



    • 误以为SoC内置的计数器直接支持非易失性存储,但实际上需要外置非易失性介质或专用硬件模块。






解决方案


方案1:软件实现 + 非易失性存储




  • 实现方式




    1. 存储介质选择



      • 使用 eMMC RPMB分区(需安全密钥,防篡改)。

      • 外部 SPI FlashEEPROM(需写平衡和坏块管理)。

      • 芯片内置的 NVM(如果支持)。




    2. 写入逻辑


      // 伪代码示例(需原子操作和掉电保护)
      uint32_t read_monotonic_counter(void) {
      return read_from_nvm(); // 从非易失性存储读取
      }

      int increment_counter(void) {
      uint32_t current = read_monotonic_counter();
      if (write_to_nvm(current + 1)) { // 写入新值
           return SUCCESS;
      }
      return FAILURE; // 处理写入失败(如掉电)
      }



    3. 关键问题



      • 掉电中断风险:在写入过程中断电可能导致数据损坏。

      • 解决方案

      • 使用 双备份+CRC校验(如存储两个副本,通过校验值恢复)。

      • 硬件支持 掉电检测(PFD),触发紧急写入。






方案2:硬件辅助计数器




  • 外部安全芯片



    • 使用 TPM 2.0 或专用安全元件(如ATECC608A),内置防回滚计数器。

    • 通过I2C/SPI与i.MX8MM通信,依赖硬件实现原子递增。




  • RTC备份寄存器



    • 部分SoC的RTC模块带有电池供电的备份寄存器(如SNVS域),可存储小规模数据。

    • i.MX8MM的 SNVS(Secure Non-Volatile Storage) 可能支持有限次数的写入(需查证数据手册)。




方案3:利用文件系统特性



  • 日志型文件系统

    • F2FSJFFS2 中维护计数器文件,利用fsync强制落盘。

    • 缺点:写入延迟和磨损问题。





验证与优化建议




  1. 测试用例



    • 强制断电测试:模拟写入时突然断电,验证计数器是否完整。

    • 使用示波器监测电源跌落时的写入时序。




  2. 性能优化



    • 减少写入频率(如批量操作后更新)。

    • 启用eMMC的 缓存屏障(Cache Barrier) 功能。




  3. 硬件修改



    • 添加超级电容或电池,延长掉电后供电时间,确保关键操作完成。






结论


i.MX8MM的单调计数器若需断电保持,必须依赖非易失性存储或外部硬件。推荐优先验证SNVS域是否支持计数器存储,其次采用eMMC RPMB+双备份策略,或集成TPM芯片实现高可靠性方案。具体选择需权衡开发成本、安全等级和硬件条件。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分