目前,我正试图为Atmel SAM R21开发自己的引导加载程序。我的想法是首先运行引导加载程序,因此它将决定是否需要执行更新,还是只需跳转到应用程序。主要问题是中断向量表位于0x0000_0000地址,因此需要在应用程序代码之前重新定位,因此,如果引导加载程序在链接器文件中设置了8KB空间,并以这种方式使用BOOTPROT保险丝(设置此保险丝,则假定通过fuse选择的内存量将受到某种保护),向量表应从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指令给我以下错误: ErrorOg006:内联程序集中的语法错误:"Error401:操作数语法错误“
我做错了什么?也许我试着用手臂指令而不是拇指指令?
如有任何建议,我将不胜感激。
我也怀疑一旦我得到中间向量表重新定位,我是否也计算初始MSP值?我想说的是,如果中断向量表在重新定位后从地址0x0000_2000开始,那么我应该计数4(字节)*中断,以便知道哪个应该是初始的应用程序地址,不是吗?如果有人知道这件事,那就太好了。我知道我很接近(或者我想是这样),但我需要澄清这些问题。
13:04编辑27/06/16。这条指令工作的是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
完成此操作后,函数原型应该作为普通函数包含到项目的.h文件中,使用如下所示:
void jump_to_app(void);
诚挚的问候,
伊万
发布于 2016-06-27 11:53:39
上面的程序集代码在语法上没有任何错误。如果您将程序集代码放入asm文件并对其进行组装,它将生成(至于它是否实现了我没有检查过的目标)。
由于某些原因,内联汇编程序不喜欢LDR Rd, =expr
。
请参阅帮助中的以下引用:
伪指令LDR Rd =expr不能从内联汇编程序中获得。
也来自ARM:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html
发布于 2016-06-28 07:36:42
解决办法:
作为对我问题的回答,有人发帖说并非所有的程序集指令都可以内联使用,所以我需要创建一个汇编程序文件,这个文件中的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
完成此操作后,函数原型应该作为普通函数包含到项目的.h文件中,使用如下所示:
void jump_to_app(void);
诚挚的问候,
伊万
https://stackoverflow.com/questions/38049143
复制相似问题