如何解决我认为这个数据总线测试不起作用任何人都解释为什么它有效?
我找到了“walking 1's test”C 源代码。 (链接:https://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/software-based-memory-testing.html)
因此,我将 C 代码编译为汇编(通过 ARM gcc)以了解 H/W 级别的原子 cpu/内存操作。
仔细观察汇编,我认为这不适用于测试数据总线。
这是 C 代码和汇编。
#define ul unsigned long
ul DataBusTest_Walking_1(volatile ul* address)
{
ul pattern;
for (pattern = 1; pattern != 0; pattern <<= 1)
{
*address = pattern;
if (*address != pattern)
{
return(pattern);
}
}
}
DataBusTest_Walking_1:
push {r7}
sub sp,sp,#20
add r7,#0
str r0,[r7,#4]
movs r3,#1
str r3,#12]
b .L2
.L5:
ldr r3,#4]
ldr r2,#12]
str r2,[r3]
ldr r3,#4]
ldr r3,[r3]
ldr r2,#12]
cmp r2,r3
beq .L3
ldr r3,#12]
b .L1
.L3:
ldr r3,#12]
lsls r3,r3,#12]
.L2:
ldr r3,#12]
cmp r3,#0
bne .L5
.L1:
mov r0,r3
adds r7,r7,#20
mov sp,r7
ldr r7,[sp],#4
bx lr
我将简要解释代码。
在 C 代码中,将模式值写入内存位置“地址”。
模式值变化如下:(走1)
0x00000001(00000 ..... 000001)
0x00000002(00000 ..... 000010)
0x00000004(00000 ..... 000100)
0x00000008(00000 ..... 001000) ...
如果数据总线出现问题,将无法将模式值写入内存。
所以,*address != 模式。
然后,检测数据总线问题。
但是,仔细查看组装后,我发现存在问题。
在函数DataBusTest_Walking_1的开头,内存中存在局部变量'pattern'。
在将“模式值”写入内存位置“地址”之前,cpu 应从内存中加载“模式值”。
而且,这是问题点。加载“模式值”时,由于数据总线问题,cpu会加载不正确的“模式值”。
然后,将“不正确的模式值”写入内存位置“地址”。
然后,从内存位置“地址”加载“不正确的模式值”。
因此,当比较模式和 *address if (*address != pattern)
时,会发生“不正确的模式值”==“不正确的模式值”。
虽然数据总线问题存在,但我们最终无法检测到。
谁能证明这个测试代码有效?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。