调用任何C函数时出现STM32硬故障
为了学习更多关于ARM芯片的知识,在成功使用汇编语言blinky之后,我现在想混合使用C和汇编函数。但是,我调用的任何C函数都会导致硬故障。我想我遗漏了一些明显的东西 我使用gcc和这些标志进行编译调用任何C函数时出现STM32硬故障,c,assembly,embedded,stm32,C,Assembly,Embedded,Stm32,为了学习更多关于ARM芯片的知识,在成功使用汇编语言blinky之后,我现在想混合使用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
-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>
80004d4:d3fb bcc.n 80004ce
80004d6:f7ff ff09 bl 80002ec
当超过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:
80002ec:e52db004推送{fp};(str fp,[sp,#-4]!)
80002f0:e28db000添加fp,sp,#0,0
80002f4:e59f3014 ldr r3,[pc,#20];8000310
80002f8:e3a02302 mov r2,#134217728;0x8000000
80002fc:e5832008 str r2[r3,#8]
8000300:e1a00000 nop;(mov r0,r0)
与080002ec不同,我的最终目标是:
08000298 <HardFault_Handler>
08000298
我想我遗漏了一些很明显的东西,但我看不到。任何帮助或指点都将受到感谢 这些评论表明,这个问题可以同时得到解决。此答案收集了有用评论的摘要,以便对问题做出简短回答:
想法(老一套):
根据一些线索我猜你是在Cortex-M上跑步,
不能运行ARM指令,只能运行thumb指令,
哪些指令取决于芯片和内核
这是什么芯片/核心
OP(用户13424266):
谢谢大家的帮助,给我指明了正确的方向。我在GCC中添加了
-mthumb-mthumb interwork
,现在它可以正常工作了
确认书(Martin Rosenau):
@fuz我刚刚试过:GNU链接器并没有用blx
替换bl
。
然而,STM32 CPU通常具有Cortex-M内核,两者都不支持
非拇指代码或blx
指令
如果调用ARM(即非拇指)函数,是否应该将其组装为blx?我想知道这是否是缺乏相互交流的问题。请做一个测试,这样我可以调试这个,并试图找到一个解决方案?我认为这只是一个简单的错误配置在您的项目。你使用makefile吗?如果是,请分享。作为业余爱好者,我建议您使用像STM32cubeIDE这样的IDE。然后,如果你能启动你的代码,你就可以通过尝试自己配置来删除IDE。@P_u_uj_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_,你可以试着帮忙,因为是那些人让你觉得这些知识和工具对你来说是不必要的。谢谢大家的帮助,为我指明了正确的方向。我在GCC中添加了-mthumb-mthumb互通,现在它可以作为expected@P__J__这个问题是一个现实世界中的专业问题,每天都会发生在人们身上,没有这些技能,像这样的人会被无限期地卡住,而不是几秒钟就能看到问题。让他们学习一些东西…我喜欢认为这个网站是关于教育的,也只是让别人修复你的错误。很抱歉你不同意。我们将继续同意在这个问题上存在分歧。我认为实际最好的GCC选项应该是
-mcpu=cortex-m3
或CPU实际是什么。不需要Thumb交互,因为它不能在ARM模式下运行,只有Thumb。