日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在IAR Embedded Workbench for Arm中實現ROPI

IAR愛亞系統(tǒng) ? 來源:IAR愛亞系統(tǒng) ? 2026-05-11 10:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

隨著汽車智能化程度的提高,集成的ECU(Electronic Control Unit)數量不斷增加,OTA(Over-the-Air)技術變得越來越普遍,它允許車輛通過無線網絡接收軟件更新,從而實現功能升級和性能改進,提高了便利性。

根據硬件的不同特性,OTA有對應的實現策略:[1]

如果硬件支持A/B Swap,對應的應用程序只需要鏈接一次就可以在兩個不同的物理地址運行;

如果硬件不支持A/B Swap,對應的應用程序可以通過ROPI(Read-Only Position-Independent)的方式實現在不同的物理地址運行。

基于ArmMCU在汽車行業(yè)中廣泛使用,IAR Embedded Workbench for Arm是一套完整的集成開發(fā)環(huán)境,符合ISO 26262功能安全標準,支持Arm的編譯和調試。本文主要以Arm Cortex-M為例介紹如何在IAR Embedded Workbench for Arm中實現ROPI。

01Arm ROPI介紹

Arm ROPI并沒有特別的寄存器來實現,而是通過基于PC的相對地址訪問代碼和只讀數據:

70013970-492b-11f1-90a1-92fbcf53809c.png

02在IAR Embedded Workbench for Arm中實現ROPI

在IAR Embedded Workbench for Arm中實現ROPI非常方便,勾選對應的ROPI編譯選項(C/C++ Compiler > Code > Position-independence > Code and read-only data (ropi)):

705fcae4-492b-11f1-90a1-92fbcf53809c.png

下面通過一個簡單的例子介紹如何在IAR Embedded Workbench for Arm中實現ROPI。

假設對應Code Flash的地址區(qū)間是:0x00000000 ~ 0x0007FFFF (512KB)。其中Bootloader的地址區(qū)間是0x00000000 ~ 0x00007FFF (32KB) ,而Application的地址區(qū)間分別為: 0x00008000 ~ 0x00043FFF (240KB) 和0x00044000 ~ 0x0007FFFF (240KB) 。

Application鏈接的時候使用的地址區(qū)間0x00008000 ~ 0x00043FFF:

defineregion IROM_region = mem:[from 0x00008000 to 0x00043fff];
placein IROM_region {readonly};
placeat address mem: 0x00008000 {readonlysection .intvec };

map文件顯示對應Application放到地址區(qū)間0x00008000 ~ 0x00043FFF:

70b8ce8c-492b-11f1-90a1-92fbcf53809c.png

711a23bc-492b-11f1-90a1-92fbcf53809c.png

71745058-492b-11f1-90a1-92fbcf53809c.png

由于Arm Cortex-M向量表包含的是MSP初始值和對應異常服務函數的地址:

71cd1c9c-492b-11f1-90a1-92fbcf53809c.png

對應異常服務函數的地址是一個絕對地址,為了讓向量表支持ROPI,需要對向量表做對應的處理,其中最簡單的方法就是把向量表放到RAM區(qū)域:

SECTIONCSTACKNOROOT(3)
SECTION .intvecROOT(2)
EXTERN __iar_program_start
EXTERN SystemInit
EXTERN main
PUBLIC __vector_table
DATA
__vector_table
DCDsfe(CSTACK)
…
; Relocate VectorTabletoRAM
SECTION.intvec_ramNOROOT(2)
PUBLIC __vector_table_ram
DATA
__vector_table_ram
DCDsfe(CSTACK)

在icf文件中把向量表放到RAM指定位置:

place ataddressmem:0x1fff8000 {section.intvec_ram};

然后Bootloader在跳轉到Application之前需要根據Application實際運行的地址修改對應的向量表:

/* Copy vector table from ROM to RAM and add corresponding offset for ROPI !!!*/
#pragmasection =".intvec"
staticvoidCopyVectorTable(void)
{
constuint32_tu32NrOfVectors = (uint32_t) __section_size(".intvec") /4U;
uint32_t*constpu32RamTable = (uint32_t*) (0x1FFF8000U);
uint32_t*constpu32RomTable = (uint32_t*) (0x00044000U);
/* The 1st element is MSP which does not add offset for ROPI !!! */
pu32RamTable[0] = pu32RomTable[0];
/* Following elements need add corresponding offset for ROPI !!! */
for(uint32_tu32Index =1U; u32Index < u32NrOfVectors; u32Index++)
?{
? pu32RamTable[u32Index] = pu32RomTable[u32Index] +?0x0003C000U;
?}
}

