用IAR EWARM開發嵌入式系統時目標代碼的鏈接與定位
1 數據段和代碼段的作用
本文引用地址:http://www.104case.com/article/80514.htmIAR C/C-+編譯器是一種具有世界先進水平的標準C/C-+編譯器,支持符合ANSI C標準的C或C++編程語言。源程序經編譯后生成包含數據或代碼存儲器邏輯映像的數據段和代碼段。每個段都有一個段名和一個表示其存儲器空間的段類型。段類型CODE表示ROM中的執行代碼,段類型CONST表示ROM中的數據,段類型DATA表示RAM中的數據。段名可與段類型相同,但其意義不一樣,實際使用時不能混淆。表l所列為IAR C/C++編譯器所使用的各種段、段類型及其讀/寫屬性說明。

1.1 數據段
數據位于DATA段中,包括靜態(statIC)存儲器、堆棧(stack)、堆(heap)以及已定位的數據。DATA段可以帶有后綴。例如,DATA_C用于常數數據,包括文字字符串;DATA_Z用于無初值或用0初值聲明的靜態和全局變量。
全局變量或已聲明的靜態變量保存在靜態存儲器空間。已聲明的靜態變量有:初值為O或非0的變量、采用“@”或“#pragma”操作符定位了的變量、被聲明為“const”因而可在ROM中保存的變量,以及采用關鍵字“__no_init”定義不允許被初始化的變量等。
堆棧用于為函數保存局部變量及其他臨時數據,是由堆棧指針寄存器SP指向的一段連續存儲器。作為堆棧的數據段稱為“CSTACK”。初始化模塊cstartup將堆棧指針初始化為指向CSTACK段的尾部。堆棧容量在很大程度上取決于具體程序操作細節。如果給定的堆棧容量太小,則會使堆棧中的數據發生覆蓋而導致程序出錯;如果給定的堆棧容量太大,則會浪費RAM空間。ARM核處理器支持5種異常工作模式,每種模式都有自己的堆棧,用戶應在啟動代碼中分別初始化各個堆棧指針,并在鏈接器命令文件中進行段定位。
堆用于保存動態分配數據。作為堆的數據段稱為“HEAP”,它儀在使用動態存儲器分配時才被包含到應用系統中。與CSTACK段類似,HEAP段容量的大小需要視具體應用而定。使用標準輸入/輸出庫時,應將HEAP容量設置為滿足對標準輸入/輸出進行緩沖的要求,通常為512字節。
明確指定了地址的變量將被定位在DATA_AC段或DATA_AN段。DATA_AC段用于初始化為常數的數據,DATA_AN段用于聲明為“__no_init”的變量。
1.2 代碼段
代碼段包括啟動代碼、普通代碼和異常向最。
啟動代碼位于ICODE段,包括系統啟動(cstartup)、運行初始化(cmain)和系統終止(cexit)等代碼。ICODE段必須被定位在一段連續的存儲器空間,鏈接器命令文件中不能采用-P命令選項來定位ICODE段。啟動代碼通過復位向量調用。
普通代碼位于CODE段,其中保存普通函數的執行代碼。CODE段可以帶有后綴,如CODE_I段保存由CODE_ID段初始化并在RAM中執行的代碼。與編譯器對已初始化變量的處理類似,代碼運行時將ROM存儲器中初始化時段的內容復制到RAM存儲器中再執行。普通代碼段還與符號及調試信息有關。
異常向量位于INTVEC段。如果在異常向量處使用跳轉到異常句柄的指令(如B指令),則異常句柄必須位于跳轉指令能夠到達的范圍之內,使用PC加載指令(如LDR PC指令)則不存在這個問題。
2 段在存儲器中的定位
IAR C編譯器所生成的段需要通過XLINK鏈接器根據鏈接命令文件中一系列命令選項的規定在存儲器中進行定位,才能保證目標代碼的正常運行。鏈接命令文件是一種文本文件,以“.xcl”為擴展名,其中包含各種XLINK命令選項。

3 鏈接命令文件應用舉例
鏈接器命令文件的作用足通知XLLINK鏈接器,根據文件中給定的命令選項在存儲器中進行各種段定位;由于ARM核處理器的種類繁多,各處理器的存儲器配置也不盡相同,因此鏈接器命令文件通常需要根據具體應用系統硬件設計進行定制,以保證代碼和數據在給定的存儲器范圍之內不發生越界而導致錯誤。
下面以Philips公司的LPC2148 ARM核處理器芯片為例,說明如何定制XLINK鏈接命令文件。LPC2148具有32 KB片內SRAM和512 KB片內Flash,其存儲器地址如下。
片內Flash:0x00000000~Ox0007FFFF。
片內SRAM:0x40000000~0x413007FFF。
針對LPC2148所具有的存儲器地址范圍,可分別定制,在片內SRAM中或在片內Flash中,調試應用程序的XLINK鏈接命令文件。
(1)在片內SRAM中調試應用程序的鏈接命令文件


(2)在片內Flash中調試應用程序的鏈接命令文件
對上述鏈接命令文件進行適當修改后可以用于在LPC2148片內Flash中調試應用程序,主要是重新規定代碼段和數據段的存儲器地址,有時還要重新定義堆棧(stack)和堆(heap)的長度。下面僅列出修改后的部分,其他相同部分略去:

4 結論
采用IAR EWARM集成環境開發ARM嵌入式系統,需要通過鏈接命令文件通知XLINK鏈接器如何對C編譯器生成的代碼和數據段進行鏈接和定位。用戶需要熟悉所使用ARM核處理器的SRAM和Flash存儲器配置,并根據實際可用地址空間來確定采用哪些XLINK命令選項。只有采用合適命令選項對代碼和數據段進行正確定位,生成可靠的執行代碼,最后將執行代碼寫入到Flash中,才能成功完成ARM嵌入式系統設計;否則,即使編寫的C源程序再優化,也起不到其應有的作用。
c++相關文章:c++教程
存儲器相關文章:存儲器原理
評論