Eclipse MCU J-Link 调试器在 ldrb r3、[r7、#8] 上崩溃。地址有效 - [编辑 - 硬件问题]
Eclipse MCU J-Link Debugger Crash on ldrb r3, [r7, #8]. Addresses are valid - [Edit - Hardware Issue]
[编辑]原来是硬件问题。一个单独的线程打开无线电功率放大器,我的电源电流限制跳闸。另一个线程总是在这条指令执行的时候激活]
我在调试我的项目时遇到了这个崩溃问题。
CPU 是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(..),成功返回(崩溃在switch(evt.event_type)的第一条指令上,evt.event_type的值为零 (sending_data).
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
我通常知道当我开始责备硬件时我会感到绝望,但这次(有点)是这样。一个单独的线程打开无线电功率放大器,我的电源电流限制跳闸。另一个线程总是在这条指令执行的时候激活,所以导致整个板子崩溃。
[编辑]原来是硬件问题。一个单独的线程打开无线电功率放大器,我的电源电流限制跳闸。另一个线程总是在这条指令执行的时候激活]
我在调试我的项目时遇到了这个崩溃问题。
CPU 是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(..),成功返回(崩溃在switch(evt.event_type)的第一条指令上,evt.event_type的值为零 (sending_data).
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
我通常知道当我开始责备硬件时我会感到绝望,但这次(有点)是这样。一个单独的线程打开无线电功率放大器,我的电源电流限制跳闸。另一个线程总是在这条指令执行的时候激活,所以导致整个板子崩溃。