2012-10-05 35 views
0

我在硬故障处理程序中有一些程序集。程序集基本上是为了传递当前堆栈指针作为参数(在R0中)。它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?

__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原型的头文件...

extern void SavePC(unsigned long); 

建议?

+0

你具备的功能** SavePC **在文件中定义为extern这个asm代码驻留? –

+0

@ maths-help-seeker我包含SavePC的头文件,它的原型定义为extern - 'extern void SavePC(unsigned long);'。好? – Jason

+0

是的。我正在通过汇编程序的手册。它使用EXTERN <函数名>。你能否检查一下,而不是导入? –

回答

1

即使通过正确的呼叫,您的代码也不会工作。

bl _SavePC 
bx lr 

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

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

push lr 
bl _SavePC 
pop pc 

获取堆栈注册一个使用相应的CMSIS功能:

  • __get_MSP()的主堆栈指针(MSP)
  • __get_PSP()工艺堆栈指针(PSP)
1

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

例子:

文件:custom_header.h

void SavePC(unsigned long); 

文件:source_c_file.c

#include "custom_header.h" 

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

     .... 

} 

文件:user_c_file.c

#include "custom_header.h" 

void someFunction(void) 
{ 
. 
. 
. 

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

. 
. 
. 
} 
相关问题