瑞萨RA MCU如何从指定地址开始调试代码(一)之e2 studio篇

cathy的头像
cathy 发布于:周二, 03/01/2022 - 12:23 ,关键词:

随着越来越多的设备要求支持OTA(Over The Air)代码升级,并行开发bootloader和application的需求也越来越多。这就要求在开发阶段,可以将application project地址进行偏移,跟最终的地址空间划分一致。

对于Arm芯片,要求起始地址0开始放置初始堆栈指针,复位向量表等必备内容,如下图所示(以RA2L1手册为例),所以如果0地址处为全FFh,则无法调试代码。

“”

为应对这种需求,可以在IDE中重新指定MCU运行所需的地址偏移(上图中的Initial stack pointer和Initial program counter)。本次以e2 studio为例进行说明。

linker script脚本文件进行修改(代码编写阶段)

首先需要将linker script脚本文件进行修改,以memory_regions.ld文件为例,FLASH_START是代码进行编译时,基础的偏移地址,默认为0,根据要求修改为application的目标偏移地址,如0x4000。重新编译工程,检查编译生成的srec文件或mot文件,确认文件起始地址为0x4000。

“”

“”

Debug Configuration的设置(代码调试阶段)

在Debug Configuration中,将如下的三行代码添加到Startup > Run Commands中。

set $sp = *0x4000

set $pc = *0x4004

set {int}0xe000ed08 = 0x00020000

“”

关于这3行代码,意义依次解释如下:

set $sp = *0x20000

由于代码起始地址处要求放置stack pointer地址,如下图所示,指向0x20000

“”

set $pc = *0x20004

此处是reset vector存放的地址

set {int}0xe000ed08 = 0x00020000

E000ED08h是Vector Table Offset Register的地址,是ARM核芯片通用的寄存器,可以在MCU对应的内核手册及相关文档中查找。

例如,Arm® Cortex®-M4在以下链接中有详细说明:

https://developer.arm.com/documentation/ddi0337/e/nested-vectored-interrupt-controller/nvic-programmer-s-model/nvic-register-descriptions

点击下图中的调试按钮,在新界面中确认如下内容,RESET向量位于0x4C45处,上电后代码停在0x4C44处。

“”

关于最后一个bit的差异,说明如下:

上电后CPU检查地址偏移为0x0004处的数据最低位,假如该位为1,则表明这是一个可用的thumb地址。之后会忽略该位(将其设定为0)并按照修改后的地址取首个指令作为复位句柄。更多细节请参考Arm处理器相关文档。

以上为e2 studio中的相关设定,在Keil MDK和IAR中也有类似的等效设定,会在下次连载中进行说明,敬请期待。

来源:瑞萨MCU小百科
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 783