我们发现一个 MSP430F2617微控制器在 RAM 存储器中具有故障位。 经过大量调试后、似乎故障位会受到其相邻位的值的影响(如下所述)。
批次如下:
76ARXZTG4
具体来说、故障位发生在地址0x1A6A、其中位6不会保留尝试写入的值:
写入0x10后、我们读取0x30
写入0x20后、我们读取0x00
(笑声) 等等。 似乎 Bit5正在从 bit4复制。 我们发现这条规则的例外情况,显然在一定程度上依赖 adjascent 这个词。 地址0x1A6C 处还有一个具有类似行为的故障位。
我们测试了一些应该检测故障的代码、遇到了一些陌生的行为。 以下汇编器代码将值0x5555写入地址0x1A6A (&p)、然后将0x1A6A 的内容与0x5555进行精确比较(以检查保留情况)。
\ 000008 1D42... MOV.W 和?P、R13
\ 00000C 8D930000 CMP.W #0x0、0 (R13)
\ 000010 BD40550000 MOV.W #0x5555、0 (R13)
\ 00001C BD90550000 CMP.W #0x5555、0 (R13)
通过观察调试器中的地址0x1A6A、我们可以看到在写入指令后、由于错误位、在0x1A6A 记录的值是0x7555而不是0x5555。 我们希望在后续比较中捕获此故障、但比较指令返回 true、就像0x5555记录在0x1A6A 一样。 它不是从 RAM 中获取值、而是从缓冲器中获取值?
我们通过在写入和比较指令之间插入一个虚拟内存访问(到地址0x1100)找到了一种解决方法:
\ 000008 1D42... MOV.W 和?P、R13
\ 00000C 8D930000 CMP.W #0x0、0 (R13)
\ 000010 BD40550000 MOV.W #0x5555、0 (R13)
\ 000016 B24005000011 MOV.W #0x5、&0x1100
\ 00001C BD90550000 CMP.W #0x5555、0 (R13)
使用此代码、虽然与之前的代码没有逻辑区别、但是检测到故障(将0x5555与地址0x1A6A 处的内容进行比较会返回 false)。 使第一个代码无法检测到故障的原因可能是什么?
如果您能回答以下问题、我将不胜感激:
1.您是否有此批次或其他批次的特定 RAM 故障? 您是否对 MSP4302617系列中发布的故障 RAM 进行了百分比估算?
2.您能否列出您对 RAM 执行的测试以及覆盖范围的百分比?
3.您能解释一下描述的行为吗,特别是为什么第一个代码没有检测到故障?
提前感谢