我想用STM32F在uVision中进行简单的内联组装实验,如下代码所示。
但我在编译错误消息时遇到了一些问题。
unsigned int bar(unsigned int r0)
{
unsigned int r1;
unsigned int r4 = 1234;
__asm
{
MOVS r0,#0
LDR r1,[r0] ; Get initial MSP value
MOV SP, r1
LDR r1,[r0, #4] ; Get initial PC value
BX r1
}
return(r1);
}
当我把它编译成下面的样子时,我得到了下面的错误消息。
*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:Keil_v5ARMARMCCBin'
Build target 'STM32F429_439xx'
compiling main.c...
../main.c(79): error: #3061: unrecognized instruction opcode
LDR r1,[r0] ; Get initial MSP value
../main.c(80): error: #20: identifier "SP" is undefined
MOV SP, r1
../main.c(81): error: #3061: unrecognized instruction opcode
LDR r1,[r0, #4] ; Get initial PC value
../main.c(82): error: #1084: This instruction not permitted in inline assembler
BX r1
../main.c(71): warning: #177-D: variable "r4" was declared but never referenced
unsigned int r4 = 1234;
../main.c(82): error: #114: label "r1" was referenced but not defined
BX r1
../main.c: 1 warning, 5 errors
"STM32F429_439xxSTM32F429_439xx.axf" - 5 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed: 00:00:01
我该怎么办才能解决这个问题?
我有一种恼人的感觉,你在这里试图做的事情并不完整,所以进行软重置可能会更好。然而
http://www.keil.com/support/man/docs/armcc/armcc_chr1359124249383.htm
内联汇编程序不提供对物理ARM处理器的寄存器。如果ARM寄存器名称用作内联汇编指令中的操作数它成为对相同名称的变量,而不是物理ARM寄存器。
。。。
没有为sp(r13)、lr(r14)和pc(r15)声明变量寄存器,并且它们不能在内联中读取或直接修改汇编代码。
但是,CMSIS提供以下功能:https://www.keil.com/pack/doc/CMSIS/Core/html/group__Core__Register__gr.html#gab898559392ba027814e5bbb5a98b38d2
__STATIC_INLINE uint32_t __get_MSP(void)
{
register uint32_t __regMainStackPointer __ASM("msp");
return(__regMainStackPointer);
}