新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用IAR EWARM開發(fā)嵌入式系統(tǒng)時(shí)目標(biāo)代碼的鏈接與定位

用IAR EWARM開發(fā)嵌入式系統(tǒng)時(shí)目標(biāo)代碼的鏈接與定位

作者: 時(shí)間:2008-03-24 來源: 收藏

  1 數(shù)據(jù)段和代碼段的作用

本文引用地址:http://m.butianyuan.cn/article/80514.htm

  IAR C/C-+編譯器是一種具有世界先進(jìn)水平的標(biāo)準(zhǔn)C/C-+編譯器,支持符合ANSI C標(biāo)準(zhǔn)的C或C++編程語言。源程序經(jīng)編譯后生成包含數(shù)據(jù)或代碼存儲(chǔ)器邏輯映像的數(shù)據(jù)段和代碼段。每個(gè)段都有一個(gè)段名和一個(gè)表示其存儲(chǔ)器空間的段類型。段類型CODE表示ROM中的執(zhí)行代碼,段類型CONST表示ROM中的數(shù)據(jù),段類型DATA表示RAM中的數(shù)據(jù)。段名可與段類型相同,但其意義不一樣,實(shí)際使用時(shí)不能混淆。表l所列為IAR C/C++編譯器所使用的各種段、段類型及其讀/寫屬性說明。

  

 

  1.1 數(shù)據(jù)段

  數(shù)據(jù)位于DATA段中,包括靜態(tài)(statIC)存儲(chǔ)器、堆棧(stack)、堆(heap)以及已定位的數(shù)據(jù)。DATA段可以帶有后綴。例如,DATA_C用于常數(shù)數(shù)據(jù),包括文字字符串;DATA_Z用于無初值或用0初值聲明的靜態(tài)和全局變量。

  全局變量或已聲明的靜態(tài)變量保存在靜態(tài)存儲(chǔ)器空間。已聲明的靜態(tài)變量有:初值為O或非0的變量、采用“@”或“#pragma”操作符定位了的變量、被聲明為“const”因而可在ROM中保存的變量,以及采用關(guān)鍵字“__no_init”定義不允許被初始化的變量等。

  堆棧用于為函數(shù)保存局部變量及其他臨時(shí)數(shù)據(jù),是由堆棧指針寄存器SP指向的一段連續(xù)存儲(chǔ)器。作為堆棧的數(shù)據(jù)段稱為“CSTACK”。初始化模塊cstartup將堆棧指針初始化為指向CSTACK段的尾部。堆棧容量在很大程度上取決于具體程序操作細(xì)節(jié)。如果給定的堆棧容量太小,則會(huì)使堆棧中的數(shù)據(jù)發(fā)生覆蓋而導(dǎo)致程序出錯(cuò);如果給定的堆棧容量太大,則會(huì)浪費(fèi)RAM空間。ARM核處理器支持5種異常工作模式,每種模式都有自己的堆棧,用戶應(yīng)在啟動(dòng)代碼中分別初始化各個(gè)堆棧指針,并在鏈接器命令文件中進(jìn)行段定位。

  堆用于保存動(dòng)態(tài)分配數(shù)據(jù)。作為堆的數(shù)據(jù)段稱為“HEAP”,它儀在使用動(dòng)態(tài)存儲(chǔ)器分配時(shí)才被包含到應(yīng)用系統(tǒng)中。與CSTACK段類似,HEAP段容量的大小需要視具體應(yīng)用而定。使用標(biāo)準(zhǔn)輸入/輸出庫時(shí),應(yīng)將HEAP容量設(shè)置為滿足對(duì)標(biāo)準(zhǔn)輸入/輸出進(jìn)行緩沖的要求,通常為512字節(jié)。

  明確指定了地址的變量將被定位在DATA_AC段或DATA_AN段。DATA_AC段用于初始化為常數(shù)的數(shù)據(jù),DATA_AN段用于聲明為“__no_init”的變量。

  1.2 代碼段

  代碼段包括啟動(dòng)代碼、普通代碼和異常向最。

  啟動(dòng)代碼位于ICODE段,包括系統(tǒng)啟動(dòng)(cstartup)、運(yùn)行初始化(cmain)和系統(tǒng)終止(cexit)等代碼。ICODE段必須被定位在一段連續(xù)的存儲(chǔ)器空間,鏈接器命令文件中不能采用-P命令選項(xiàng)來定位ICODE段。啟動(dòng)代碼通過復(fù)位向量調(diào)用。

  普通代碼位于CODE段,其中保存普通函數(shù)的執(zhí)行代碼。CODE段可以帶有后綴,如CODE_I段保存由CODE_ID段初始化并在RAM中執(zhí)行的代碼。與編譯器對(duì)已初始化變量的處理類似,代碼運(yùn)行時(shí)將ROM存儲(chǔ)器中初始化時(shí)段的內(nèi)容復(fù)制到RAM存儲(chǔ)器中再執(zhí)行。普通代碼段還與符號(hào)及調(diào)試信息有關(guān)。

  異常向量位于INTVEC段。如果在異常向量處使用跳轉(zhuǎn)到異常句柄的指令(如B指令),則異常句柄必須位于跳轉(zhuǎn)指令能夠到達(dá)的范圍之內(nèi),使用PC加載指令(如LDR PC指令)則不存在這個(gè)問題。

  2 段在存儲(chǔ)器中的定位

  IAR C編譯器所生成的段需要通過XLINK鏈接器根據(jù)鏈接命令文件中一系列命令選項(xiàng)的規(guī)定在存儲(chǔ)器中進(jìn)行定位,才能保證目標(biāo)代碼的正常運(yùn)行。鏈接命令文件是一種文本文件,以“.xcl”為擴(kuò)展名,其中包含各種XLINK命令選項(xiàng)。

  

 

  3 鏈接命令文件應(yīng)用舉例

  鏈接器命令文件的作用足通知XLLINK鏈接器,根據(jù)文件中給定的命令選項(xiàng)在存儲(chǔ)器中進(jìn)行各種段定位;由于ARM核處理器的種類繁多,各處理器的存儲(chǔ)器配置也不盡相同,因此鏈接器命令文件通常需要根據(jù)具體應(yīng)用系統(tǒng)硬件設(shè)計(jì)進(jìn)行定制,以保證代碼和數(shù)據(jù)在給定的存儲(chǔ)器范圍之內(nèi)不發(fā)生越界而導(dǎo)致錯(cuò)誤。

  下面以Philips公司的LPC2148 ARM核處理器芯片為例,說明如何定制XLINK鏈接命令文件。LPC2148具有32 KB片內(nèi)SRAM和512 KB片內(nèi)Flash,其存儲(chǔ)器地址如下。

  片內(nèi)Flash:0x00000000~Ox0007FFFF。

  片內(nèi)SRAM:0x40000000~0x413007FFF。

  針對(duì)LPC2148所具有的存儲(chǔ)器地址范圍,可分別定制,在片內(nèi)SRAM中或在片內(nèi)Flash中,調(diào)試應(yīng)用程序的XLINK鏈接命令文件。

  (1)在片內(nèi)SRAM中調(diào)試應(yīng)用程序的鏈接命令文件

  

 

  

 

  (2)在片內(nèi)Flash中調(diào)試應(yīng)用程序的鏈接命令文件

  對(duì)上述鏈接命令文件進(jìn)行適當(dāng)修改后可以用于在LPC2148片內(nèi)Flash中調(diào)試應(yīng)用程序,主要是重新規(guī)定代碼段和數(shù)據(jù)段的存儲(chǔ)器地址,有時(shí)還要重新定義堆棧(stack)和堆(heap)的長(zhǎng)度。下面僅列出修改后的部分,其他相同部分略去:

  

 

  4 結(jié)論

  采用集成環(huán)境開發(fā)ARM嵌入式系統(tǒng),需要通過鏈接命令文件通知XLINK鏈接器如何對(duì)C編譯器生成的代碼和數(shù)據(jù)段進(jìn)行鏈接和定位。用戶需要熟悉所使用ARM核處理器的SRAM和Flash存儲(chǔ)器配置,并根據(jù)實(shí)際可用地址空間來確定采用哪些XLINK命令選項(xiàng)。只有采用合適命令選項(xiàng)對(duì)代碼和數(shù)據(jù)段進(jìn)行正確定位,生成可靠的執(zhí)行代碼,最后將執(zhí)行代碼寫入到Flash中,才能成功完成ARM嵌入式系統(tǒng)設(shè)計(jì);否則,即使編寫的C源程序再優(yōu)化,也起不到其應(yīng)有的作用。

c++相關(guān)文章:c++教程


存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理




關(guān)鍵詞: IAR EWARM

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