Сбой отладчика J-Link MCU Eclipse на ldrb r3, [r7, # 8]. Адреса действительны - [Edit - Hardware Issue]

[Edit] Оказалось, что это проблема с оборудованием. Отдельный поток включал усилитель мощности радио, и мой предел тока источника питания срабатывал. Другой поток всегда активировался именно тогда, когда выполнялась эта инструкция]

Я борюсь с этим падением при отладке моего проекта.

ЦП - SAM4LS8 (Cortex-M4). Я использую отладку Eclipse MCU 2018/09 с помощью отладчика SEGGER J-Link. Использование FreeRTOS 8.2.1 и Atemel ASF.

У меня есть особая инструкция, которая приводит к сбою отладчика, когда я перешагиваю через нее. Я уверен, что инструкция и адреса верны, поэтому не думаю, что проблема в самой инструкции.

Если эта проблема кажется вам знакомой, буду благодарен за ваш вклад. Это убивает меня.

ldrb r3,[r7,#8]

r7 Имеет значение 20004490 (то же самое, что и в lr). Переменная, к которой осуществляется доступ, является автоматической переменной, и отладчик успешно извлекает значение этой переменной с адреса 0x20004498, как и ожидалось. Когда я пытаюсь выполнить пошаговое выполнение инструкции, я получаю на консоли отладчика следующее. Похоже, что пошаговый режим не останавливается правильно. (Я включил вывод, в котором отладчик успешно считывает значение переменной перед шагом).

Read 1 bytes @ address 0x20004498 (Data = 0x00)
Setting breakpoint @ address 0x0000C71C, Size = 2, BPHandle = 0x000A
Setting breakpoint @ address 0x0000C754, Size = 2, BPHandle = 0x000B
Setting breakpoint @ address 0x0000CEDC, Size = 2, BPHandle = 0x000C
Performing single step...
ERROR: CPU is not halted
ERROR: Can not read register 15 (R15) while CPU is running
...Breakpoint reached @ address 0x00000000
Reading all registers
ERROR: Can not read register 0 (R0) while CPU is running
ERROR: Can not read register 1 (R1) while CPU is running

После того, как стек неудачных чтений регистров и неудачных чтений памяти около 0xDEADBEEF, отладчик восстанавливается со следующим выводом:

Reading 64 bytes @ address 0xDEADBEC0
WARNING: Failed to read memory @ address 0xDEADBEC0
WARNING: Failed to read memory @ address 0xDEADBEEC
Received monitor command: clrbp
Received monitor command: reset
Resetting target
Received monitor command: halt
Halting target CPU...
...Target halted (PC = 0x000104E0)
Read 2 bytes @ address 0x00014F08 (Data = 0xB508)
Received monitor command: regs

Код c только что выполнил xQueueReceive (..) и успешно возвратился (сбой произошел при первой инструкции переключателя (evt.event_type), а значение evt.event_type равно нулю (отправка_данных).

        if(pdFAIL == xQueueReceive(event_queue, &evt, BLOCK_TIMEOUT)){
            assert(!event_queue);
            evt.event_type = tx_done;
        }

        switch(evt.event_type){      << Crash happens here - loading evt.event_type to r3
        case sending_data:

Вот соответствующий ассемблер с отмеченной точкой сбоя:

0000c702:   bl      0x864 <xQueueGenericReceive>
0000c706:   mov     r3, r0
0000c708:   cmp     r3, #0
0000c70a:   bne.n   0xc724 <send_frame+160>
341                 assert(!event_queue);
0000c70c:   ldr     r3, [pc, #168]  ; (0xc7b8 <send_frame+308>)
0000c70e:   ldr     r3, [r3, #0]
0000c710:   cmp     r3, #0
0000c712:   beq.n   0xc720 <send_frame+156>
0000c714:   ldr     r2, [pc, #176]  ; (0xc7c8 <send_frame+324>)
0000c716:   movw    r1, #341        ; 0x155
0000c71a:   ldr     r0, [pc, #168]  ; (0xc7c4 <send_frame+320>)
0000c71c:   bl      0x22d4 <__assert>
342                 evt.event_type = tx_done;
0000c720:   movs    r3, #3
0000c722:   strb    r3, [r7, #8]
345             switch(evt.event_type){
0000c724:   ldrb    r3, [r7, #8]                << Executing this instruction causes the crash

person harry courtice    schedule 07.04.2020    source источник
comment
Я очень, очень настоятельно рекомендую загрузить [GNU Arm Embedded Toolchain Version 9-2019-q4-major] (developer.arm.com/tools-and-software/open-source-software/) и используйте compiler / GDB, которые включены: это удалит инструментальную цепочку / GDB, которую вы используете (в комплекте с MCU Eclipse?) с изображения. Также может быть полезно использование последней версии JLink (v6.70c).   -  person Frant    schedule 07.04.2020
comment
какой адрес в r7 до того, как вы перейдете к этой инструкции?   -  person old_timer    schedule 08.04.2020
comment
@frant - Спасибо. Да, набор инструментов прилагается к проекту. Спасибо за совет, но оказалось, что это аппаратно. Теперь в погоне за другим - вот stackoverflow.com/questions/61115980/.   -  person harry courtice    schedule 09.04.2020
comment
@old_timer - я заметил значение r7 - такое же, как LR, но, согласно редактированию, оказалось, что это проблема с оборудованием. Спасибо, что искали. Если вам скучно, не стесняйтесь взглянуть на мою последнюю проблему здесь: stackoverflow.com/questions/61115980/ Ура,   -  person harry courtice    schedule 09.04.2020
comment
да ладно, теперь я вижу значение r7.   -  person old_timer    schedule 09.04.2020


Ответы (1)


Обычно я понимаю, что начинаю обвинять оборудование в том, что впадаю в отчаяние, но на этот раз это было (вроде) так. Отдельный поток включал усилитель мощности радио, и мой предел тока источника питания срабатывал. Другой поток всегда активировался именно тогда, когда выполнялась эта инструкция, что приводило к сбою всей платы.

person harry courtice    schedule 09.04.2020