0

我在硬故障处理程序中有一些组装。该程序集基本上是为了将当前堆栈指针作为参数传递(在 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 原型的头文件...

extern void SavePC(unsigned long);

建议?

4

2 回答 2

1

即使调用正确,您的代码也无法正常工作。

bl _SavePC
bx lr

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

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

push lr
bl _SavePC
pop pc

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

  • __get_MSP()用于主堆栈指针 (MSP)
  • __get_PSP()进程堆栈指针 (PSP)
于 2012-10-07T14:26:55.130 回答
1

使用 extern 是一个坏习惯,因为它容易出错。C-99 标准为外部提供了一种安全的替代方案。您应该在没有 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");

.
.
.
}
于 2012-10-11T19:53:28.140 回答