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

调用任何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

为了学习更多关于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/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。