在IAR Embedded Workbench for Renesas RH850中实现ROPI

随着汽车智能化程度的提高,集成的ECU(Electronic Control Unit)数量不断增加,OTA(Over-the-Air)技术变得越来越普遍,它允许车辆通过无线网络接收软件更新,从而实现功能升级和性能改进,提高了便利性。根据硬件的不同特性,OTA有对应的实现策略:
如果硬件支持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。

01.Renesas RH850 ROPI介绍
Renesas RH850 ROPI通过TP寄存器来实现,即对应代码和常量的访问不是通过绝对地址,而是通过基于TP的相对地址访问:
03139a72cf8c920ffb96a0084279e946
75476f4d32bddd4fbdc9bbded6bdd6a7

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):
001e9c020d15c709cbee2d7be5baf6f8
下面通过一个简单的例子介绍如何在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:[from 0x00020000 to 0x0010FFFF]; "RESET":place at address mem:0x00020000 { block .reset };
map文件显示对应Application放到地址区间0x00020000 ~ 0x0010FFFF:
5f3cd229088f2fd3be363c7c092b2002
cc8f69648384f6429aaedeb928892d2a
在Bootloader调试选项(Debugger > Images > Download extra image)中添加对应Application.out文件并配置对应的Offset (0x00110000 - 0x00020000 = 0x000F0000):
12bc01b9ead43e061e3b16c1de5fbc8f
在Bootloader工程中下载调试来验证对应Application是否支持ROPI。
Bootloader跳转到Application的复位向量表地址0x00110000:
ce5b59e899c22dc98b923722d5664d5d
80fbf7b468006a167a01750744668e14
然后成功跳转到Application的入口函数__iar_program_start:
d903f6e2de89e221cf8d2da02350b0d6
最后成功跳转到main函数,说明对应Application成功实现ROPI(因为Application链接到地址区间0x00020000 ~ 0x0010FFFF,同样可以在地址区间0x00110000 ~ 0x001FFFFF正常运行):
53ac3995339c77d19786a2fc274b411b

03.注意事项
对应GP和TP寄存器通常来说会在启动代码里面初始化:
a79d367634482cad46baaa0242439b07
5ce5f0e714e5d7ef12ddd959917bafc5
如果ROPI程序中有需要跳转到其他非ROPI程序中使用绝对地址运行的函数(比如对应函数运行在RAM的绝对地址),那么在ROPI程序中需要使用__absolute关键字声明对应函数:
42c7706fc90b0bb34659d5a812f6b29f
调试ROPI程序的时候,如果ROPI程序实际运行地址区间跟ROPI程序链接的地址区间不一样的时候,需要配置对应的Offset(对应Offset的值是程序实际运行地址减去程序链接的地址)。另外Debug info only选项表示调试器只加载对应调试信息,而不下载对应程序。
3836c0b90b924a7ac88f3dfc23eae6e6
如果使用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当中:
5cd7e7f3461a7e9b0fccf5fafa1e84d8
cstartup.s:_interrupt_vector_table_core_1替换成_INT_Vectors, .table.interrupt_core_1.init替换成EIINTTBL.init:
71bd09f23ab8553ac9540258a9a83551
icf文件:.table.interrupt_core_1替换成EIINTTBL,.table.interrupt_core_1.init替换成EIINTTBL.init:
b963613f74f66ba8f0dec2b4c0927349
f782066d32aaf1d00001e1b2a8824efd
58641ec4dd2c3b064e5a8cc428884238

04.总结
本文主要以RH850/F1KM-S2为例介绍了如何在IAR Embedded Workbench for Renesas RH850中实现ROPI。

posted @ 2026-01-07 18:07  IAR爱亚系统  阅读(7)  评论(0)    收藏  举报