引导加载程序。ARM CORTEX M0 +重定位中断表程序集错误

Fulgor3

我目前正在尝试为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指令?

我将不胜感激任何建议。

我还怀疑是否一旦重新定位了Interrup向量表,是否也应该使用初始MSP值进行计数?我的意思是,如果中断向量表在重定位后从地址0x0000_2000开始,我应该计数4(bytes)*中断以便知道哪个应该是初始应用程序地址,不是吗?如果有人对此有所了解,那就太好了。我知道我已经接近(或者我认为是),但是我需要澄清这些观点。

编辑于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文件中并进行汇编,它将生成(关于它是否达到了我未检查的目的)。

由于某些原因,内联汇编器不喜欢LDR Rd, =expr

请参阅IAR Embedded Workbench帮助中的以下报价:

内联汇编器不提供伪指令LDR Rd = expr

同样来自ARM:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ARM Cortex M0的程序等效项是什么?

检索ARM Cortex M0上异常的返回地址

了解ARM Cortex-M0 +重定位

C ++中的ARM Cortex-M中断处理程序

在Cortex M0 +上计数周期

Cortex M3从应用程序跳回到引导加载程序再回到应用程序

如何在没有计时器的情况下将ARM Cortex M0 +延迟n个周期?

如何通过Java驱动程序正确连接到Atlas M0(免费套餐)集群?

是否可以在M0 +上的运行时设置ISR处理程序

Barebox引导程序在cortex m4上可以工作吗?

带有Freertos的GNU Arm Cortex M4上的C ++异常处理程序

为什么在为 Cortex-M 中断处理程序生成的程序集中存在死循环?

使用JLink和GDB读取Cortex M0 MCU的外设寄存器

Cortex M0不支持CPSID i汇编指令

如何在Cortex-M设备上的同一GDB会话中调试引导程序和应用程序?

为LPC1769 Cortex M3编写GPIO中断处理程序

ARM Cortex-M 内存访问

从一开始就发生ARM中断(Cortex-M4)

了解 ARM Cortex-M 中断向量表定义的 C 语法

MongoDB M0集群,Python多线程

ARM Cortex M4 SVC_Handler“使用错误”

适用于ARM Cortex M Procssor的GNU科学库编译错误

如何为应用程序检查Cortex M3的SRAM使用情况

如何在Cortex M4中保存来自异常处理程序的调用堆栈?

Cortex-M硬件是否在线程模式或处理程序模式下堆叠了异常?

ARM Cortex-M3 PC 加载了无效地址?

这个简单的基于 ARM Cortex-M SysTick 的任务调度程序不起作用。我应该自己管理抢占吗?

从RAM初始状态启动ARM Cortex-M3

ARM Cortex M7未对齐的访问和内存