这个问题与AVR 解编程本身有关。
项目信息:
我们有一个使用 ATMEGA644P 的电池供电产品。应用程序永久在睡眠模式下运行,并且仅在每秒一次 (RTC) 或触发两个外部中断线之一时唤醒。
该设备具有一个非常简单的引导加载程序,通过 UART 进行通信(使用 RS232 接口 IC)。它只是作为一种更新固件的便捷方法,因此不需要硬件 ISP 编程器。(引导加载程序需要校验和安全电报)
这些设备设计为禁用内部掉电,因为它使功耗加倍并且必须延长电池寿命(我想应该使用外部掉电检测 - 重新设计正在进行中)。
问题:
每隔几个月,设备就会停止工作,这些设备上没有执行任何固件更新。但是,经过进一步检查,这些设备的闪存内容似乎已损坏。此外,其中一些设备的电池仍然很好,但我不想排除某种欠压情况。
这是原始闪存内容(左)与损坏内容(右)的比较:
一些观察:
- 损坏的块始终包含至少一个闪存页(256 字节)并且是页对齐的。换句话说:只有整个页面受到影响,而不是单个字节。
- 损坏的内容大部分时间读取 0xFF,但也可能包含一些其他值或完全“随机”。
- 图像左侧的小条显示所有受影响的区域。对于这个设备,它大约是闪存总内容的十分之一。
- 我们有一个设备,其中只有一个页面受到影响。
写入闪存时的欠压情况可能会损坏闪存内容,这是完全合理的。但是,这意味着必须执行一些对闪存敏感的指令。
也许控制器由于电压不足而随机重新启动,并且在此期间引导加载程序代码的行为完全不可预测。引用另一个论坛上关于欠压的一些人的话:
“不仅是来自闪存的随机指令正在执行,而且是随机指令周期(无法保证来自闪存的代码将被正确读取和解释)。除此之外,mcu 的其他部分可能无法按设计运行,包括保护机制。”
问题:
您认为“欠压期间的随机行为和执行某些指令会更改闪存页面中的数据” - 解释是否合理?如果是这样的话,为什么我们不一直看到这种错误只是一些软件问题(堆栈溢出、无效指针)的原因。
你有什么其他想法会导致这种腐败吗?这可能是由 EMI/ESD 引起的吗?