Hardfault при запуске STM32F030, массив инициализации libc
Я пытаюсь получить проект STM32Cube, скомпилированный с помощью arm-none-eabi-gcc и Makefile. Я уточнил:
CFLAGS = -mthumb
-march=armv6-m
-mlittle-endian
-mcpu=cortex-m0
-ffunction-sections
-fdata-sections
-MMD
-std=c99
-Wall
-g
-D$(PART)
-c
и:
LDFLAGS = -Wl,--gc-sections
-Wl,-T$(LDFILE)
-Wl,-v
FW строит без проблем.но когда я загружаю MCU, я застреваю в жесткой ошибке. Трассировка стека:
#0 HardFault_Handler () at ./Src/main.c:156
#1 <signal handler called>
#2 0x0800221c in ____libc_init_array_from_thumb ()
#3 0x080021be in LoopFillZerobss () at Src/startup_stm32f030x8.s:103
#4 0x080021be in LoopFillZerobss () at Src/startup_stm32f030x8.s:103
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
и я иду прямо к жесткой вине, когда шагаю к bl __libc_init_array
в файле автозагрузки.
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2]
adds r2, r2, #4
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
/* Call the clock system intitialization function.*/
bl SystemInit
/* Call static constructors */
bl __libc_init_array
/* Call the application's entry point.*/
bl main
любые идеи, что может быть не так?
моя arm-none-eabi-GCC версия 4.8.4 20140725 (release)
[редактирование] Разборка вызовов
08002218 <____libc_init_array_from_thumb>:
8002218: 4778 bx pc
800221a: 46c0 nop ; (mov r8, r8)
800221c: eafff812 b 800026c <__libc_init_array>
0800026c <__libc_init_array>:
800026c: e92d4070 push {r4, r5, r6, lr}
8000270: e59f506c ldr r5, [pc, #108] ; 80002e4 <__libc_init_array+0x78>
8000274: e59f606c ldr r6, [pc, #108] ; 80002e8 <__libc_init_array+0x7c>
8000278: e0656006 rsb r6, r5, r6
800027c: e1b06146 asrs r6, r6, #2
8000280: 12455004 subne r5, r5, #4
8000284: 13a04000 movne r4, #0
8000288: 0a000005 beq 80002a4 <__libc_init_array+0x38>
800028c: e2844001 add r4, r4, #1
8000290: e5b53004 ldr r3, [r5, #4]!
8000294: e1a0e00f mov lr, pc
8000298: e12fff13 bx r3
800029c: e1560004 cmp r6, r4
80002a0: 1afffff9 bne 800028c <__libc_init_array+0x20>
80002a4: e59f5040 ldr r5, [pc, #64] ; 80002ec <__libc_init_array+0x80>
80002a8: e59f6040 ldr r6, [pc, #64] ; 80002f0 <__libc_init_array+0x84>
80002ac: e0656006 rsb r6, r5, r6
80002b0: eb0007ca bl 80021e0 <_init>
80002b4: e1b06146 asrs r6, r6, #2
80002b8: 12455004 subne r5, r5, #4
80002bc: 13a04000 movne r4, #0
80002c0: 0a000005 beq 80002dc <__libc_init_array+0x70>
80002c4: e2844001 add r4, r4, #1
80002c8: e5b53004 ldr r3, [r5, #4]!
80002cc: e1a0e00f mov lr, pc
80002d0: e12fff13 bx r3
80002d4: e1560004 cmp r6, r4
80002d8: 1afffff9 bne 80002c4 <__libc_init_array+0x58>
80002dc: e8bd4070 pop {r4, r5, r6, lr}
80002e0: e12fff1e bx lr
80002e4: 08002258 .word 0x08002258
80002e8: 08002258 .word 0x08002258
80002ec: 08002258 .word 0x08002258
80002f0: 08002260 .word 0x08002260
[редактирование 2] Значения регистра из gdb:
(gdb) info reg
r0 0x20000000 536870912
r1 0x1 1
r2 0x0 0
r3 0x40021000 1073876992
r4 0xffffffff -1
r5 0xffffffff -1
r6 0xffffffff -1
r7 0x20001fd0 536879056
r8 0xffffffff -1
r9 0xffffffff -1
r10 0xffffffff -1
r11 0xffffffff -1
r12 0xffffffff -1
sp 0x20001fd0 0x20001fd0
lr 0xfffffff9 -7
pc 0x800067c 0x800067c <HardFault_Handler+4>
xPSR 0x61000003 1627389955
1 ответов
Это __libc_init_array
- Это код ARM, а не большой палец, поэтому M0 упадет, пытаясь выполнить какую-то ерунду, которую он не понимает (на самом деле, он никогда не попадает туда, так как он ошибается при попытке перейти в состояние ARM в bx
, но эй, какая разница...)
вам нужно будет убедиться, что вы используете версии pure-Thumb любых библиотек - цепочка инструментов Cortex-M может быть лучше, чем общая ARM. Если у вас есть multilib toolchain, я бы предложил проверить вывод из arm-none-eabi-gcc --print-multi-lib
чтобы убедиться, что вы указали все соответствующие параметры для получения правильных библиотек Cortex-M, и если вы используете отдельный шаг ссылки, убедитесь, что вы вызываете его с помощью LD=arm-none-eabi-gcc
(плюс соответствующие опции multilib), а не LD=arm-none-eabi-ld
.