我在一个硬故障处理程序中有一些汇编。程序集基本上是将当前堆栈指针作为参数传递(在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);有什么建议吗?
发布于 2012-10-07 22:26:55
即使调用正确,您的代码也不会工作。
bl _SavePC
bx lr您认为bx lr指令中LR寄存器中的值是什么?指令本身的地址!是bl指令把它放在那里的。这实际上是一个带有bx指令的while (1);。
嵌套函数调用看起来更像这样:
push lr
bl _SavePC
pop pc要获得堆栈寄存器,可以使用相应的CMSIS函数:
进程堆栈指针(PSP)的主堆栈指针(MSP)
__get_PSP()的__get_MSP()发布于 2012-10-12 03:53:28
使用extern是一个坏习惯,因为它很容易出错。C-99标准为外部环境提供了一种安全的选择。您应该在头文件中编写函数原型,而不使用外部关键字。然后在两个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");
.
.
.
}https://stackoverflow.com/questions/12752289
复制相似问题