工具与软件:
我有一个长期运行的产品、其新固件构建在遇到大量传入串行端口流量时偶尔开始失败。 通过使用我们固件中内置的分析工具和调试器、我能够将问题隔离到固件代码的特定部分。
固件使用 TST 重复读取 UCARXBUF (UART 模式)。 B 指令、即使没有挂起字符也是如此。 (不要问为什么;但我没有发现任何禁止读取 UCA0RXBUF 的文档、即使 UCRXIFG 未置1。) 但是、有时、例如每1000000次执行一次 CPU 跳过后续指令、没有明显的原因。
由于该后续指令是 RETA、因此跳过它会导致执行流入完全错误的路径、从而使器件不工作。
0x37C64 TST。 b 0xC(R12) ;该指令读取 UCA0RXBUF (R12=0x05C0)
0x37C68 RETA
0x37C6A MOVA R13、0x8 (R12) ;不应执行但有时在0x37C64之后执行的不相关指令
0x37C6E RETA
只要未执行指令上的断点停止执行、State Storage 就会显示该执行确实已在0x37C68处的 RETA 指令上跳过:
这一事件的发生概率以及必须有进入字节的事实使我感觉这与 UCRXIFG 在被读取 RXBUF 的同时由硬件设定的~情况有关。 然而、UCRXIE 和 GIE 被置位、所以所有进入的字符应该触发中断处理、但在状态存储中看不到中断处理。 (状态存储器在执行 TST 之后不久显示"IRQ=1"。 B 指令读取 RXBUF。 为什么它是那里、以及如果它是一个中断、为什么没有开始中断处理?)
我找不到任何有关 MSP430F5437A 勘误表的公告、它不能涵盖这种执行失控的情况。 发生了什么以及如何确保固件的可靠性? 当然、我可以在读取 UCA0RXBUF 后添加一个虚拟指令、但如果不确认根本原因、我就无法确保它能够可靠地解决此问题。 无论如何、CPU 上不应发生未记录的行为。