随着汽车智能化程度的提高,集成的ECU(Electronic Control Unit)数量不断增加,OTA(Over-the-Air)技术变得越来越普遍,它允许车辆通过无线网络接收软件更新,从而实现功能升级和性能改进,提高了便利性。
根据硬件的不同特性,OTA有对应的实现策略:[1]
如果硬件支持A/B Swap,对应的应用程序只需要链接一次就可以在两个不同的物理地址运行;
如果硬件不支持A/B Swap,对应的应用程序可以通过ROPI(Read-Only Position-Independent)的方式实现在不同的物理地址运行。
Renesas RH850系列MCU在汽车行业中广泛使用,IAR Embedded Workbench for Renesas RH850是一套完整的集成开发环境,符合ISO 26262功能安全标准,支持Renesas RH850的编译和调试。
本文主要介绍如何在IAR Embedded Workbench for Renesas RH850中实现ROPI。
01Renesas RH850 ROPI介绍
Renesas RH850 ROPI通过TP寄存器来实现,即对应代码和常量的访问不是通过绝对地址,而是通过基于TP的相对地址访问:


02在IAR Embedded Workbench for Renesas RH850中实现ROPI
在IAR Embedded Workbench for Renesas RH850中实现ROPI非常方便,只需要勾选对应的ROPI编译选项(General Options > Position-independence > Code and read-only data):

下面通过一个简单的例子介绍如何在IAR Embedded Workbench for Renesas RH850中实现ROPI。
假设对应Code Flash的地址区间是:0x00000000 ~ 0x001FFFFF (2MB)。其中Bootloader的地址区间是0x00000000 ~ 0x0001FFFF (128KB) ,而Application的地址区间分别为: 0x00020000 ~ 0x0010FFFF (960KB) 和0x00110000 ~ 0x001FFFFF (960KB) 。
Application链接的时候使用的地址区间0x00020000 ~ 0x0010FFFF:
define region ROM_1ST_region =mem:[from0x00020000to0x0010FFFF]; "RESET":place at addressmem:0x00020000 { block .reset };
map文件显示对应Application放到地址区间0x00020000 ~ 0x0010FFFF:


在Bootloader调试选项(Debugger > Images > Download extra image)中添加对应Application.out文件并配置对应的Offset (0x00110000 - 0x00020000 = 0x000F0000):

在Bootloader工程中下载调试来验证对应Application是否支持ROPI。
Bootloader跳转到Application的复位向量表地址0x00110000:


然后成功跳转到Application的入口函数__iar_program_start:

最后成功跳转到main函数,说明对应Application成功实现ROPI(因为Application链接到地址区间0x00020000 ~ 0x0010FFFF,同样可以在地址区间0x00110000 ~ 0x001FFFFF正常运行):

03注意事项
对应GP和TP寄存器通常来说会在启动代码里面初始化:


如果ROPI程序中有需要跳转到其他非ROPI程序中使用绝对地址运行的函数(比如对应函数运行在RAM的绝对地址),那么在ROPI程序中需要使用__absolute关键字声明对应函数:

调试ROPI程序的时候,如果ROPI程序实际运行地址区间跟ROPI程序链接的地址区间不一样的时候,需要配置对应的Offset(对应Offset的值是程序实际运行地址减去程序链接的地址)。另外Debug info only选项表示调试器只加载对应调试信息,而不下载对应程序。

如果使用Renesas Smart Configurator生成对应的工程,由于Renesas Smart Configurator生成的r_cg_intvector.c文件里面中断向量表的名字是INT_Vectors(而不是IAR默认的中断向量表的名字),所以需要修改对应的r_cg_intvector.c文件,IAR里面的启动文件cstartup.s和icf文件。
下面以RH850/F1KM-S2为例:
_cg_intvector.c文件:添加对应ROPI模式下的声明,把对应INT_Vector[]和INT_Vectors_Init[]分别放到EIINTTBL和EIINTTBL.init section当中:

cstartup.s:_interrupt_vector_table_core_1替换成_INT_Vectors, .table.interrupt_core_1.init替换成EIINTTBL.init:

icf文件:.table.interrupt_core_1替换成EIINTTBL,.table.interrupt_core_1.init替换成EIINTTBL.init:



04总结
本文主要以RH850/F1KM-S2为例介绍了如何在IAR Embedded Workbench for Renesas RH850中实现ROPI。
参考文献:
1.https://www.vector.com/us/en/products/application-areas/embedded-software/embedded-trends/ota-update-approaches/
2.RH850 User’s Manual: Software
3.IAR RH850 C/C++ Development Guide
4.IAR RH850 C-SPY Debugging Guide
-
mcu
+关注
关注
147文章
19128浏览量
403898 -
嵌入式
+关注
关注
5209文章
20656浏览量
337036 -
寄存器
+关注
关注
31文章
5619浏览量
130419 -
IAR
+关注
关注
5文章
415浏览量
38675
原文标题:在IAR Embedded Workbench for Renesas RH850中实现ROPI
文章出处:【微信号:IAR爱亚系统,微信公众号:IAR爱亚系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
瑞萨RH850P1M-C芯片或者RH850P系列谁用过,用什么配置软件啊?
TRACE32支持RH850系列
RH850多核嵌入式目标的基于多核模型的开发
IAR Systems开发工具3.10版IAR全面支持Renesas RH850
Renesas Flash Programmer V2.04 Flash memory programming software 用户手册 RH850, RX64x
Renesas Flash Programmer V2.04 Flash memory programming software 用户手册 RH850, RX64x
rh850与r7f7的关系 如何使用RH850系列MCU进行开发
在IAR Embedded Workbench for Renesas RH850中实现ROPI
评论