我目前正在尝试为Atmel SAM R21开发自己的引导加载程序。 我的想法是首先运行引导加载程序,因此它将决定是否需要执行更新或只是跳转到应用程序。主要问题是中断向量表位于0x0000_0000地址,因此需要在应用程序代码之前重新定位,因此如果引导加载程序在链接器文件中设置了8KB空间并以这种方式使用BOOTPROT保险丝(设置该保险丝时,假设通过保险丝选择的存储量有一些保护,向量表应从0x0000_2000地址开始。 为了重新定位向量表,我假装使用VTOR寄存器,该寄存器是应用于原始表地址(0x0000_0000)的偏移量。 汇编代码如下:
asm(" LDR R0,=0xE000ED08 "); //VTOR ADDRESS
asm("LDR R1,=0x00002000"); //OFFSET
asm(" STR R1, [R0]");
asm(" LDR R0,[R1] ");
asm(" MOV SP, R0");
asm(" LDR R0,[R1, #4]");
asm(" BX R0");
LDR指令给出了以下错误: 错误[Og006]:内联汇编中的语法错误:“错误[401]:操作数语法错误”
我做错了什么?也许我正在尝试使用ARM指令而不是Thumb指令?
我将非常感谢任何建议。
我也怀疑如果我将中断向量表重新定位,我是否应该使用初始MSP值?我想说,如果中断向量表在重新定位后从地址0x0000_2000开始,我应该计算4(字节)*中断,以便知道哪个应该是初始应用程序地址,不应该吗?如果有人知道这件事,那就太好了。我知道我很接近(或者我是这么认为),但我需要澄清这些观点。
编辑于2016年6月27日13:04。 该指令适用于LDR R0,[R1] 所以我想这是将32位地址接收到寄存器中的相关内容,但我不明白为什么会抱怨这个。
解决方案:
作为我的问题的答案,有人发布并非所有的汇编指令都可以使用内联,所以我需要创建一个汇编程序文件my_file.s 在这个文件中应该创建一个从外部调用的函数,如下所示:
#define _PORT_ASM_ARM_SRC
#define __ASSEMBLY__
;/****************************************************************************
;** **
;** ASSEMBLY FUNCTIONS **
;** **
;****************************************************************************/
NAME start_app
RSEG CODE:CODE(2)
THUMB
PUBLIC jump_to_app
;/***************************************************************************/
;/***************************************************************************/
;/* jump_to_app()
; * Jump to application function.
; */
jump_to_app:
LDR R0,=0xE000ED08 ; Set R0 to VTOR address
LDR R1,=0x00010000 ; User’s flash memory based address
STR R1, [R0] ; Define beginning of user’s flash memory as vector table
LDR R0,[R1] ; Load initial MSP value
MOV SP, R0 ; Set SP value (assume MSP is selected)
LDR R0,[R1, #4] ; Load reset vector
BX R0 ; Branch to reset handler in user’s flash
END
执行此操作后,函数prototipe应作为普通函数包含在项目的.h文件中,使用以下内容:
void jump_to_app(void);
致以最诚挚的问候,
伊万。
答案 0 :(得分:3)
上面的汇编代码没有语法错误。如果您将汇编代码放入asm文件并进行汇编,它将构建(关于它是否完成了您的预期,我没有检查过。)
由于某种原因,内联汇编程序不喜欢LDR Rd, =expr
。
请参阅IAR Embedded Workbench帮助中的以下引用:
伪指令LDR Rd,= expr不能从内联汇编程序
获得
同样来自ARM:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html
答案 1 :(得分:1)
解决方案:
作为我的问题的答案,有人发布并非所有的汇编指令都可以使用内联,所以我需要创建一个汇编程序文件my_file.s在这个文件中应该创建一个从外部调用的函数,比如这样:
#define _PORT_ASM_ARM_SRC
#define __ASSEMBLY__
;/****************************************************************************
;** **
;** ASSEMBLY FUNCTIONS **
;** **
;****************************************************************************/
NAME start_app
RSEG CODE:CODE(2)
THUMB
PUBLIC jump_to_app
;/***************************************************************************/
;/***************************************************************************/
;/* jump_to_app()
; * Jump to application function.
; */
jump_to_app:
LDR R0,=0xE000ED08 ; Set R0 to VTOR address
LDR R1,=0x00010000 ; User’s flash memory based address
STR R1, [R0] ; Define beginning of user’s flash memory as vector table
LDR R0,[R1] ; Load initial MSP value
MOV SP, R0 ; Set SP value (assume MSP is selected)
LDR R0,[R1, #4] ; Load reset vector
BX R0 ; Branch to reset handler in user’s flash
END
执行此操作后,函数prototipe应作为普通函数包含在项目的.h文件中,使用以下内容:
void jump_to_app(void);
致以最诚挚的问候,
伊万。