hightec的編譯鏈接文件的后綴為ld,因此后文簡稱ld文件,ld文件主要分為三個(gè)部分:宏定義、MEMORY命令、SECTIONS命令。
1.宏定義
宏定義部分如下圖所示,該部分主要定義ld文件中常用的宏,便于ld文件的可讀性,格式如上圖所示。模板定義了STACK、CAS、HEAP、中斷相關(guān)的幾個(gè)宏,可以按照實(shí)際需求添加。
2.MEMORY命令
MEMORY命令主要用于劃分內(nèi)存空間,將內(nèi)存空間按照用途和種類劃分為區(qū)域,并定義各區(qū)域的名稱、大小、起始地址。模板提供的內(nèi)存劃分如下圖所示:
內(nèi)存主要分為兩部分:RAM和FLASH。RAM又分為DSPR和PSPR,DSPR主要存儲變量、堆棧和上下文,PSPR主要存儲一些特殊用途的代碼。FLASH也分為PFLASH和DFLASH,PFLASH主要用于存儲非易失性代碼和常數(shù),而DFLASH常用于模擬EPPROM,存儲代碼運(yùn)行過程中產(chǎn)生的非易失性數(shù)據(jù)。
上圖中的MEMORY命令是對整個(gè)片上的RAM和FLASH資源進(jìn)行劃分和定義,圖中整個(gè)分為3個(gè)部分:PFLASH、RAM、FLASHLOADER。
PFLASH主要?jiǎng)澐至藥讉€(gè)必要區(qū)域,如圖3.2所示,主要包括:BMI、Startup Code、Trap Table、Interrupt Table、Constant、Executable Code、Calibaration、OB Data、Backup。模板劃分的區(qū)域?qū)FLASH完成了基礎(chǔ)覆蓋,基本保證了每個(gè)區(qū)域空間冗余,同時(shí)也預(yù)留了部分空間用于區(qū)域擴(kuò)展。模板并沒有對DFLASH進(jìn)行劃分,這是因?yàn)镈FLASH被用于模擬EPPROM,不參與代碼區(qū)域劃分。
RAM分為CPU0、CPU1、CPU2、LMU四個(gè)部分,前三個(gè)部分的RAM區(qū)域分別為核心1/2/3本地RAM,而LMU為芯片全局RAM。每個(gè)核心的本地RAM都依次劃分為7個(gè)區(qū)域:Calibration、SafeTLib、Local Data、Heap、Stack、CSA、Local Program;LMU作為芯片全局變量RAM,只劃分一個(gè)區(qū)域。如此一來對全部RAM空間進(jìn)行了劃分。
FLASHLOADER作為特定功能代碼,單獨(dú)開辟PFLASH和PSPR空間來存放其功能代碼。
3.SECTIONS命令
“section”分為輸出段和輸入段,輸入段是在代碼中定義的section,輸出段是在LD文件的SECTIONS命令里定義的section,鏈接的過程就是將代碼中的輸入段鏈接到LD文件中的輸出段中,然后再將輸出段鏈接到MEMORY命令定義的區(qū)域中,從而實(shí)現(xiàn)代碼至內(nèi)存地址的唯一鏈接,而SECTIONS命令完成了輸出段的定義,輸入段至輸出段的鏈接、輸出段至MEMORY區(qū)域的鏈接這三個(gè)過程。
一個(gè)軟件工程的源代碼可分成若干個(gè)輸入段,如.text、.rodata、.data、.bss等等,這些輸入段表示了代碼的屬性。.text代表code;.rodata代表常數(shù);.data代表非0全局變量;.bss代表未初始化全局變量。這些輸入段都是默認(rèn)段類型,編譯器自動將代碼分解成各個(gè)段類型,除此之外還有如圖3.3的段默認(rèn)類型。
當(dāng)用戶需要自行建立新的輸入段時(shí),只需要在代碼中定義好該段,并在SECTIONS命令中按語法鏈接至MEMORY區(qū)域中即可。這個(gè)過程中要注意兩點(diǎn),一個(gè)是輸入段與輸出段按照規(guī)范命名,另一個(gè)是鏈接時(shí)的順序。
輸入段命名規(guī)范:.段類型.屬性.描述。“段類型”是指該段的默認(rèn)段類型,如.bss;“屬性”是指該段的范圍屬性,如.Shared、.CPUx;“描述”是對該段的功能或特征描述。例:
a.“.text.CPU1.Ramcode”:該段是需要加載至核1的PSPR中運(yùn)行的代碼。
b.“.rodata.Shared.DEFAULT_CONST_32BIT”:該段是32位的三核心共用的常數(shù)段。
c.“.sdata.CPU1.Private”:該段是核1的專用非0全局變量。
輸出段的命名規(guī)范:.屬性_描述_段類型。與輸出段相比,除了第一個(gè)“.”,其他間隔符都使用的“_”;屬性、描述和段類型的順序也做了改變;另外,輸出段命名只使用大寫字母。例:“.CPU1_RAMCODE_TEXT”、“. CPU0_PRIVATE_SDATA”。
輸入段和輸出段命名可以省略“屬性”或“描述”。
鏈接時(shí),如果存在輸入段名字沖突的情況,會優(yōu)先按照在前面的輸入段鏈接命令執(zhí)行,如下圖所示。
".rodata.*"中的"*"是一個(gè)通配符,所以與“.rodata.FLSLOADERRAMCODE”產(chǎn)生沖突,最后編譯結(jié)果:輸入段".rodata.FLSLOADERRAMCODE"鏈接至區(qū)域“PMU_PFLASH0_CONST”,而非“FLSLOADER_RAM_CODE”。若要解決該問題,就需要修改輸入段的命名,或者將其順序提到“.rodata.*”前面去。
審核編輯:湯梓紅
-
中斷
+關(guān)注
關(guān)注
5文章
904瀏覽量
42500 -
文件
+關(guān)注
關(guān)注
1文章
578瀏覽量
25190 -
命令
+關(guān)注
關(guān)注
5文章
726瀏覽量
22663 -
編譯
+關(guān)注
關(guān)注
0文章
676瀏覽量
33733 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9175
原文標(biāo)題:淺談hightec的編譯鏈接文件
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言的編譯鏈接過程

TC1766通過HIGHTec編譯不會產(chǎn)生elf文件怎么解決?
hightec編譯時(shí),已添加路徑卻仍然有找不到文件的error是為什么?
HighTec怎么添加.o文件?
Infineon官網(wǎng)下載的Demo工程,Tasking編譯通過,移植Hightec報(bào)故障怎么解決?
ARM代碼編譯與鏈接調(diào)試是怎樣的一套流程
ARM代碼編譯鏈接的工作流程
【gcc編譯優(yōu)化系列】如何獲取gcc默認(rèn)的鏈接腳本
編譯器將.c文件編譯為.o文件鏈接的過程
HighTec Tricore編譯速度優(yōu)化策略探討

評論