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

描述

 

介绍

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

开发环境:IAR for RL78 2.21

芯片:R5F510NPJ

仿真器:E1

主要内容

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

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

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

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

C文件C文件C文件

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

C文件

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

C文件

具体命令如下:

 

左右滑动查看更多

 

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

C文件

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

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

C文件

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

R_CGC_Create()  test1()  )

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

C文件C文件

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

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

 

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


}

 

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

C文件C文件

二、定义变量指定地址

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

C文件

具体命令如下:

 

左右滑动查看更多

 

//默认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文件C文件

结论

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

 

  审核编辑:汤梓红

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

全部0条评论

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

×
20
完善资料,
赚取积分