本指南介紹了IAR Embedded Workbench for ARM 4.xx版本和5.xx版本之間的主要區別,並列舉了將在4.xx版本下創建的工程遷移到5.xx版本時所需進行的主要工作。用戶一般只需按照說明進行改動,如遇到未在本指南中說明的特殊部份,可以查閱IAR Embedded Workbench for ARM 5.xx所帶的Migration Guide(EWARM_MigrationGuide.pdf)
1 遷移概述
1.1 EWARM版本4.xx與5.xx的區別
IAR EWARM在版本4.xx與5.xx之間的主要區別是建立目標代碼所用的文件格式不同。在4.xx版本下,IAR使用的是私有的UBROF格式,而5.xx版本下使用的是業界標準格式ELF/DWARF。遵循ARM公司提出的ABI(Application Binary Interface)標準,EWARM 5.xx提供了目標文件級別的兼容性,即其它ABI兼容工具生成的目標庫可以與EWARM生成的目標文件一起鏈接並調試;同時EWARM生成的目標庫也能在其它ABI兼容工具裏參與鏈接和調試,使得應用程序的開發更具靈活性。當然,這也意味着EWARM 5.xx裏使用了全新版本的鏈接器ILINK來取代原先所用的XLINK,從而導致鏈接器配置文件也使用了新的格式:ICF,而不再是原先的XCL。關於這兩種配置文件的格式和內容,下面還會詳細介紹。
1.2 遷移工作
因爲EWARM 4.xx和5.xx之間存在的上述差異,使得在4.xx版本下面創建的Project不能直接在5.xx版本中使用。對於EWARM的新用戶,或者有經驗的用戶開發新的項目來說,首選的建議是基於5.xx中的相關例程來建立新的Project。如果在某些情況下,不得不基於以前在4.xx下所創建的Project進行工作,則一般來說可能會有以下幾個方面需要修改:
1. C/C++語言源代碼
2. 彙編語言源代碼
3. 鏈接器配置文件
4. 運行時環境和目標文件
5. 工程配置文件
對於具體的應用程序來說,通常並不是上面提到的每個部份都需要考慮。下面主要針對鏈接器配置文件的修改來介紹遷移過程中需要注意的內容。
2 鏈接器和鏈接器的配置
2.1 EWARM 4.xx的鏈接器XLINK及其配置文件.xcl
XLINK鏈接器可以把IAR彙編器或編譯器所產生的可重定位的UBROF目標文件轉換成針對目標處理器的機器碼。XLINK一般通過外部鏈接器命令文件(*.xcl)來配置,當然也可以在命令行中直接在xlink命令之後輸入鏈接選項,或者也可以在XLINK_ENVPAR環境變量中設置鏈接選項。下面介紹XCL文件中常用的鏈接選項,以便在版本遷移之前,確切地瞭解XCL文件的含義。
2.2 XLINK選項
下面介紹幾個XCL文件中常見的鏈接器配置選項。更詳細的內容請查閱XLINK的參考手冊:IAR Linker and Library Tools Reference Guide。
-D -Dsymbol=value
作用:
使用-D選項可以定義一些純粹的符號,一般用於聲明常數。
參數:
symbol是未在其它地方定義過的外部符號,value是symbol所代表的值。例如:
就定義了2個標識了ROM起始和結束地址的符號,這樣以後關於ROM地址的配置都可以直接使用這2個符號,使得配置文件的可讀性增強。
-Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] …
作用:
使用-Z命令的目的是規定segments在存儲空間中佔據的位置和區間。如果鏈接器發現某個segment沒有使用-Z,-b或者-P中的任何一個命令進行定義,則會報錯。
參數:
@ 使用@參數,表示爲segments分配空間時不考慮任何已經被使用的地址空間。這適用於當某些segments的地址空間需要發生重疊的情形。
type 參數type規定了segments的存儲類型,默認爲UNTYPED。表1列舉了IAR的ARM C/C++編譯器所支持的segments類型。
-Q -Q segment = initializer_segment
作用:
自動設置segment的拷貝初始化。鏈接器會產生一個新的initializer_segment(如CODE_ID),其內容與segment(如CODE_I)完全一致。相關的符號表和調試信息都會和segment相關聯(如CODE_I)。initializer_segment的內容(通常在ROM中)必須在初始化階段被複制到segment(通常在RAM中)。
-c -cprocessor
作用:
規定目標處理器的類型。如-carm。
2.3 EWARM 5.xx的鏈接器ILINK及其配置文件.icf
EWARM 5.xx中的鏈接器稱爲ILINK。ILINK可以從ELF/DWARF格式的目標文件中提取代碼和數據,並生成可執行映像。在EWARM 4.xx中,基本的代碼和數據鏈接單元是segment,而對於ELF/DWARF格式而言,基本鏈接單元是section。ILINK根據ILINK Configuration File(*.icf)來分配這些sections。由於XLINK與ILINK是兩個完全不同的鏈接器,所以XCL和ICF也是兩種完全不同的配置文件。下面簡要介紹ICF文件的格式和內容,以協助用戶完成版本遷移。
2.4 ICF格式淺析
sections在地址空間中的存放是由ILINK鏈接器來實現的,而ILINK鏈接器是按照用戶在ICF文件中的規定來放置sections的,所以理解ICF文件的內容尤其重要。
一個標準的ICF文件可包括下面這些內容:
1. 可編址的存儲空間(memory)
2. 不同的存儲器地址區域(region)
3. 不同的地址塊(block)
4. Section的初始化與否
5. Section在存儲空間中的放置
下面介紹了幾條ICF文件中常見的指令,詳細內容請參考ILINK相關說明文檔(EWARM_DevelopmentGuide.pdf):
define [ exported ] symbol name = expr;
作用:
指定某個符號的值。
參數:
exported 導出該symbol,使其對可執行鏡像可用
name 符號名
expr 符號值
舉例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
define memory name with size = expr [, unit-size];
作用:
定義一個可編址的存儲地址空間(memory)。
參數:
name memory的名稱
expr 地址空間的大小
unit-size expr的單位,可以是位(unitbitsize),缺省是字節(unitbytesize)
舉例:
define memory MEM with size = 4G;
define region name = region-expr;
作用:
定義一個存儲地址區域(region)。一個區域可由一個或多個範圍組成,每個範圍內地址必須連續,但幾個範圍之間不必是連續的。
參數:
name region的名稱
region-expr memory:[from expr { to expr | size expr}],可以定義起止範圍,也可以定義起始地址和region的大小
舉例:
define region ROM = MEM:[from 0x0 size 0x10000];
define region ROM = MEM:[from 0x0 to 0xFFFF];
define block name[ with param, param... ]
{
extended-selectors
};
作用:
定義一個地址塊(block);它可以是個空塊,比如棧、堆;也可以包含一系列sections。
參數:
name block的名稱
param 可以是: size = expr (塊的大小)
maximum size = expr (塊大小的上限)
alignment = expr (最小對齊字節數)
fixed order (按照固定順序放置sections)
extended-selector [ first | last ] { section-selector | block name | overlay name }
first 最先存放
last 最後存放
section-selector [ section-attribute ][ section sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名稱
filename 目標文件的名稱
即可以按照section的屬性,名稱及其所在目標文件的名稱這三個過濾條件中,任意選取一個條件,或選取多個條件進行組合,來圈定所要求的sections。
name block或overlay的名稱
舉例:
define block HEAP with size = 0x1000, alignment = 4 { };
define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };
define block MYBLOCK2 = { readonly object myfile2.o };
initialize { by copy | manually } [ with param, param... ]
{
section-selectors
};
作用:
初始化sections。
參數:
by copy 在程序啓動時自動執行初始化。
manually 在程序啓動時不自動執行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否壓縮數據,缺省是auto。
functionname表示是否使用自己的拷貝函數來取代缺省函數。
section-selector 同上
舉例:
initialize by copy { rw };
do not initialize
{
section-selectors
};
作用:
規定在程序啓動時不需要初始化的sections。一般用於__no_init聲明的變量段(.noinit)。
參數:
section-selector 同上
舉例:
do not initialize { .noinit };
place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};
作用:
把一系列sections和blocks放置在某個具體的地址,或者一個region的開始或者結束處。
參數:
memory memory的名稱
expr 地址值,該地址必須在memory所定義的範圍內
region_expr region的名稱
extended-selector 同上
舉例:
place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec };
place in region-expr
{
extended-selectors
};
作用:
把一系列sections和blocks放置在某個region中。sections和blocks將按任意順序放置。
參數:
region-expr region的名稱
extended-selector 同上
舉例:
place in ROM { readonly }; /* all readonly sections */ place in RAM { readwrite }; /* all readwrite sections */
place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; place in ROM { section .text object myfile.o }; /* the .text section of myfile.o */ place in ROM { readonly object myfile.o }; /* all read-only sections of myfile.o */ place in ROM { readonly data object myfile.o }; /* all read-only data sections myfile.o */
3 其它
如果在EWARM 5.xx中直接打開4.xx所創建的工程文件,會有對話框詢問是否自動將其轉換成5.xx的工程文件;若選擇OK,4.xx的工程文件會被轉換成5.xx的工程文件,當然原來的4.xx工程文件也會自動生成一個備份。某些配置信息無法被自動帶入5.xx的工程,如鏈接器配置文件的路徑等,因此請仔細檢查相關的編譯、彙編或鏈接選項,確保它們具有正確的設置。各配置選項的含義可參閱EWARM_UserGuide.pdf的Part 7.
在EWARM 5.xx版本中,默認的程序入口符號(Program Entry)由原先的__program_start更改爲__iar_program_start,因此對於舊的4.xx彙編代碼而言,需要更改這個入口符號名;當然也可以在EWARM 5.xx的Linker配置選項中修改默認的Program Entry。
在EWARM 4.xx版本中,在Linker配置選項的Output和Extra Output選項卡中都可以選擇生成除UBROF格式之外的其他格式輸出文件。在EWARM 5.xx中,Linker只能生成ELF/DWARF格式的輸出文件,若需要Motorola S-Record,Intel HEX或簡單Binary等其它格式的文件,可在Output Converter配置選項中設置。
在從EWARM 4.xx向5.xx版本的遷移過程中,除了需要更改鏈接器配置文件之外,可能還需要根據應用程序的具體情況,對某些其它方面做小的修改,如C/C++源代碼和彙編語言源代碼等,必要時可以參考IAR Embedded Workbench for ARM 5.xx所帶的Migration Guide(EWARM_MigrationGuide.pdf)。