EFM32在使用IAR開發環境配置ICf文件以及指定程序存儲地址空間

EFM32在IAR開發環境下指定代碼,數據的存儲空間

爲了便於後續的項目升級,管理,須要對代碼,數據的存儲空間加以設定,也在網上找下相關的資料,筆者水平有限,數組

以下內容不必定徹底正確,若有錯誤以後,還望幫忙糾正.首先,有必要了解一下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選項,查看具體的地址中的內容是否與你須要的內容一致呢。動手看看吧.

相關文章
相關標籤/搜索