调用任何 C 函数时的 STM32 硬故障

Posted

技术标签:

【中文标题】调用任何 C 函数时的 STM32 硬故障【英文标题】:STM32 Hardfault when calling any C-function 【发布时间】:2020-08-12 03:10:05 【问题描述】:

尝试了解有关 ARM 芯片的更多信息,在成功使用汇编之后,我现在想混合 C 和汇编函数。但是,我调用的任何 C 函数都会导致硬故障。我想我错过了一些明显的东西。

我使用 gcc 和这些标志进行编译

-c -g -ggdb -Wall --specs=nosys.specs

我在链接时使用以下 libc.a libgcc.a 库

-L/usr/local/gnu-arm/arm-none-eabi/lib/thumb/v7e-m+fp/softfp -lc -L/usr/local/gnu-arm/lib/gcc/arm-none-eabi/9.2.1/thumb/v7e-m+fp/softfp

从 objdump 中,这是发生硬故障的地方:

 80004d4:   d3fb        bcc.n   80004ce <FillZerobss>
 80004d6:   f7ff ff09   bl  80002ec <SystemInit>

abobe bl 执行时芯片产生硬故障

这是 SystemInit 函数的第一行

080002ec <SystemInit>:
80002ec:    e52db004    push    fp        ; (str fp, [sp, #-4]!)
80002f0:    e28db000    add fp, sp, #0, 0
80002f4:    e59f3014    ldr r3, [pc, #20]   ; 8000310 <SystemInit+0x24>
80002f8:    e3a02302    mov r2, #134217728  ; 0x8000000
80002fc:    e5832008    str r2, [r3, #8]
8000300:    e1a00000    nop         ; (mov r0, r0)

我最终不是 080002ec,而是:

08000298 <HardFault_Handler>

我认为我遗漏了一些非常明显但看不到的东西。任何帮助或指针都会被应用。

【问题讨论】:

如果您调用 ARM(即非拇指)函数,这不应该组装成 blx 吗?我想知道这是否是缺乏拇指互通的问题。请发minimal reproducible example,以便我调试并尝试找到解决方案? 我认为这只是您项目中的一个简单错误配置。你使用 makefile 吗?如果是,请分享。作为业余爱好者,我个人建议您使用 STM32cubeIDE 之类的 IDE。然后,如果您可以启动您的代码,您将能够通过尝试自己配置来删除 IDE。 @P__J__ 为了让你的乌托邦存在,必须有人知道事情是如何运作的,不管是不是 21 世纪,你都可以尝试提供帮助,因为正是这些人让这些知识看起来像这些知识,而这些工具不是对/对你来说是必要的。 感谢大家的帮助,并为我指明了正确的方向。我将 -mthumb -mthumb-interwork 添加到 GCC,它现在可以按预期工作 @P__J__ 这个问题是一个现实世界的专业问题,每天都会发生在人们身上,如果没有这些技能,像这样的人会被无限期地卡住,而不是几秒钟就能看到问题。让他们学习一些东西......我喜欢认为这个网站是关于教育以及让其他人修复你的错误。很抱歉你不同意。我们将继续同意在这个话题上存在分歧。 【参考方案1】:

cmets 表明这个问题可以在此期间得到解决。这个答案收集了有用的 cmets 的摘要,以便对问题有一个简短的回答:

想法(old_timer):

根据一些线索,我猜你是在 Cortex-M 上运行, 不能运行ARM指令只有拇指指令, 哪些拇指指令取决于芯片和内核。

这是什么芯片/内核?

OP(用户 13424266):

感谢大家的帮助,并为我指明了正确的方向。我将-mthumb -mthumb-interwork 添加到 GCC,它现在可以正常工作了!

确认(马丁·罗森瑙):

@fuz 我刚刚试了一下:GNU 链接器不会用blx 替换bl。 但是,STM32 CPU 通常具有 Cortex-M 内核,它们都不支持 非拇指代码或blx 指令。

【讨论】:

我认为实际的最佳 GCC 选项将是 -mcpu=cortex-m3 或 CPU 实际是什么。不需要 Thumb 互通,因为它不能在 ARM 模式下运行, Thumb。

以上是关于调用任何 C 函数时的 STM32 硬故障的主要内容,如果未能解决你的问题,请参考以下文章

随机硬故障 - STM32F4 - FreeRTOS

Rtos 的 Stm32 硬故障异常

fmodf() 是不是会导致 stm32 出现硬故障?

STM32 尝试打印数字 >= 10 时出现硬故障

NUCLEO STM32F334R8 上的 STMCubeIDE,新项目:FreeRTOS 硬故障

STM32F030 启动时出现硬故障,__libc_init_array