c - STM32F0使用GCC编程arm-none-eabi : hardfault in __libc_init_array

标签 c gcc stm32

我正在尝试为 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 的调用有深入的了解吗?

非常感谢

最佳答案

Since flash sizes are different I changed the linker script accordingly

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

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

如果您要手动执行此操作,这将是一种压力和挫折的方式。

关于c - STM32F0使用GCC编程arm-none-eabi : hardfault in __libc_init_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52559661/

相关文章:

c - 尝试使用 C 中的 for 循环制作此星形输出

在本地临时目录中编译目标文件

c - 如果不使用 const,RAM 中不需要的分配,尽管放置在 Flash 绝对地址

stm32 - I2C 在内存读取时返回忙或错误

c - 段错误 :11 in my code for creating a linked list in C

c - 为什么memset在函数上的工作方式不同?

c - 在 gcc 4.2.1 上,指向二维数组的指针的大小为 8 的原因是什么?

c - 为什么使用 -lpthread 隐式声明 pthread_yield 而使用 -pthread 则一切正常?

STM32:从SRAM引导和获取向量表

c - 这个KNP字符串匹配算法有什么问题吗?