Не удается правильно запустить NXP MIMXRT1061 CVL5A

#c #c #debugging #gdb #zephyr-rtos

Вопрос:

Опишите ошибку

В настоящее время я пытаюсь запустить Zephyr7.0 на плате разработки, оснащенной MCU: NXP MIMXRT1061 CVL5A. Я просто скомпилировал образец: samplesbasicblinky, но он не мог работать правильно. Сначала я подумал, что проблема с форматом XIP привела к неправильной загрузке Zephyr, но затем я использовал SWD для его отладки и обнаружил, что он был загружен правильно. Но при вызове: /zephyr/arch/arm/core/aarch32/prep_c.c: z_bss_zero(); функция Zephyr пошла не так

Процесс компиляции

Плата, которую я использую, — mimxrt1060_evk, теоретически проблем нет, потому что 1061 основан на 1060

  1. западная сборка -p auto -b mimxrt1060_evk .образцыосновныемигающий
  2. западная вспышка

Процесс отладки

Первая отладка была прервана в z_interrupt_stacks

 z_arm_reset () at C:/Users/zhihao3x/work/zephyrproject/zephyr/arch/arm/core/aarch32/cortex_mreset.S:105
105         msr BASEPRI, r0
(gdb) n
134         ldr r0, =z_interrupt_stacks
(gdb) n
135         ldr r1, =CONFIG_ISR_STACK_SIZE   MPU_GUARD_ALIGN_AND_SIZE
(gdb) n
136         adds r0, r0, r1
(gdb) n
137         msr PSP, r0
(gdb)
138         mrs r0, CONTROL
(gdb)
139         movs r1, #2
(gdb)
140         orrs r0, r1 /* CONTROL_SPSEL_Msk */
(gdb)
141         msr CONTROL, r0
(gdb)
147         isb
(gdb)
154         bl z_arm_prep_c
(gdb)
134         ldr r0, =z_interrupt_stacks
(gdb)

Program received signal SIGTRAP, Trace/breakpoint trap.
(gdb)
 

Позже я использовал одноступенчатую отладку и обнаружил, что Zephyr достиг z_bss_zero

 (gdb)
z_arm_floating_point_init ()
    at C:/Users/zhihao3x/work/zephyrproject/modules/hal/cmsis/CMSIS/Core/Include/cmsis_gcc.h:1003
1003      __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
(gdb)
163             __set_CONTROL(__get_CONTROL() amp; (~(CONTROL_FPCA_Msk)));
(gdb)
0x6000305c in __set_CONTROL (control=3758157056)
    at C:/Users/zhihao3x/work/zephyrproject/modules/hal/cmsis/CMSIS/Core/Include/cmsis_gcc.h:1003
1003      __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
(gdb)
1004      __ISB();
(gdb)
__ISB () at C:/Users/zhihao3x/work/zephyrproject/modules/hal/cmsis/CMSIS/Core/Include/cmsis_gcc.h:260
260       __ASM volatile ("isb 0xF":::"memory");
(gdb)
z_arm_prep_c () at C:/Users/zhihao3x/work/zephyrproject/zephyr/arch/arm/core/aarch32/prep_c.c:183
183             z_bss_zero();
(gdb) n

Program received signal SIGTRAP, Trace/breakpoint trap.
0x62652dc0 in ?? ()
 

Eventually I located the problem in the memset function,when this function is called, it will fall into an infinite loop and then my program will crash

 z_arm_prep_c () at C:/Users/zhihao3x/work/zephyrproject/zephyr/arch/arm/core/aarch32/prep_c.c:183
183             z_bss_zero();
(gdb)
z_bss_zero () at C:/Users/zhihao3x/work/zephyrproject/zephyr/kernel/init.c:89
89              (void)memset(__bss_start, 0, __bss_end - __bss_start);
(gdb)
memset (buf=0x80000030 <z_idle_threads>, c=c@entry=0, n=428)
    at C:/Users/zhihao3x/work/zephyrproject/zephyr/lib/libc/minimal/source/string/string.c:355

(gdb)

Program received signal SIGTRAP, Trace/breakpoint trap.
0x63f5fbf8 in ?? ()
 

Later I tried to debug the memset function and found that the dest address did not change during the loop
Very strange, I do not specify whether it is a gdb problem or a zephyr problem. The address is 0x80000030 before the increment, and 0x80000031 after the increment, and it changes back to 0x80000030 when the next cycle is repeated.

 357             unsigned char c_byte = (unsigned char)c;
