www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]用IAR EWARM開發(fā)嵌入式系統(tǒng)時目標(biāo)代碼的鏈接與定位

摘要 采用IAR EWARM集成開發(fā)工具進(jìn)行ARM嵌入式系統(tǒng)開發(fā),具有高效和靈活的特點(diǎn),可以生成多種格式的目標(biāo)文件。源程序經(jīng)編譯后生成包含數(shù)據(jù)或代碼存儲器邏輯映像的數(shù)據(jù)段和代碼段,必須經(jīng)過合理的鏈接定位,才能保證最終目標(biāo)代碼能夠下栽到系統(tǒng)的Flash內(nèi)并正確運(yùn)行。
關(guān)鍵詞 ARM嵌入式系統(tǒng)開發(fā) IAR EWARM 編譯器


1 數(shù)據(jù)段和代碼段的作用
    IAR C/C-+編譯器是一種具有世界先進(jìn)水平的標(biāo)準(zhǔn)C/C-+編譯器,支持符合ANSI C標(biāo)準(zhǔn)的C或C++編程語言。源程序經(jīng)編譯后生成包含數(shù)據(jù)或代碼存儲器邏輯映像的數(shù)據(jù)段和代碼段。每個段都有一個段名和一個表示其存儲器空間的段類型。段類型CODE表示ROM中的執(zhí)行代碼,段類型CONST表示ROM中的數(shù)據(jù),段類型DATA表示RAM中的數(shù)據(jù)。段名可與段類型相同,但其意義不一樣,實(shí)際使用時不能混淆。表l所列為IAR C/C++編譯器所使用的各種段、段類型及其讀/寫屬性說明。
1.1 數(shù)據(jù)段
   
數(shù)據(jù)位于DATA段中,包括靜態(tài)(static)存儲器、堆棧(stack)、堆(heap)以及已定位的數(shù)據(jù)。DATA段可以帶有后綴。例如,DATA_C用于常數(shù)數(shù)據(jù),包括文字字符串;DATA_Z用于無初值或用0初值聲明的靜態(tài)和全局變量。
    全局變量或已聲明的靜態(tài)變量保存在靜態(tài)存儲器空間。已聲明的靜態(tài)變量有:初值為O或非0的變量、采用“@”或“#pragma”操作符定位了的變量、被聲明為“const”因而可在ROM中保存的變量,以及采用關(guān)鍵字“__no_init”定義不允許被初始化的變量等。
    堆棧用于為函數(shù)保存局部變量及其他臨時數(shù)據(jù),是由堆棧指針寄存器SP指向的一段連續(xù)存儲器。作為堆棧的數(shù)據(jù)段稱為“CSTACK”。初始化模塊cstartup將堆棧指針初始化為指向CSTACK段的尾部。堆棧容量在很大程度上取決于具體程序操作細(xì)節(jié)。如果給定的堆棧容量太小,則會使堆棧中的數(shù)據(jù)發(fā)生覆蓋而導(dǎo)致程序出錯;如果給定的堆棧容量太大,則會浪費(fèi)RAM空間。ARM核處理器支持5種異常工作模式,每種模式都有自己的堆棧,用戶應(yīng)在啟動代碼中分別初始化各個堆棧指針,并在鏈接器命令文件中進(jìn)行段定位。

    堆用于保存動態(tài)分配數(shù)據(jù)。作為堆的數(shù)據(jù)段稱為“HEAP”,它儀在使用動態(tài)存儲器分配時才被包含到應(yīng)用系統(tǒng)中。與CSTACK段類似,HEAP段容量的大小需要視具體應(yīng)用而定。使用標(biāo)準(zhǔn)輸入/輸出庫時,應(yīng)將HEAP容量設(shè)置為滿足對標(biāo)準(zhǔn)輸入/輸出進(jìn)行緩沖的要求,通常為512字節(jié)。
    明確指定了地址的變量將被定位在DATA_AC段或DATA_AN段。DATA_AC段用于初始化為常數(shù)的數(shù)據(jù),DATA_AN段用于聲明為“__no_init”的變量。
1.2 代碼段
   
代碼段包括啟動代碼、普通代碼和異常向最。
    啟動代碼位于ICODE段,包括系統(tǒng)啟動(cstartup)、運(yùn)行初始化(cmain)和系統(tǒng)終止(cexit)等代碼。ICODE段必須被定位在一段連續(xù)的存儲器空間,鏈接器命令文件中不能采用-P命令選項來定位ICODE段。啟動代碼通過復(fù)位向量調(diào)用。
    普通代碼位于CODE段,其中保存普通函數(shù)的執(zhí)行代碼。CODE段可以帶有后綴,如CODE_I段保存由CODE_ID段初始化并在RAM中執(zhí)行的代碼。與編譯器對已初始化變量的處理類似,代碼運(yùn)行時將ROM存儲器中初始化時段的內(nèi)容復(fù)制到RAM存儲器中再執(zhí)行。普通代碼段還與符號及調(diào)試信息有關(guān)。
    異常向量位于INTVEC段。如果在異常向量處使用跳轉(zhuǎn)到異常句柄的指令(如B指令),則異常句柄必須位于跳轉(zhuǎn)指令能夠到達(dá)的范圍之內(nèi),使用PC加載指令(如LDR PC指令)則不存在這個問題。

2 段在存儲器中的定位
    IAR C編譯器所生成的段需要通過XLINK鏈接器根據(jù)鏈接命令文件中一系列命令選項的規(guī)定在存儲器中進(jìn)行定位,才能保證目標(biāo)代碼的正常運(yùn)行。鏈接命令文件是一種文本文件,以“.xcl”為擴(kuò)展名,其中包含各種XLINK命令選項。
    最常用的命令選項有:CPU命令選項-C、常數(shù)定義命令選項D、段定位命令選項-Z或-P。
    “-c”命令選項用于規(guī)定用戶系統(tǒng)所采用的CPU,如:-carm。
    “-D”命令選項用于規(guī)定存儲器的起始和終止地址,如:
    -DROMSTART=40000040
    -DROMEND=40006FFF
    “-D”命令選項也可用于定義堆棧長度或其他常數(shù),如:
    -D_CSTACK——STZE=2048
    -D_IRQ_STACK_SIZE=5l2
    “-Z”命令選項按段出現(xiàn)的順序進(jìn)行定位,對每個存儲器范圍要指定其終點(diǎn),如:
    -Z(CONST)MYSEGMENTA,MYSEGMENTB=008000-OFFFFF
    兩個不同類型的段如果不指定第2個段的范圍,則可以定位在同一個存儲器區(qū)域之內(nèi),如:
    -Z(CONST)MYSEGMENTA=008000-0FFFFF
    -Z(CODE)MYCODE
    兩段存儲器范圍可以覆蓋,從而允許具有不同定位要求的段共享部分存儲器空間,如:
    -Z(CONST)MYSMALLSEGMENT=008000-000FFF
    -Z(CONST)MYLARGESEGMENT=008000-OFFFFF
    “-P”命令選項以非連續(xù)方式進(jìn)行段定位,可充分利用存儲器空間,如:
    -P(DATA)MYDATA=100000-101FFF,110000-11lFFF
    如果用戶應(yīng)用系統(tǒng)還有一段RAM位于存儲器
    0x10F000~Oxl0F7FF,只要將這段范圍加到上述命令中即可:
    -P(DATA)MYDATA=100000-10lFFF,10F00010F7FF,110000-11lFFF


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

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


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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