介绍
基于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文件需要放在芯片特定地址时,可以按照上述方法简单实现。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !