【发布时间】: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__ 这个问题是一个现实世界的专业问题,每天都会发生在人们身上,如果没有这些技能,像这样的人会被无限期地卡住,而不是几秒钟就能看到问题。让他们学习一些东西......我喜欢认为这个网站是关于教育以及让其他人修复你的错误。很抱歉你不同意。我们将继续同意在这个话题上存在分歧。