eeprom-page-wrap-around-debug
记录一下今天遇到的一个 bug,由于软硬件错配导致遇到 eeprom 写回绕的,最终解决方案比较简单,但搜集线索和排查问题耗费了较多时间。 现象 设备从远端持续下载数据过程中始终失败,预期应该持续接收直到传输完成。 线索 通过与触发问题的同事交流以及自己调试排查,收集到几条线索: 问题只在带真实 EEPROM/Flash 的硬件上复现,在 mock 掉 EEPROM 和 Flash 的纯软件仿真环境里,下载流程完全正常。 出问题的数据都集中在 EEPROM 地址的起始区域,几份数据的存储地址很近。 问题点并不集中于传输,设备启动阶段也观察到异常,共同点是两者都依赖 EEPROM 里的同一片区域。 仅一款设备存在问题,其它型号正常。 连续操作下,第一次下载前数据正常;第一次下载失败后读出"异常 A";第二次下载失败后读出"异常 B"。异常本身有确定的模式,不是随机扰动。 推测 基于上述几条线索,基本可以确定 代码逻辑无问题:因为 mock 的 eeprom 和 flash 并不存在问题。而且若程序有问题,如何解释问题不集中在一处呢? 问题与 eeprom 有关,但与 eeprom 硬件故障无关:异常点处数据集中,异常模式稳定,若 eeprom 硬件故障,则不会保持稳定的异常模式 验证 查看工程配置,发现 EEPROM 的 PAGE_SIZE 被配置为了 512 bytes。 翻芯片 datasheet: Page Write The Page Write mode allows up to 256 bytes to be written in a single Write cycle, provided that they are all located in the same page in the memory: that is, the most significant memory address bits, b16–b8, are the same. If more bytes are sent than will fit up to the end of the page, a “roll-over” occurs, i.e. the bytes exceeding the page end are written on the same page, from location 0. ...