使用 GCC arm-none-eabi 进行 STM32F0 编程:__libc_init_array 中出现硬故障
STM32F0 programming with GCC arm-none-eabi : hardfault in __libc_init_array
我正在尝试为 STM32L030x6 MCU 制作固件。
我做了一个简单的代码,它似乎可以在带有 STM32L030x8 MCU 的评估板上运行。 'seems to work' 我的意思是我能够到达主 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 调用的洞察力?
非常感谢
Since flash sizes are different I changed the linker script
accordingly
我打赌您没有更改向量 table 中的堆栈初始地址(可能还有 RAM 大小),因此第一次调用会导致 HF。
BTW 21 世纪的 gdb 命令行?浪费时间而且极不方便。安装 Atollic Studio - 它是免费的,并且由 STM 提供支持(实际上 STM 是公司的所有者)。易于创建项目。
如果您打算手动完成,那将是一种压力和沮丧的方式。
我正在尝试为 STM32L030x6 MCU 制作固件。
我做了一个简单的代码,它似乎可以在带有 STM32L030x8 MCU 的评估板上运行。 'seems to work' 我的意思是我能够到达主 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 调用的洞察力?
非常感谢
Since flash sizes are different I changed the linker script accordingly
我打赌您没有更改向量 table 中的堆栈初始地址(可能还有 RAM 大小),因此第一次调用会导致 HF。
BTW 21 世纪的 gdb 命令行?浪费时间而且极不方便。安装 Atollic Studio - 它是免费的,并且由 STM 提供支持(实际上 STM 是公司的所有者)。易于创建项目。
如果您打算手动完成,那将是一种压力和沮丧的方式。