为了学习更多关于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>芯片在退出时会引发硬故障。
下面是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>我想我遗漏了一些很明显的东西,但我看不到。任何帮助或指针都会得到重视。
发布于 2020-05-01 02:36:05
这些评论表明,这个问题可能会在此期间得到解决。此答案收集了有用评论的摘要,以便对问题有一个简短的回答:
Idea (old_timer):
基于一些线索我猜你是在Cortex-M上运行的,它不能运行ARM指令,只能运行thumb指令,哪些thumb指令取决于芯片和内核。
这是什么芯片/核心?
OP (user13424266):
感谢大家的帮助,并为我指明了正确的方向。我给GCC添加了
-mthumb -mthumb-interwork,现在它就像预期的那样工作了!
确认(Martin Rosenau):
@fuz我刚刚试过了: GNU链接器不能用
blx代替bl。但是,STM32 CPU通常有Cortex-M内核,它既不支持非thumb代码,也不支持blx指令。
https://stackoverflow.com/questions/61477921
复制相似问题