介紹
基于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文件里面可以通過如下方法
在我們需要指定的函數上邊加上如下代碼:
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代碼里面添加:
unsigned char bufff[100];
RAM_METER 是我們自己定義的段名,可以根據自己來定義。如下圖所示:
結論
當部分函數或是整個C文件需要放在芯片特定地址時,可以按照上述方法簡單實現。
更多資料分享
您可識別下方二維碼查看:
-
mcu
+關注
關注
146文章
17123瀏覽量
350994 -
瑞薩
+關注
關注
35文章
22308瀏覽量
86240
發布評論請先 登錄
相關推薦
評論