首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >引导加载器。ARM皮质M0+重定位中断表装配误差

引导加载器。ARM皮质M0+重定位中断表装配误差
EN

Stack Overflow用户
提问于 2016-06-27 08:28:29
回答 2查看 1.8K关注 0票数 2

目前,我正试图为Atmel SAM R21开发自己的引导加载程序。我的想法是首先运行引导加载程序,因此它将决定是否需要执行更新,还是只需跳转到应用程序。主要问题是中断向量表位于0x0000_0000地址,因此需要在应用程序代码之前重新定位,因此,如果引导加载程序在链接器文件中设置了8KB空间,并以这种方式使用BOOTPROT保险丝(设置此保险丝,则假定通过fuse选择的内存量将受到某种保护),向量表应从0x0000_2000地址开始。为了重新定位向量表,我假装使用VTOR寄存器,它是应用于原始表地址(0x0000_0000)的偏移量。程序集代码如下:

代码语言:javascript
运行
复制
  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应该创建一个从外部调用的函数,如下所示:

代码语言:javascript
运行
复制
#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文件中,使用如下所示:

代码语言:javascript
运行
复制
void jump_to_app(void);

诚挚的问候,

伊万

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2016-06-28 07:36:42

解决办法:

作为对我问题的回答,有人发帖说并非所有的程序集指令都可以内联使用,所以我需要创建一个汇编程序文件,这个文件中的my_file.s应该创建一个从外部调用的函数,如下所示:

代码语言:javascript
运行
复制
#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文件中,使用如下所示:

代码语言:javascript
运行
复制
void jump_to_app(void);

诚挚的问候,

伊万

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38049143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档