我认为这个数据总线测试不起作用任何人都解释为什么它有效?

问题描述

我正在寻找如何测试 cpu 和内存之间的数据总线。

我找到了“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 (将#修改为@)