我想使用 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_v5\ARM\ARMCC\Bin'
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_439xx\STM32F429_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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句