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

描述

瑞萨

 

     

介绍

     

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

开发环境:IAR for RL78 2.21

芯片:R5F510NPJ

仿真器:E1

 

     

主要内容

     

 

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

 

1

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

2

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

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

瑞萨瑞萨瑞萨

 

3

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

瑞萨

 

4

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

瑞萨

 

具体命令如下:

瑞萨

左右滑动查看更多

瑞萨
//默认配置
//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配置有关系:

瑞萨

 

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

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

瑞萨

 

5

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

R_CGC_Create()  test1()  )

 

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

瑞萨瑞萨

 

6

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

 

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

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


}

 

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

瑞萨瑞萨

 

二、定义变量指定地址

 

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

瑞萨

 

具体命令如下:

瑞萨

左右滑动查看更多

瑞萨
//默认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 是我们自己定义的段名,可以根据自己来定义。如下图所示:

瑞萨瑞萨

 

     

结论

     

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

 

 

更多资料分享

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

瑞萨瑞萨

 

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分