0

我正在 Cortex-R5(超大规模 MpSoC)上运行一些测试。它基本上使用硬件模块生成 2 个随机数,并在最后比较它们以确保它们不是 0,也不是相同的值。

   uint32_t status;
   const uint8_t zeros[32] = {0};
   uint8_t bytes1[32] = {0};
   uint8_t bytes2[32] = {0};

   // (generate random numbers and put them in bytes1)
   // (generate random numbers and put them in bytes2)

   printf("memcmp 0\n");
   status = !memcmp(bytes1, bytes2, 32);
   printf("memcmp 1\n");
   status |= !memcmp(bytes1, zeros, 32);
   printf("memcmp 2\n");
   status |= !memcmp(bytes2, zeros, 32);

一些测试运行良好。打印“memcmp 0”后,某些执行会停止(当它冻结时,它总是在第一个 memcmp)......

我尝试了几件事:

  • 当我打印字节 1 和 2 中的值时,它们确实是不等于 0 且彼此不相等的随机数。
  • 将 memcmp 移动到不同的位置,或切换 memcmp 的。它总是第一个冻结。
  • 用自定义函数替换 memcmp 进行比较 => 它永远不会冻结。
  • memcmp 函数在代码的其他地方使用,它不会在其他地方冻结。也许不同之处在于随机检查是 memcmp 期望不同值的唯一地方(在其他地方,它是为了确保函数产生预期的输出)。

我找不到 memcmp 的定义...我不知道去哪里找。我唯一能找到的是汇编代码,但是很难附加一个调试器来确切地知道哪条指令不能完成。

000064d0 <memcmp>:
    64d0:   2a03        cmp r2, #3
    64d2:   b470        push    {r4, r5, r6}
    64d4:   d912        bls.n   64fc <memcmp+0x2c>
    64d6:   ea40 0501   orr.w   r5, r0, r1
    64da:   4604        mov r4, r0
    64dc:   07ad        lsls    r5, r5, #30
    64de:   460b        mov r3, r1
    64e0:   d120        bne.n   6524 <memcmp+0x54>
    64e2:   681d        ldr r5, [r3, #0]
    64e4:   4619        mov r1, r3
    64e6:   6826        ldr r6, [r4, #0]
    64e8:   4620        mov r0, r4
    64ea:   3304        adds    r3, #4
    64ec:   3404        adds    r4, #4
    64ee:   42ae        cmp r6, r5
    64f0:   d118        bne.n   6524 <memcmp+0x54>
    64f2:   3a04        subs    r2, #4
    64f4:   4620        mov r0, r4
    64f6:   2a03        cmp r2, #3
    64f8:   4619        mov r1, r3
    64fa:   d8f2        bhi.n   64e2 <memcmp+0x12>
    64fc:   1e54        subs    r4, r2, #1
    64fe:   b172        cbz r2, 651e <memcmp+0x4e>
    6500:   7802        ldrb    r2, [r0, #0]
    6502:   780b        ldrb    r3, [r1, #0]
    6504:   429a        cmp r2, r3
    6506:   bf08        it  eq
    6508:   1864        addeq   r4, r4, r1
    650a:   d006        beq.n   651a <memcmp+0x4a>
    650c:   e00c        b.n 6528 <memcmp+0x58>
    650e:   f810 2f01   ldrb.w  r2, [r0, #1]!
    6512:   f811 3f01   ldrb.w  r3, [r1, #1]!
    6516:   429a        cmp r2, r3
    6518:   d106        bne.n   6528 <memcmp+0x58>
    651a:   42a1        cmp r1, r4
    651c:   d1f7        bne.n   650e <memcmp+0x3e>
    651e:   2000        movs    r0, #0
    6520:   bc70        pop {r4, r5, r6}
    6522:   4770        bx  lr
    6524:   1e54        subs    r4, r2, #1
    6526:   e7eb        b.n 6500 <memcmp+0x30>
    6528:   1ad0        subs    r0, r2, r3
    652a:   bc70        pop {r4, r5, r6}
    652c:   4770        bx  lr
    652e:   bf00        nop
  1. 我在哪里可以看到 cortex R5 的 memcmp 的源代码?仅供参考,使用的编译器是 armr5-none-eabi-gcc。
  2. 知道什么可能导致此功能导致 CPU 停顿吗?

谢谢

4

0 回答 0