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

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

3天内不再提示

基于IAR指定RL78程序地址空间说明

瑞萨嵌入式小百科 来源:未知 2023-06-19 15:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

134a866a-0e72-11ee-962d-dac502259ad0.gif

介绍

基于IAR实现C文件指定地址存放&函数指定地址存放,定义变量指定地址。

开发环境:IAR for RL78 2.21

芯片:R5F510NPJ

仿真器E1

主要内容

一、C文件指定地址存放&函数指定地址存放

1

首先需要根据自己需要指定存放的C文件里面程序所占大小来规划自己的空间。

2

可根据编译生成的map文件来定位C文件所占大小。

如何生成map文件如下图所示:

1374d7e4-0e72-11ee-962d-dac502259ad0.jpg1384baba-0e72-11ee-962d-dac502259ad0.jpg13a52214-0e72-11ee-962d-dac502259ad0.jpg

3

通过查看map文件就可以知道我们所有C文件所占空间大小了。在MODULE SUMMARY一栏,如下图所示:

13b906d0-0e72-11ee-962d-dac502259ad0.jpg

4

根据map文件我们知道C文件:r_cg_cgc.c文件所占大小为217Byte,修改连接文件icf如下图所示:

13ccbf5e-0e72-11ee-962d-dac502259ad0.jpg

具体命令如下:

13ed98a0-0e72-11ee-962d-dac502259ad0.svg

左右滑动查看更多

13ed98a0-0e72-11ee-962d-dac502259ad0.svg
//默认配置
//define region ROM_near = mem:[from 0x000D8 to 0x0FFFF] - EXLUDE_ROM_REGION;
//define region ROM_far = mem:[from 0x000D8 to 0x0FFFF] | mem:[from 0x10000 to 0x1FFFF] | mem:[from 0x20000 to 0x2FFFF] | mem:[from 0x30000 to 0x3FFFF] - EXLUDE_ROM_REGION;
//define region ROM_huge = mem:[from 0x000D8 to 0x3FFFF] - EXLUDE_ROM_REGION;


//下边默认的空间都需要更改,避开自定义开辟的空间段
define region ROM_near = mem:[from 0x000D8 to 0x07FFF] - EXLUDE_ROM_REGION;
define region ROM_far = mem:[from 0x000D8 to 0x07FFF] | mem:[from 0x10000 to 0x1FFFF] | mem:[from 0x20000 to 0x2FFFF] | mem:[from 0x30000 to 0x3FFFF] - EXLUDE_ROM_REGION;
define region ROM_huge = mem:[from 0x000D8 to 0x07FFF] | mem:[from 0x10000 to 0x3FFFF]- EXLUDE_ROM_REGION;


//定义自己开辟的空间
define region ROM1 = mem:[from 0x08000 to 0x0FFFF]; 


//在自己开辟的空间里面定义一个段
place in ROM1 { readonly section NEW_SECTION1};


//把r_cg_cgc.c文件里面的程序从0x08000开始放置
place at address mem:0x08000 { ro section .textf object r_cg_cgc.o };

注意

A、自己开辟的空间需要根据需要存放C文件所占用空间大小来定义。本文只是为了方便操作定义了一块比较大的空间。

B、place at address mem:0x08000 { ro section .textf object r_cg_cgc.o }; 该条命令中需要根据自己代码是否超过64K来配置,跟IAR配置有关系:

13ff2534-0e72-11ee-962d-dac502259ad0.jpg

当IAR配置如下图所示时,需要更换命令为:

place at address mem:0x08000 { ro section .text object r_cg_cgc.o }

14260f5a-0e72-11ee-962d-dac502259ad0.jpg

5

一切配置好后,编译就可以看到我们指定的C文件(r_cg_cgc.c里面含有两个函数:

R_CGC_Create() test1() )

就放在了我们指定地址的地方了,如下图所示:

1433ecb0-0e72-11ee-962d-dac502259ad0.jpg143c1868-0e72-11ee-962d-dac502259ad0.jpg

6

上文中我们在自己开辟的空间里面定义了一个段,也是用来分配自己指定函数地址的,如果函数不在同一个C文件里面可以通过如下方法