下面啟動代碼里面的Reset_Handler實現不支持ROPI:

THUMB
PUBWEAK Reset_Handler
SECTION.textREORDER:NOROOT(2)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0

需要將對應向量表中的Reset_Handler改成main函數:

SECTIONCSTACKNOROOT(3)
SECTION .intvecROOT(2)
EXTERN __iar_program_start
EXTERN SystemInit
EXTERN main
PUBLIC __vector_table
DATA
__vector_table
DCDsfe(CSTACK)
DCD main ;main
…
; Relocate VectorTabletoRAM
SECTION.intvec_ramNOROOT(2)
PUBLIC __vector_table_ram
DATA
__vector_table_ram
DCDsfe(CSTACK)
DCD main ;main
…
同時在main函數里面調用SystemInit和__iar_data_init3函數:
void__iar_data_init3(void);
intmain(void)
{
SystemInit();
__iar_data_init3();
…
對應program entry配置為main函數:

722839f6-492b-11f1-90a1-92fbcf53809c.png

在Bootloader工程中下載調試來驗證對應Application是否支持ROPI。

在Bootloader調試選項(Debugger > Images > Download extra image)中添加對應Application.out文件并配置對應的Offset (0x00044000 - 0x00008000 = 0x0003C000):

728719da-492b-11f1-90a1-92fbcf53809c.png

Bootloader在跳轉到Application之前根據Application實際運行的地址修改對應的向量表 (對應向量表包含的地址需要是Application實際運行的地址):

72e2ae3a-492b-11f1-90a1-92fbcf53809c.png

然后Bootloader跳轉到向量表中指定的Application的入口 (main函數):

7344a694-492b-11f1-90a1-92fbcf53809c.png

Application中的異常服務函數可以正常運行:

73a11da2-492b-11f1-90a1-92fbcf53809c.png

說明對應Application成功實現ROPI(因為Application鏈接到地址區(qū)間0x00008000 ~ 0x00043FFF,同樣可以在地址區(qū)間0x00044000 ~ 0x0007FFFF正常運行)。

03

注意事項

當前IAR Embedded Workbench for Arm中ROPI實現有如下相關限制:

74002fea-492b-11f1-90a1-92fbcf53809c.png

如果ROPI程序中有需要跳轉到其他非ROPI程序中使用絕對地址運行的函數(比如對應函數運行在RAM的絕對地址),那么在ROPI程序中需要使用__absolute關鍵字聲明對應函數:

745b7d14-492b-11f1-90a1-92fbcf53809c.png

調試ROPI程序的時候,如果ROPI程序實際運行地址區(qū)間跟ROPI程序鏈接的地址區(qū)間不一樣的時候,需要配置對應的Offset(對應Offset的值是程序實際運行地址減去程序鏈接的地址)。另外Debug info only選項表示調試器只加載對應調試信息,而不下載對應程序:

74b51ac2-492b-11f1-90a1-92fbcf53809c.png

05總結

本文主要以Arm Cortex-M為例介紹了如何在IAR Embedded Workbench for Arm中實現ROPI,更多關于在IAR Embedded Workbench for Arm中實現ROPI的信息,歡迎聯系IAR中國。

參考文獻:

1. https://www.vector.com/us/en/products/application-areas/embedded-software/embedded-trends/ota-update-approaches/

2. IAR Embedded Workbench for Arm C/C++ Development Guide

3. Arm Cortex-M4 Devices Generic User Guide

4. NXP AN5163 Load Position-Independent Code (PIC) on a Kinetis Platform Using the IAR EWARM Compiler

5. https://mypages.iar.com/s/article/Execute-in-RAM-after-copying-from-Flash-or-ROM?language=en_US

6. https://www.iar.com/knowledge/webinars-and-events/all-you-need-to-know-about-position-independent-code-and-data

7. https://mypages.iar.com/s/article/Position-independent-code-and-data-ROPI-and-RWPI

8. IAR Embedded Workbench for Arm C-SPY Debugging Guide

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    147

    文章

    19180

    瀏覽量

    404995
  • ARM
    ARM
    +關注

    關注

    135

    文章

    9602

    瀏覽量

    393965
  • IAR
    IAR
    +關注

    關注

    5

    文章

    418

    瀏覽量

    38693

原文標題:在IAR Embedded Workbench for Arm中實現ROPI

文章出處:【微信號:IAR愛亞系統(tǒng),微信公眾號:IAR愛亞系統(tǒng)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    IAR Embedded Workbench中進行ARM+RISC-V多核調試

    在之前的文章,我們介紹了如何在IAR Embedded Workbench for Arm中進
    發(fā)表于 06-13 17:38 ?2072次閱讀
    在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>中進行<b class='flag-5'>ARM</b>+RISC-V多核調試

    何在IAR Embedded Workbench配置生成對應代碼區(qū)域的CRC校驗碼

    在“使用IAR Embedded Workbench和MCU的CRC模塊來檢查代碼的完整性”一文,介紹了如何在
    的頭像 發(fā)表于 10-27 11:49 ?3365次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b><b class='flag-5'>中</b>配置生成對應代碼區(qū)域的CRC校驗碼

    IAR Embedded Workbench中計算多個地址區(qū)間的Checksum

    在前面的文章“使用IAR Embedded Workbench和MCU的CRC模塊來檢查代碼的完整性”中介紹了如何在IAR
    的頭像 發(fā)表于 01-05 12:33 ?2942次閱讀
    在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>中計算多個地址區(qū)間的Checksum

    請問如何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境啟用可配置數據閃存并設置大???

    何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境啟用可配置數據閃
    發(fā)表于 08-20 06:23

    何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境啟用可配置數據閃存并設置大小?

    何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境啟用可配置數據閃
    發(fā)表于 08-26 07:49

    IAR Embedded Workbench中進行ARM+RISC-V多核調試

    在之前的文章,我們介紹了如何在IAR Embedded Workbench for Arm中進
    發(fā)表于 06-14 16:55

    IAR Systems發(fā)布 IAR Embedded Wor

    IAR Systems發(fā)布 IAR Embedded Workbench for ARM新版本  IA
    發(fā)表于 02-11 09:14 ?1698次閱讀

    AVR IAR Embedded Workbench IDE用戶手冊

    嵌入式IAR Embedded Workbench是一個非常有效的集成開發(fā)環(huán)境(IDE),它使用戶充分有效地開發(fā)并管理嵌入式應用工程。作為一個開發(fā)平臺,它具備任何在用戶每天的工作地方所
    發(fā)表于 04-19 20:38 ?339次下載

    IAR_embedded_Workbench用戶指南介紹

    IAR embedded Workbench for ARMIAR Systems 公司為 ARM
    發(fā)表于 11-09 18:08 ?90次下載

    Embedded Workbench for ARM training

    Embedded Workbench for ARM training
    發(fā)表于 10-27 09:38 ?10次下載
    <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b> for <b class='flag-5'>ARM</b> training

    IAR Embedded Workbench?集成開發(fā)環(huán)境已全面支持航順芯片HK32MCU系列

    IAR Systems?日前宣布:其最新發(fā)布的IAR Embedded Workbench for Arm? version 9.20已全面
    發(fā)表于 12-23 14:08 ?2262次閱讀

    YRDKRX62N 快速入門指南(IAR Embedded Workbench)

    YRDKRX62N 快速入門指南 (IAR Embedded Workbench)
    發(fā)表于 04-12 19:14 ?0次下載
    YRDKRX62N 快速入門指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)

    YRDKRX62N 快速入門指南(IAR Embedded Workbench)

    YRDKRX62N 快速入門指南 (IAR Embedded Workbench)
    發(fā)表于 08-04 18:30 ?1次下載
    YRDKRX62N 快速入門指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)

    IAR推出新版IAR Embedded Workbench for Arm功能安全版

    瑞典烏普薩拉,2024年2月20日 – 全球領先的嵌入式系統(tǒng)開發(fā)軟件解決方案供應商IAR宣布:推出其旗艦產品IAREmbedded Workbench for Arm功能安全版的最新版本9.50.3。
    的頭像 發(fā)表于 02-21 13:47 ?1852次閱讀

    IAR推出新版IAR Embedded Workbench for Arm功能安全版

    全球知名的嵌入式系統(tǒng)開發(fā)軟件解決方案供應商IAR Systems近日宣布,其旗艦產品IAR Embedded Workbench for Arm
    的頭像 發(fā)表于 02-22 17:29 ?2600次閱讀
    宜丰县| 贵阳市| 新河县| 梁平县| 闻喜县| 永寿县| 交城县| 兴仁县| 南宫市| 扶余县| 富阳市| 奉节县| 陆良县| 湖北省| 曲阜市| 天峨县| 菏泽市| 喀喇沁旗| 太谷县| 彭泽县| 丽江市| 丽水市| 宁晋县| 衡阳县| 安塞县| 徐闻县| 宝鸡市| 大石桥市| 会理县| 长春市| 永泰县| 临沂市| 视频| 东辽县| 万荣县| 肇州县| 凤山市| 施秉县| 东丰县| 横山县| 夏津县|