0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞萨RA MCU如何将常量和函数放在Code Flash/ROM指定地址

瑞萨嵌入式小百科 来源:瑞萨嵌入式小百科 2026-06-01 09:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

嵌入式系统应用中,有时需要将常量或者函数放在代码闪存(Code Flash)的指定地址,以便后续的功能扩展或代码更新。

本文基于EK-RA4M2,详细介绍了如何在不同编译器环境下实现这一目标,涵盖GNU、LLVM、IAR和Arm Compiler6共四种编译器。

由于瑞萨电子RA系列开发基于FSP(Flexible Software Package),因此项目的构建均基于FSP生成的代码,对于第三方集成开发环境(IDE)像IAR EW for Arm和Keil MDK,则依赖RASC(RA Smart Configurator)创建项目。

对于所有支持的编译器来说,修改流程基本一致,主要包括以下步骤:

在链接脚本文件(Linker Script File)中添加新的自定义段(section),并指定地址范围(通常包括起始地址和大小)。由于FSP工程会在每次重新Generate Project Content时,重写相关的Linker Script File,因此需先备份原始文件,重命名后再进行修改。

使用特定关键字声明需要定位的函数/常量,将其放在新增section中。

在IDE中修改配置,使更新后的Linker Script File生效。

编译工程,通过生成的***.map文件确认相应标号已正确放置在目标地址。

假定目标是在RA4M2中Code Flash最高地址上新增两个section,一个用于存放函数,一个用于存放常量,由于高地址的Block Size为32K(8000h),因此两个section大小均设定为0x8000。

可以根据自己的实际需求调整,但一定考虑到改写内容时,最小的Erase/Program单元都是Block Size。

一、GNU编译器

首先,我们介绍在e2studio中使用GNU编译器时的操作步骤。

在e2studio中找到以下3个文件,在原始路径下复制并重命名:

scriptfsp.ld→scriptfsp_new.ld

Debugmemory_regions.ld→Debugmemory_regions_new.ld

Debugfsp_gen.ld→Debugfsp_gen_new.ld

第一步,编辑Debugmemory_regions_new.ld,文件开头增加以下内容,对标号赋值:

FLASH_USER_DATA_LENGTH=0x8000;

FLASH_USER_TEXT_LENGTH=0x8000;

由于已指定2个Block存储数据,用于其它内容Link的地址空间需要在此基础上去掉2个Block,更新FLASH_LENGTH并增加存储函数的TEXT section和存储常量的DATA section。

FLASH_LENGTH=0x00080000-FLASH_USER_DATA_LENGTH-FLASH_USER_TEXT_LENGTH;

FLASH_USER_DATA_START=FLASH_START+FLASH_LENGTH;

FLASH_USER_TEXT_START=FLASH_USER_DATA_START+FLASH_USER_DATA_LENGTH;

memory_regions_new.ld文件的变动参考下图:

fb4458e2-57ee-11f1-90a1-92fbcf53809c.jpg

memory_regions_new.ld变更内容

第二步,修改fsp_gen_new.ld文件,MEMORY中增加FLASH_USER_DATA和FLASH_USER_TEXT,找到__flash_readonly$$(READONLY)【注意:此处是两个下划线】,其后增加.mydata和.mytext。

左右滑动查看完整内容