在我们需要指定的函数上边加上如下代码:

#pragma location = "NEW_SECTION1"  
Void fun()
{


}

NEW_SECTION1是我们自己定义的段名,可以根据自己来定义。如下图所示:

14676f40-0e72-11ee-962d-dac502259ad0.jpg148e142e-0e72-11ee-962d-dac502259ad0.jpg

二、定义变量指定地址

定义的变量只能单独的添加,没有统一操作的方法,且方法很多,这里只介绍如下方法,在ICF里面更改定义的RAM,具体操作如下图所示:

149f3434-0e72-11ee-962d-dac502259ad0.jpg

具体命令如下:

13ed98a0-0e72-11ee-962d-dac502259ad0.svg

左右滑动查看更多

13ed98a0-0e72-11ee-962d-dac502259ad0.svg
//默认RAM配置
//define region SADDR  = mem:[from 0xFFE20 to 0xFFEDF] - EXLUDE_RAM_REGION;
//define region RAM_near = mem:[from 0xFBF00 to 0xFFE1F] - EXLUDE_RAM_REGION;
//define region RAM_far = mem:[from 0xFBF00 to 0xFFE1F] - EXLUDE_RAM_REGION;
//define region RAM_huge = mem:[from 0xFBF00 to 0xFFE1F] - EXLUDE_RAM_REGION;


//避开自己开辟的空间
define region SADDR  = mem:[from 0xFFE20 to 0xFFEDF] - EXLUDE_RAM_REGION;
define region RAM_near = mem:[from 0xFBF00 to 0xFE0FF] | mem:[from 0xFFC00 to 0xFFE1F]- EXLUDE_RAM_REGION;
define region RAM_far = mem:[from 0xFBF00 to 0xFE0FF] | mem:[from 0xFFC00 to 0xFFE1F]- EXLUDE_RAM_REGION;
define region RAM_huge = mem:[from 0xFBF00 to 0xFE0FF] | mem:[from 0xFFC00 to 0xFFE1F]- EXLUDE_RAM_REGION;
//重新定义开辟RAM空间
define region RAM1 = mem:[from 0xFE100 to 0xFFBFF];
//在自己开辟的RAM定义一个段
place in RAM1 { rw section RAM_METER};

在C代码里面添加:

#pragma location = "RAM_METER"
unsigned char bufff[100];

RAM_METER 是我们自己定义的段名,可以根据自己来定义。如下图所示:

14cb16f8-0e72-11ee-962d-dac502259ad0.jpg14f4d90c-0e72-11ee-962d-dac502259ad0.jpg

结论

当部分函数或是整个C文件需要放在芯片特定地址时,可以按照上述方法简单实现。

更多资料分享

您可识别下方二维码查看:

