gpt4 book ai didi

c - 如何从 IAR EWARM 中的内联汇编器调用另一个模块中的 C 函数?

转载 作者:行者123 更新时间:2023-11-30 14:23:37 25 4
gpt4 key购买 nike

我在硬故障处理程序中进行了一些组装。该程序集基本上意味着将当前堆栈指针作为参数传递(在 R0 中)。看起来是这样的...

__asm("    mov     r0, sp\n"
" bl SavePC\n"
" bx lr");

当 SavePC 位于同一个 c 文件中时,这可以正常工作。然而,当 SavePC 被放置在另一个 c 文件中时,我就没那么幸运了。我尝试像这样导入函数...

__asm("IMPORT SavePC\n"
" mov r0, sp\n"
" bl SavePC\n"
" bx lr");

...但我一定做错了什么。编译器报告以下内容...

Error[Og005]: Unknown symbol in inline assembly: "IMPORT" 
Error[Og005]: Unknown symbol in inline assembly: "SavePC"
Error[Og006]: Syntax error in inline assembly: "Error[54]: Expression can not be forward"
Error[Og005]: Unknown symbol in inline assembly: "SavePC"
Error while running C/C++ Compiler

带有程序集的 c 文件包含带有 SavePC 原型(prototype)的头文件...

extern void SavePC(unsigned long);

建议?

最佳答案

即使调用正确,您的代码也无法运行。

bl _SavePC
bx lr

您认为 bx lr 指令中的 LR 寄存器中的值会是多少?指令本身的地址! bl 指令已将其放在那里。这实际上是一个带有 bx 指令的 while (1);

嵌套函数调用看起来更像是这样:

push lr
bl _SavePC
pop pc

要获取堆栈寄存器,请使用相应的 CMSIS 函数:

  • __get_MSP() 用于主堆栈指针 (MSP)
  • __get_PSP() 用于进程堆栈指针 (PSP)

关于c - 如何从 IAR EWARM 中的内联汇编器调用另一个模块中的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com