我正在 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
- 我在哪里可以看到 cortex R5 的 memcmp 的源代码?仅供参考,使用的编译器是 armr5-none-eabi-gcc。
- 知道什么可能导致此功能导致 CPU 停顿吗?
谢谢