C - случайное зависание процессора во время memcmp на Cortex-R5 - PullRequest
0 голосов
/ 19 февраля 2020

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

Спасибо

...