首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从IAR EWARM的内联汇编程序中调用另一个模块中的C函数?

如何从IAR EWARM的内联汇编程序中调用另一个模块中的C函数?
EN

Stack Overflow用户
提问于 2012-10-06 02:48:20
回答 2查看 2.8K关注 0票数 0

我在一个硬故障处理程序中有一些汇编。程序集基本上是将当前堆栈指针作为参数传递(在R0中)。看起来是这样的..。

代码语言:javascript
复制
__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");

当SavePC在同一个c文件中时,这很好用。然而,当SavePC被放在另一个c文件中时,我就没那么幸运了。我试着像这样导入函数...

代码语言:javascript
复制
__asm("IMPORT SavePC\n"
" mov r0, sp\n"
" bl SavePC\n"
" bx lr");

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

代码语言:javascript
复制
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原型的头文件...

代码语言:javascript
复制
extern void SavePC(unsigned long);

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2012-10-07 22:26:55

即使调用正确,您的代码也不会工作。

代码语言:javascript
复制
bl _SavePC
bx lr

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

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

代码语言:javascript
复制
push lr
bl _SavePC
pop pc

要获得堆栈寄存器,可以使用相应的CMSIS函数:

进程堆栈指针(PSP)的主堆栈指针(MSP)

  • __get_PSP()
  • __get_MSP()
票数 1
EN

Stack Overflow用户

发布于 2012-10-12 03:53:28

使用extern是一个坏习惯,因为它很容易出错。C-99标准为外部环境提供了一种安全的选择。您应该在头文件中编写函数原型,而不使用外部关键字。然后在两个C文件中都包含头文件。然后,链接器负责链接不同文件中的函数。

示例:

文件: custom_header.h

代码语言:javascript
复制
void SavePC(unsigned long);

文件: source_c_file.c

代码语言:javascript
复制
#include "custom_header.h"

void SavePC(unsigned long)
{
      ....
      ....

      ....

}

文件: user_c_file.c

代码语言:javascript
复制
#include "custom_header.h"

void someFunction(void)
{
.
.
.

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

.
.
.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12752289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档