MEMORY
{
  RAM (rwx) : ORIGIN = RAM_START, LENGTH =RAM_LENGTH
 FLASH(rx) : ORIGIN = FLASH_START, LENGTH =FLASH_LENGTH
 FLASH_USER_DATA(rx) : ORIGIN = FLASH_USER_DATA_START, LENGTH =FLASH_USER_DATA_LENGTH
 FLASH_USER_TEXT(rx) : ORIGIN = FLASH_USER_TEXT_START, LENGTH =FLASH_USER_TEXT_LENGTH
 DATA_FLASH(rx) : ORIGIN = DATA_FLASH_START, LENGTH =DATA_FLASH_LENGTH
 QSPI_FLASH(rx) : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_LENGTH


  .mydata :
  {
 *(.rodata*)
  }> FLASH_USER_DATA

  .mytext :
  {
 *(.text*)
  }> FLASH_USER_TEXT

fbae4e6e-57ee-11f1-90a1-92fbcf53809c.png

fsp_gen_new.ld变更内容

第三步,修改源码,将const类型变量和函数声明在新增.mydata和.mytext两个section中。增加函数定义。在hal_entry()中增加函数调用,避免优化。

const uint8_t test_data[8] BSP_PLACE_IN_SECTION(".mydata") = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

uint32_t test_function_fibonacci(uint32_t num) BSP_PLACE_IN_SECTION(".mytext") __attribute__((noinline));

fc196280-57ee-11f1-90a1-92fbcf53809c.jpg

第四步,按照以下方式更新fsp_new.ld文件,使得改动后的Linker Script File(memory_regions_new.ld和fsp_gen_new.ld)生效。

fc8ece8a-57ee-11f1-90a1-92fbcf53809c.png

fsp_new.ld变更点

最后一步,在e2studio中设置Linker Script File为fsp_new.ld。

fd109e60-57ee-11f1-90a1-92fbcf53809c.jpg

更新Linker Script File为fsp_new.ld

完成上述所有步骤后,编译工程,目标函数和常量已经放在指定地址了,打开***.map文件,用常量和函数名作为关键字搜索,可以看到以下匹配:

fd71dc7a-57ee-11f1-90a1-92fbcf53809c.png

***.map文件中常量和函数的编译地址

二、LLVM编译器

接下来,介绍在e2studio中使用LLVM编译器时的操作步骤。

在e2studio中找到3个文件,在原始路径下复制并重命名:

scriptfsp.lld→scriptfsp_new.lld

Debugmemory_regions.lld→Debugmemory_regions_new.lld

Debugfsp_gen.lld→Debugfsp_gen_new.lld

第一步,编辑Debugmemory_regions_new.lld,文件变动参考下图:

fddd27b4-57ee-11f1-90a1-92fbcf53809c.jpg

memory_regions_new.lld变更内容

第二步,修改fsp_gen_new.lld文件,参考下图:

fe592440-57ee-11f1-90a1-92fbcf53809c.png

fsp_gen_new.lld变更内容

第三步,修改源码,将const类型变量和函数声明在新增.mydata和.mytext两个section中。增加函数定义。在hal_entry()中增加函数调用,避免优化。

左右滑动查看完整内容

constuint8_ttest_data_0[8] BSP_PLACE_IN_SECTION(".mydata") = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
constuint8_ttest_data_1[8] BSP_PLACE_IN_SECTION(".mydata") = {0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};


uint32_ttest_function_fibonacci(uint32_t num)BSP_PLACE_IN_SECTION(".mytext") __attribute__((noinline));
inttest_function_is_prime(int num)BSP_PLACE_IN_SECTION(".mytext") __attribute__((noinline));

左右滑动查看完整内容

ff21aa32-57ee-11f1-90a1-92fbcf53809c.png

第四步,按照以下方式更新fsp_new.lld文件,使得改动后的Linker Script File (memory_regions_new.lld和fsp_gen_new.lld)生效

ff9221b8-57ee-11f1-90a1-92fbcf53809c.png

fsp_new.lld变更点

最后一步,在e2studio中设置Linker Script File为fsp_new.lld

000e518e-57ef-11f1-90a1-92fbcf53809c.png

更新Linker Script File为fsp_new.lld

完成上述所有步骤后,编译工程,目标函数和常量已经放在指定地址了,打开***.map文件,用常量和函数名作为关键字搜索,可以看到以下匹配:

00734756-57ef-11f1-90a1-92fbcf53809c.png

***.map文件中常量和函数的编译地址

三、IAR编译器

前面介绍的都是在瑞萨e2studio中使用GNU和LLVM的配置步骤,对于第三方IDE如IAR和Keil MDK,可以利用RASC(Renesas RA Smart Configurator)创建相应工程并修改。

对于IAR Project,在workspace的路径找到3个文件,在原始路径下复制并重命名:

scriptfsp.icf →[JX1] [JW2] scriptfsp_new.icf

memory_regions.icf → memory_regions_new.icf

fsp_gen.icf → fsp_gen_new.icf

第一步,编辑memory_regions_new.icf,文件变动参考下图:

00ce1aaa-57ef-11f1-90a1-92fbcf53809c.png

memory_regions_new.icf变更内容

第二步,修改fsp_gen_new.icf文件,参考下图:

0150b2ee-57ef-11f1-90a1-92fbcf53809c.png

第三步,修改源码,将const类型变量和函数声明在新增.user_const和.user_text两个section中。增加函数定义。在hal_entry()中增加函数调用,避免优化。

01a84bbc-57ef-11f1-90a1-92fbcf53809c.png

代码中增加变量和函数声明

第四步,按照以下方式更新fsp_new.icf文件,使得改动后的Linker Script File (memory_regions_new.icf和fsp_gen_new.icf)生效

020cda28-57ef-11f1-90a1-92fbcf53809c.png

fsp_new.icf变更点

最后一步,在IAR EW for Arm 中设置Linker Script File为fsp_new.icf

0285e0bc-57ef-11f1-90a1-92fbcf53809c.png

更新Linker Script File为fsp_new.icf

特别提醒

在IAR中执行clean操作后,该配置会恢复为默认值(fsp.icf),需重新进行修改。

完成上述所有步骤后,编译工程,目标函数和常量已经放在指定地址了,打开***.map文件,用常量和函数名作为关键字搜索,可以看到以下匹配:

02f1649a-57ef-11f1-90a1-92fbcf53809c.png

***.map文件中常量和函数的编译地址

四、Arm Compiler

对于Keil MDK工程,在工程路径找到3个文件,在原始路径下复制并重命名:

scriptfsp.scat → scriptfsp_new.scat

memory_regions.scat → memory_regions_new.scat

fsp_gen.scat → fsp_gen_new.scat

第一步,编辑memory_regions_new.scat,文件变动参考下图:

03618c7a-57ef-11f1-90a1-92fbcf53809c.png

memory_regions_new.scat变更内容

第二步,修改fsp_gen_new.scat文件,参考下图:

找到关键字“LOAD_REGION_OPTION_SETTING_OFS0”在该段落前增加.my_data_setion和.my_text_section两个section。

03df2c20-57ef-11f1-90a1-92fbcf53809c.png

fsp_gen_new.scat变更内容

第三步,修改源码,将const类型变量和函数声明在新增.my_data_section和.my_text_section两个section中。增加函数定义。在hal_entry()中增加函数调用,避免优化。

左右滑动查看完整内容

04cc4708-57ef-11f1-90a1-92fbcf53809c.png

第四步,按照以下方式更新fsp_new.scat文件,使得改动后的Linker Script File(memory_regions_new.scat和fsp_gen_new.scat)生效

053bd834-57ef-11f1-90a1-92fbcf53809c.png

fsp_new.scat变更点

最后一步,在Keil MDK 中设置Linker >> Scatter File为fsp_new.scat

05b7eba4-57ef-11f1-90a1-92fbcf53809c.png

更新Linker Script File为fsp_new.scat

完成上述所有步骤后,编译工程,目标函数和常量已经放在指定地址了,打开***.map文件,用常量和函数名作为关键字搜索,可以看到以下匹配:

061cca7e-57ef-11f1-90a1-92fbcf53809c.png

***.map文件中常量和函数的编译地址

关于const变量/函数定位到Code Flash指定地址的方法,我们已经在本文中,基于GNU、LLVM、IAR和Arm Compiler 6共四款主流编译器,做了完整的对比与说明。

理论讲清楚了,接下来就是实操环节啦。

我们也准备了对应的示例工程,方便你直接验证、复用:

示例工程

https://gitee.com/recn-mcu-ae/20260507rasectiongccllvmiarac6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19285

    浏览量

    405438
  • FlaSh
    +关注

    关注

    10

    文章

    1764

    浏览量

    156253
  • 瑞萨
    +关注

    关注

    38

    文章

    22549

    浏览量

    91777
  • 函数
    +关注

    关注

    3

    文章

    4424

    浏览量

    68156
  • 编译器
    +关注

    关注

    1

    文章

    1674

    浏览量

    52131

原文标题:瑞萨RA MCU如何将常量和函数放在Code Flash/ROM指定地址

文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何搭建RA VS code开发环境

    在上一篇文章“当RA MCU遇见Zephyr,打通嵌入式开发任督二脉!”中,我们介绍了Zephyr极具前景的发展趋势以及开发板对Zephyr的深度融合支持。
    的头像 发表于 11-05 14:41 4889次阅读
    如何搭建<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> VS <b class='flag-5'>code</b>开发环境

    RA MCU如何将常量函数放在Code Flash/ROM指定地址

    RA生态工作室关注我们前言在嵌入式系统应用中,有时需要将常量或者函数放在代码闪存(CodeFlash)的指定
    的头像 发表于 06-02 18:55 233次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>如何将</b><b class='flag-5'>常量</b>和<b class='flag-5'>函数</b><b class='flag-5'>放在</b><b class='flag-5'>Code</b> <b class='flag-5'>Flash</b>/<b class='flag-5'>ROM</b><b class='flag-5'>指定</b><b class='flag-5'>地址</b>

    如何将某个函数或变量放在固定的地址

    如题,如何将某个函数或者变量放在固定的地址?类似于__attribute__( at(绝对地址) ),用的nucleistudio ide,
    发表于 11-07 06:07

    RA6E2地奇星开发板试用】内部Code flash和Data flash写入数据并通过OLED显示

    回调函数 读取数据与写入数据不一致 写入地址错误,或数据缓存未刷新 确认 Flash地址正确性,写入后延时 1ms 再读取 四、测评总结与建议 4.1 测评总结
    发表于 12-12 20:15

    RA-Eco-RA4M2开发板评测】+VS Code RA4M2 开发环境搭建与 GPIO 点灯实验教程

    一、前言 RA4M2 系列芯片凭借高性能、低功耗与完善的生态支持,在工业控制、物联网终端等领域得到广泛应用。相较于官方 e2 studio 集成开发环境,VS Code 具备轻量化
    发表于 04-15 15:12

    RISC 32MCU Flash SuperH的相关资料推荐

    推出SH7216系列32-位片上Flash存储器MCU作者:时间:2009-04-21来源:电子产品世界字号: 小 中 大关键词:
    发表于 01-26 06:01

    IAR中如何定向把数组和函数放在指定地址单元

      应用中我们经常会用到一些应用场景,如使用Const关键字定义一个数组到Flash地址单元,但是具体该数组放在Flash的那个位置,通常是由编译器自己分配的(和LCF连接配置文件设置
    发表于 09-15 17:35 7次下载
    IAR中如何定向把数组和<b class='flag-5'>函数</b><b class='flag-5'>放在</b><b class='flag-5'>指定</b>的<b class='flag-5'>地址</b>单元

    micro-ROS移植到RA MCU

    (适用于MCU的机器人操作系统)的官方支持硬件平台。与micro-ROS框架的主要开发商eProsima携手,micro-ROS移植到RA
    的头像 发表于 09-24 16:22 3204次阅读

    RA系列MCU选型指南

    RA系列MCU产品基于Arm Cortex-M内核,与自有内核RL78和RX系列一起,成为
    发表于 11-08 13:51 3386次阅读

    RISC-V MCU常量定义到指定Flash地址

    Keil MDK开发ARM 内核的MCU时,常量定义到指定Flash地址中,使用 **_
    的头像 发表于 02-15 11:47 2450次阅读
    RISC-V <b class='flag-5'>MCU</b><b class='flag-5'>将</b><b class='flag-5'>常量</b>定义到<b class='flag-5'>指定</b>的<b class='flag-5'>Flash</b><b class='flag-5'>地址</b>

    线下培训 | 电子RA MCU应用开发培训课程报名开启![野火电子]

    TRAINING RA应用开发培训课程来了! 电子RA系列MCU产品基于Arm  Cortex -M内核,与
    的头像 发表于 03-21 10:30 2414次阅读

    RA MCU串口通信空闲中断

    RA MCU串口通信空闲中断
    的头像 发表于 09-26 16:59 2196次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>串口通信空闲中断

    使用VSCODE+GNU+J-Link开发RA MCU(上)

    使用VSCODE+GNU+J-Link开发RA MCU
    的头像 发表于 09-04 16:23 2931次阅读
    使用VSCODE+GNU+J-Link开发<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>(上)

    使用VSCODE+GNU+J-Link开发RA MCU(下)

    使用VSCODE+GNU+J-Link开发RA MCU
    的头像 发表于 09-04 16:23 2573次阅读
    使用VSCODE+GNU+J-Link开发<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>(下)

    电子RA系列MCU 2025年新品回顾

    2025年RA系列推出10个新产品,覆盖了从入门级低功耗(RA0E2)、中端低功耗(RA4C1)、高端工业及机器人控制(
    的头像 发表于 01-27 09:57 1935次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b>电子<b class='flag-5'>RA</b>系列<b class='flag-5'>MCU</b> 2025年新品回顾