Я провожу некоторые тесты на Cortex-R5 (Ultrascale MpSo C). Он в основном генерирует 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
- Где я могу увидеть исходный код memcmp для коры R5? К вашему сведению, используемый компилятор - armr5-none-eabi-g cc.
- Есть идеи, что может вызвать зависание процессора с помощью этой функции?
Спасибо