(gdb)
389             while (n > 0) {
(gdb)
390                     *(d_byte  ) = c_byte;
392                     n--;
(gdb) p d_byte
$1 = (unsigned char *) 0x80000030 <z_idle_threads> "b"
 

I tried to change the z_bss_zero function

 (void)memset(__bss_start, 0, __bss_end - __bss_start);
 

Changed the size length

 (void)memset(__bss_start, 0, 3);
 

But when I was debugging with gdb, I found that the while loop inside memset exceeded three times without stopping, and it entered an endless loop.
I speculate that there is a problem with the incremented code after these two lines of code, because when I use the gdb print command to print the value of the variable after each increment, the value of the variable does not change

 *(d_byte  ) = c_byte;
        n--;
 

Another weird place is that when I use gdb to debug, I find that there is a pointer. Gdb will not break to this side, but skip this code and execute it. I doubt that the compiler is doing it to me. Is the code optimized?

More details

When I use next to execute z_bss_zero, gdb will break to an indeterminate address at 0xdeadbeee. I guess it may be that Zephyr destroyed the stack when initializing the memory.

 (gdb)
z_arm_prep_c () at C:/Users/zhihao3x/work/zephyrproject/zephyr/arch/arm/core/aarch32/prep_c.c:183
183             z_bss_zero();
(gdb) n

Program received signal SIGTRAP, Trace/breakpoint trap.
0xdeadbeee in ?? ()
 

At the same time, the Jlink debugger also output an error log

 ERROR: Cannot read register 15 (R15) while CPU is running
Reading all registers
ERROR: Cannot read register 0 (R0) while CPU is running
ERROR: Cannot read register 1 (R1) while CPU is running
ERROR: Cannot read register 2 (R2) while CPU is running
ERROR: Cannot read register 3 (R3) while CPU is running
ERROR: Cannot read register 4 (R4) while CPU is running
ERROR: Cannot read register 5 (R5) while CPU is running
ERROR: Cannot read register 6 (R6) while CPU is running
ERROR: Cannot read register 7 (R7) while CPU is running
ERROR: Cannot read register 8 (R8) while CPU is running
ERROR: Cannot read register 9 (R9) while CPU is running
ERROR: Cannot read register 10 (R10) while CPU is running
ERROR: Cannot read register 11 (R11) while CPU is running
ERROR: Cannot read register 12 (R12) while CPU is running
ERROR: Cannot read register 13 (R13) while CPU is running
ERROR: Cannot read register 14 (R14) while CPU is running
ERROR: Cannot read register 15 (R15) while CPU is running
ERROR: Cannot read register 16 (XPSR) while CPU is running
ERROR: Cannot read register 17 (MSP) while CPU is running
ERROR: Cannot read register 18 (PSP) while CPU is running
ERROR: Cannot read register 24 (PRIMASK) while CPU is running
ERROR: Cannot read register 25 (BASEPRI) while CPU is running
ERROR: Cannot read register 26 (FAULTMASK) while CPU is running
ERROR: Cannot read register 27 (CONTROL) while CPU is running
ERROR: Cannot read register 32 (FPSCR) while CPU is running
ERROR: Cannot read register 33 (FPS0) while CPU is running
ERROR: Cannot read register 34 (FPS1) while CPU is running
ERROR: Cannot read register 35 (FPS2) while CPU is running
ERROR: Cannot read register 36 (FPS3) while CPU is running
ERROR: Cannot read register 37 (FPS4) while CPU is running
ERROR: Cannot read register 38 (FPS5) while CPU is running
ERROR: Cannot read register 39 (FPS6) while CPU is running
ERROR: Cannot read register 40 (FPS7) while CPU is running
ERROR: Cannot read register 41 (FPS8) while CPU is running
ERROR: Cannot read register 42 (FPS9) while CPU is running
ERROR: Cannot read register 43 (FPS10) while CPU is running
ERROR: Cannot read register 44 (FPS11) while CPU is running
ERROR: Cannot read register 45 (FPS12) while CPU is running
ERROR: Cannot read register 46 (FPS13) while CPU is running
ERROR: Cannot read register 47 (FPS14) while CPU is running
ERROR: Cannot read register 48 (FPS15) while CPU is running
ERROR: Cannot read register 49 (FPS16) while CPU is running
ERROR: Cannot read register 50 (FPS17) while CPU is running
ERROR: Cannot read register 51 (FPS18) while CPU is running
ERROR: Cannot read register 52 (FPS19) while CPU is running
ERROR: Cannot read register 53 (FPS20) while CPU is running
ERROR: Cannot read register 54 (FPS21) while CPU is running
ERROR: Cannot read register 55 (FPS22) while CPU is running
ERROR: Cannot read register 56 (FPS23) while CPU is running
ERROR: Cannot read register 57 (FPS24) while CPU is running
ERROR: Cannot read register 58 (FPS25) while CPU is running
ERROR: Cannot read register 59 (FPS26) while CPU is running
ERROR: Cannot read register 60 (FPS27) while CPU is running
ERROR: Cannot read register 61 (FPS28) while CPU is running
ERROR: Cannot read register 62 (FPS29) while CPU is running
ERROR: Cannot read register 63 (FPS30) while CPU is running
ERROR: Cannot read register 64 (FPS31) while CPU is running
ERROR: Cannot read register 33 (FPS0) while CPU is running
ERROR: Cannot read register 34 (FPS1) while CPU is running
ERROR: Cannot read register 35 (FPS2) while CPU is running
ERROR: Cannot read register 36 (FPS3) while CPU is running
ERROR: Cannot read register 37 (FPS4) while CPU is running
ERROR: Cannot read register 38 (FPS5) while CPU is running
ERROR: Cannot read register 39 (FPS6) while CPU is running
ERROR: Cannot read register 40 (FPS7) while CPU is running
ERROR: Cannot read register 41 (FPS8) while CPU is running
ERROR: Cannot read register 42 (FPS9) while CPU is running
ERROR: Cannot read register 43 (FPS10) while CPU is running
ERROR: Cannot read register 44 (FPS11) while CPU is running
ERROR: Cannot read register 45 (FPS12) while CPU is running
ERROR: Cannot read register 46 (FPS13) while CPU is running
ERROR: Cannot read register 47 (FPS14) while CPU is running
ERROR: Cannot read register 48 (FPS15) while CPU is running
ERROR: Cannot read register 49 (FPS16) while CPU is running
ERROR: Cannot read register 50 (FPS17) while CPU is running
ERROR: Cannot read register 51 (FPS18) while CPU is running
ERROR: Cannot read register 52 (FPS19) while CPU is running
ERROR: Cannot read register 53 (FPS20) while CPU is running
ERROR: Cannot read register 54 (FPS21) while CPU is running
ERROR: Cannot read register 55 (FPS22) while CPU is running
ERROR: Cannot read register 56 (FPS23) while CPU is running
ERROR: Cannot read register 57 (FPS24) while CPU is running
ERROR: Cannot read register 58 (FPS25) while CPU is running
ERROR: Cannot read register 59 (FPS26) while CPU is running
ERROR: Cannot read register 60 (FPS27) while CPU is running
ERROR: Cannot read register 61 (FPS28) while CPU is running
ERROR: Cannot read register 62 (FPS29) while CPU is running
ERROR: Cannot read register 63 (FPS30) while CPU is running
ERROR: Cannot read register 64 (FPS31) while CPU is running
Removing breakpoint @ address 0x60003068, Size = 2
WARNING: Failed to read memory @ address 0xDEADBEEE
 

Jlink output

The following is the MCU information output by Jlink, I am not sure if this version is supported by Zephyr

 -----GDB Server start settings-----
GDBInit file:                  none
GDB Server Listening port:     2331
SWO raw output listening port: 2332
Terminal I/O port:             2333
Accept remote connection:      localhost only
Generate logfile:              off
Verify download:               off
Init regs on start:            off
Silent mode:                   on
Single run mode:               on
Target connection timeout:     5000 ms
------J-Link related settings------
J-Link Host interface:         USB
J-Link script:                 none
J-Link settings file:          none
------Target related settings------
Target device:                 MIMXRT1062xxx6A
Target interface:              SWD
Target interface speed:        auto
Target endian:                 little
 

Я изо всех сил старался в течение семи дней и все еще не могу решить эту проблему. Я попытался переключить версию Zephyr, а также использовал платформу ввода-вывода для создания файлов elf и bin, но все они были неэффективны. Пожалуйста, помогите мне. Большое спасибо.