爲了便於後續的項目升級,管理,須要對代碼,數據的存儲空間加以設定,也在網上找下相關的資料,筆者水平有限,數組
以下內容不必定徹底正確,若有錯誤以後,還望幫忙糾正.首先,有必要了解一下IAR開發環境的ILINK,IAR的版本要ide
在IAR5.xx之後,本人是在IAR6.21版本之上調試,目前我也將版本更新到6.50了,推薦使用IAR更新版本的.ui
下載地址:http://pan.baidu.com/share/link?shareid=328871&uk=3842212607spa
破解補丁下載地址:http://download.csdn.net/detail/fzhiping2435118a/6644531.net
安裝好IAR開發環境以後,咱們能夠打開IAR的幫助文檔,查看關於ILINK的使用說明.打開help的下拉菜單,打開C/C++ Development Guide選項。調試
第一部分有詳細講述關於ILINKxml
其實,剛開始咱們創建工程的時候也有使用到這個,可能沒有引發關注,在Project->Options選項中,咱們能夠根據ip
實際MCU的memory和堆棧的大小在這裏進行配置.咱們打開這個*.icf文件看看具體的內容.*號是通配符,名稱能夠用ci
戶自定義更改,下面是EFM32TG110F32時使用的ICF文件:EFM32TG110F32.icf這裏其實主要定義了ROM,RAM和開發
堆棧的起始地址,結束地址.
/*###ICF### Section handledby ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/*IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol__ICFEDIT_intvec_start__ = 0x00000000;
/*-Memory Regions-*/
define symbol__ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol__ICFEDIT_region_ROM_end__ =(0x00000000+0x00020000-1);
define symbol__ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol__ICFEDIT_region_RAM_end__ =(0x20000000+0x00004000-1);
/*-Sizes-*/
define symbol__ICFEDIT_size_cstack__ = 0x400;
define symbol__ICFEDIT_size_heap__ = 0x800;
/**** End of ICF editorsection. ###ICF###*/
define memory mem with size =4G;
define region ROM_region = mem:[from__ICFEDIT_region_ROM_start__ to__ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from__ICFEDIT_region_RAM_start__ to__ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size =__ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size =__ICFEDIT_size_heap__ { };
initialize by copy {readwrite };
do not initialize { section .noinit };
keep { section .intvec };
place at addressmem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK,
block HEAP };
咱們能夠在C程序當中的代碼前使用,獲取當前代碼的位置.
#pragma location = ".xxx" 這裏沒有結束分號,xxx爲自定義的變量.
而後就能夠在icf文件中加上:
define symbol__ICFEDIT_region_DATRAM_start__ = 0x20000500;
place at addressmem:__ICFEDIT_region_DATRAM_start__ {section .xxx };
__ICFEDIT_region_DATRAM_start__是符號的名稱,用戶可自行定義.
這裏的地址也須要根據本身的MCU定義.
這裏須要注意的是:若是是定義的ROM的空間裏面,那麼ROM裏面只能是readonly的屬性,所以,
假如一個數組char array[10];那麼它必須是char const array[10]; 這樣才能正確的指定到具體地址去.
例如:
C程序:
#pragma location = ".test"
Char const array[10];
Icf文件:
place in ROM_region { readonly .test};/* ROM_region 能夠本身定義*/
修改完成以後,咱們能夠進入DEBUG模式,打開View菜單下的memory選項,查看具體的地址中的內容是否與你須要的內容一致呢。動手看看吧.