引导程序。 ARM CORTEX M0+ 重定位中断 Table 程序集错误
Bootloader. ARM CORTEX M0+ relocating Interrupt Table assembly ERROR
我目前正在尝试为 Atmel SAM R21 开发自己的引导加载程序。
我的想法是首先 运行 引导加载程序,因此它将决定是否需要执行更新或只是跳转到应用程序。主要问题是中断向量 Table 位于 0x0000_0000 地址,所以它需要在应用程序代码之前重新定位,所以如果引导加载程序有 8KB space 设置链接器文件并以这种方式使用 BOOTPROT 保险丝(设置此保险丝应该会对通过保险丝选择的内存量提供一些保护),向量 table 应该从 0x0000_2000 地址。
为了重新定位向量 table,我假装使用 VTOR 寄存器,这是一个应用于原始 table 地址 (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]:内联汇编语法错误:"Error[401]: Operand syntax error"
我做错了什么?也许我正在尝试使用 ARM 指令而不是 Thumb 指令?
我将不胜感激任何建议。
我也怀疑一旦我重新定位了中断向量 Table,我是否也应该计算初始 MSP 值?我想说的是,如果中断向量 table 在重定位后从地址 0x0000_2000 开始,我应该计算 4(bytes) * Interrupt 以便知道哪个应该是初始应用程序地址,不应该我?如果有人对此有所了解,那就太好了。我知道我很接近(或者我认为如此),但我需要澄清这些要点。
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
执行此操作后,函数原型应作为普通函数包含到项目的 .h 文件中,使用如下内容:
void jump_to_app(void);
此致,
伊万。
上面的汇编代码在语法上没有任何错误。如果您将汇编代码放入一个 asm 文件并 assemble 它,它将构建(至于它是否按照您的意图进行我还没有检查过)。
出于某种原因,内联 assembler 不喜欢 LDR Rd, =expr
。
请参阅 IAR Embedded Workbench 帮助中的以下引用:
The pseudo-instruction LDR Rd, =expr is not available from inline assembler
同样来自 ARM:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html
解决方案:
作为对我问题的回答,有人发帖说不是所有的汇编指令都可以内联使用,所以我需要创建一个汇编文件,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);
此致,
伊万.
我目前正在尝试为 Atmel SAM R21 开发自己的引导加载程序。 我的想法是首先 运行 引导加载程序,因此它将决定是否需要执行更新或只是跳转到应用程序。主要问题是中断向量 Table 位于 0x0000_0000 地址,所以它需要在应用程序代码之前重新定位,所以如果引导加载程序有 8KB space 设置链接器文件并以这种方式使用 BOOTPROT 保险丝(设置此保险丝应该会对通过保险丝选择的内存量提供一些保护),向量 table 应该从 0x0000_2000 地址。 为了重新定位向量 table,我假装使用 VTOR 寄存器,这是一个应用于原始 table 地址 (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]:内联汇编语法错误:"Error[401]: Operand syntax error"
我做错了什么?也许我正在尝试使用 ARM 指令而不是 Thumb 指令?
我将不胜感激任何建议。
我也怀疑一旦我重新定位了中断向量 Table,我是否也应该计算初始 MSP 值?我想说的是,如果中断向量 table 在重定位后从地址 0x0000_2000 开始,我应该计算 4(bytes) * Interrupt 以便知道哪个应该是初始应用程序地址,不应该我?如果有人对此有所了解,那就太好了。我知道我很接近(或者我认为如此),但我需要澄清这些要点。
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
执行此操作后,函数原型应作为普通函数包含到项目的 .h 文件中,使用如下内容:
void jump_to_app(void);
此致,
伊万。
上面的汇编代码在语法上没有任何错误。如果您将汇编代码放入一个 asm 文件并 assemble 它,它将构建(至于它是否按照您的意图进行我还没有检查过)。
出于某种原因,内联 assembler 不喜欢 LDR Rd, =expr
。
请参阅 IAR Embedded Workbench 帮助中的以下引用:
The pseudo-instruction LDR Rd, =expr is not available from inline assembler
同样来自 ARM:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html
解决方案:
作为对我问题的回答,有人发帖说不是所有的汇编指令都可以内联使用,所以我需要创建一个汇编文件,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);
此致,
伊万.