150a33f6-0e72-11ee-962d-dac502259ad0.png1525972c-0e72-11ee-962d-dac502259ad0.png

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

    关注

    147

    文章

    18605

    浏览量

    386930
  • 瑞萨
    +关注

    关注

    36

    文章

    22429

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞萨RL78F24系列微控制器中的LIN总线从机配置方法

    在汽车电子领域,LIN总线是RL78F24系列微控制器的核心外设之一。为简化LIN通信的配置流程,瑞萨电子提供了专用的RLIN3配置工具,该工具能够高效定义LIN信号帧的格式与内容。本文将重点阐述此工具的具体使用方法。
    的头像 发表于 12-02 14:11 2818次阅读
    瑞萨<b class='flag-5'>RL78</b>F24系列微控制器中的LIN总线从机配置方法

    VS Code 中`xiaozhi-esp32` 项目文件夹 修改 I2C 设备地址为 `0x78`

    VS Code 中`xiaozhi-esp32` 项目文件夹 修改 I2C 设备地址为 `0x78`
    的头像 发表于 11-28 07:30 523次阅读

    请问e203定义的地址空间是虚拟地址还是物理地址

    ; RED_LED_OFFSET); GPIO_REG为基地址,GPIO_OUTPUT_VAL为偏移量,从而确定了要操作的寄存器的绝对地址。 同样地,在做上电复位时,可以配置pc_rtvec使得程序从不同的内存
    发表于 11-11 06:20

    编译器如何指定代码的地址段?

    我在官方 gcc 的基础上添加了自定义指令,目前可以正确编译出汇编代码,但是我该如何指定汇编结果的地址段,让生成的代码符合蜂鸟的地址分配呢?求助大神帮助指导一下,thx~
    发表于 11-10 06:06

    通过sysmem接口扩展内存空间

    存储器的访问接口,在e203_subsys_mems.v文件中可以找到: 同时在这个源文件中实现了一主多从的总线系统,可以看到sysmem被分配到0x80000000到0xFFFFFFFF的地址空间
    发表于 10-24 08:12

    请问Modus Toolbox下针对CYW20719B2编程,能否指定全局变量地址

    请问Modus Toolbox 下针对CYW20719B2编程,能否指定全局变量地址
    发表于 07-08 07:20

    wsOtaUpgrade有没有办法指定MAC地址

    cybt-353027 的 MAC 地址。 我可以制作一个软件实用程序,从连接的设备读取 MAC 地址,然后使用正确的 MAC 地址作为命令行参数启动 wsOTAupgrade,但我
    发表于 06-27 06:19

    瑞萨电子RA4L1的表计应用解析(下)

    RA4L1就是电表分离架构中的主控MCU。RL78/I1C和RA2A2就是电表集成架构中的SoC。
    的头像 发表于 05-13 10:50 2498次阅读
    瑞萨电子RA4L1的表计应用解析(下)

    基于 IAR Embedded Workbench 的自研 MCU 芯片软件函数与变量内存布局优化精控方法

    的函数和变量指定section放置方法与操作流程,兼具过程记录与详细说明,旨在打造一份实用的参考指南,助力开发者精准掌控程序的内存分布与执行逻辑。文档涵盖从默认section表的介绍,到多种放置手段的阐释,以及实际配置示例的展示
    的头像 发表于 04-30 16:38 588次阅读
    基于 <b class='flag-5'>IAR</b> Embedded Workbench 的自研 MCU 芯片软件函数与变量内存布局优化精控方法

    如何在VS Code中使用瑞萨RL78系列MCU

    RL78家族系列MCU,以其业界领先的低功耗和各种内置的高性能外围功能,极大地提高了电源效率,降低了BOM成本,实现了设备的小型化。
    的头像 发表于 04-23 13:49 3843次阅读
    如何在VS Code中使用瑞萨<b class='flag-5'>RL78</b>系列MCU

    开发5744的Bootloader时,为flashdriver在ram中指定了一块的空间

    你好,我在开发5744的Bootloader时,为flashdriver在ram中指定了一块的空间,我想要将flashdriver放在这块地址中,使用链接文件将函数地址
    发表于 04-02 07:07

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    本帖最后由 jf_13411809 于 2025-3-20 14:10 编辑 在Linux系统中,内核空间和用户空间是两个独立的地址空间,它们有不同的访问权限和内存保护机制。在内
    发表于 03-20 11:50

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    get_user(x, p);int put_user(x, p);参数说明:x:数据的值;p:指向用户空间的指针;需要注意的是,在进行数据拷贝时,应确保源地址和目标地址的有效性,并
    发表于 03-19 08:55

    通过Boot swap实现瑞萨RL78/F24 MCU固件升级

    本文主要说明如何使用已有的程序更新flash中的固件。使用这种方法代码闪存分为两个区域:执行区域和临时区域。瑞萨flash驱动程序RL78 RFD Type02用于对flash进行重新
    的头像 发表于 02-26 09:25 2177次阅读
    通过Boot swap实现瑞萨<b class='flag-5'>RL78</b>/F24 MCU固件升级

    MAC地址的作用范围,MAC地址怎么申请?

    MAC地址(MediaAccessControlAddress),也称为局域网地址(LANAddress)、以太网地址(EthernetAddress)、硬件地址(HardwareAd
    的头像 发表于 12-19 17:44 2605次阅读
    MAC<b class='flag-5'>地址</b>的作用范围,MAC<b class='flag-5'>地址</b>怎么申请?