C语言 STM32F0 使用 GCC arm-none-eabi 编程:__libc_init_array 中的硬故障



我正在尝试为STM32L030x6 MCU制作固件。

我做了一个简单的代码,它似乎适用于具有STM32L030x8 MCU的评估板。通过"似乎有效",我的意思是我能够到达主 fct 并切换 gpio。

但是当我的目标STM32L030x6上闪烁时,我在启动代码的早期就出现了硬错误:

Reset_Handler:
ldr   r0, =_estack
mov   sp, r0          /* set stack pointer */
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
ldr r2, =_sbss
b LoopFillZerobss
/* 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 <-------------- after a breakpoint here, typing "ni" in gdb hardaulft
/* Call the application's entry point.*/
bl main <----------------------------- never reach here
LoopForever:
b LoopForever

由于闪存大小不同,我相应地更改了链接器脚本,因此内存初始化必须正常。

我不确定"__libc_init_array"是做什么的,它是libc的一部分(在我的情况下是newlib-nano(。

一件有趣的事情是,如果我评论对"__libc_init_array"的调用,它在评估板上仍然运行良好,并且在我的目标上仍然有硬错误。所以也许问题在通话之前。

我对SystemInit非常有信心,因为它是ST的模板,可以处理两个MCU。

这可能不是硬件问题,因为使用 Keil,我能够成功刷新我的目标并运行简单的应用程序代码。

知道可能是什么问题吗?那么对这个电话的见解 libc ?

提前非常感谢

由于闪存大小不同,我更改了链接器脚本 因此

我敢打赌,您没有更改向量表中的堆栈初始地址(可能还有 RAM 大小(,因此第一次调用会导致 HF。

顺便说一句,21 世纪的 gdb 命令行?浪费时间,极不方便。安装Atollic Studio - 它是免费的,并且由STM支持(实际上STM是公司的所有者(。易于创建项目。

如果您要手动执行此操作,这将是压力和沮丧的方式。

最新更新