调用任何 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 硬故障的主要内容,如果未能解决你的问题,请参考以下文章