hightec的編譯鏈接文件的后綴為ld,因此后文簡稱ld文件,ld文件主要分為三個部分:宏定義、MEMORY命令、SECTIONS命令。
1.宏定義
宏定義部分如下圖所示,該部分主要定義ld文件中常用的宏,便于ld文件的可讀性,格式如上圖所示。模板定義了STACK、CAS、HEAP、中斷相關(guān)的幾個宏,可以按照實際需求添加。
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,存儲代碼運行過程中產(chǎn)生的非易失性數(shù)據(jù)。
上圖中的MEMORY命令是對整個片上的RAM和FLASH資源進行劃分和定義,圖中整個分為3個部分:PFLASH、RAM、FLASHLOADER。
PFLASH主要劃分了幾個必要區(qū)域,如圖3.2所示,主要包括:BMI、Startup Code、Trap Table、Interrupt Table、Constant、Executable Code、Calibaration、OB Data、Backup。模板劃分的區(qū)域?qū)FLASH完成了基礎(chǔ)覆蓋,基本保證了每個區(qū)域空間冗余,同時也預(yù)留了部分空間用于區(qū)域擴展。模板并沒有對DFLASH進行劃分,這是因為DFLASH被用于模擬EPPROM,不參與代碼區(qū)域劃分。
RAM分為CPU0、CPU1、CPU2、LMU四個部分,前三個部分的RAM區(qū)域分別為核心1/2/3本地RAM,而LMU為芯片全局RAM。每個核心的本地RAM都依次劃分為7個區(qū)域:Calibration、SafeTLib、Local Data、Heap、Stack、CSA、Local Program;LMU作為芯片全局變量RAM,只劃分一個區(qū)域。如此一來對全部RAM空間進行了劃分。
FLASHLOADER作為特定功能代碼,單獨開辟PFLASH和PSPR空間來存放其功能代碼。
3.SECTIONS命令
“section”分為輸出段和輸入段,輸入段是在代碼中定義的section,輸出段是在LD文件的SECTIONS命令里定義的section,鏈接的過程就是將代碼中的輸入段鏈接到LD文件中的輸出段中,然后再將輸出段鏈接到MEMORY命令定義的區(qū)域中,從而實現(xiàn)代碼至內(nèi)存地址的唯一鏈接,而SECTIONS命令完成了輸出段的定義,輸入段至輸出段的鏈接、輸出段至MEMORY區(qū)域的鏈接這三個過程。
一個軟件工程的源代碼可分成若干個輸入段,如.text、.rodata、.data、.bss等等,這些輸入段表示了代碼的屬性。.text代表code;.rodata代表常數(shù);.data代表非0全局變量;.bss代表未初始化全局變量。這些輸入段都是默認(rèn)段類型,編譯器自動將代碼分解成各個段類型,除此之外還有如圖3.3的段默認(rèn)類型。
當(dāng)用戶需要自行建立新的輸入段時,只需要在代碼中定義好該段,并在SECTIONS命令中按語法鏈接至MEMORY區(qū)域中即可。這個過程中要注意兩點,一個是輸入段與輸出段按照規(guī)范命名,另一個是鏈接時的順序。
輸入段命名規(guī)范:.段類型.屬性.描述?!岸晤愋汀笔侵冈摱蔚哪J(rèn)段類型,如.bss;“屬性”是指該段的范圍屬性,如.Shared、.CPUx;“描述”是對該段的功能或特征描述。例:
a.“.text.CPU1.Ramcode”:該段是需要加載至核1的PSPR中運行的代碼。
b.“.rodata.Shared.DEFAULT_CONST_32BIT”:該段是32位的三核心共用的常數(shù)段。
c.“.sdata.CPU1.Private”:該段是核1的專用非0全局變量。
輸出段的命名規(guī)范:.屬性_描述_段類型。與輸出段相比,除了第一個“.”,其他間隔符都使用的“_”;屬性、描述和段類型的順序也做了改變;另外,輸出段命名只使用大寫字母。例:“.CPU1_RAMCODE_TEXT”、“. CPU0_PRIVATE_SDATA”。
輸入段和輸出段命名可以省略“屬性”或“描述”。
鏈接時,如果存在輸入段名字沖突的情況,會優(yōu)先按照在前面的輸入段鏈接命令執(zhí)行,如下圖所示。
".rodata.*"中的"*"是一個通配符,所以與“.rodata.FLSLOADERRAMCODE”產(chǎn)生沖突,最后編譯結(jié)果:輸入段".rodata.FLSLOADERRAMCODE"鏈接至區(qū)域“PMU_PFLASH0_CONST”,而非“FLSLOADER_RAM_CODE”。若要解決該問題,就需要修改輸入段的命名,或者將其順序提到“.rodata.*”前面去。
審核編輯:湯梓紅
-
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41774 -
文件
+關(guān)注
關(guān)注
1文章
571瀏覽量
24826 -
命令
+關(guān)注
關(guān)注
5文章
697瀏覽量
22117 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33060 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9053
原文標(biāo)題:淺談hightec的編譯鏈接文件
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
TC1766通過HIGHTec編譯不會產(chǎn)生elf文件怎么解決?
hightec編譯時,已添加路徑卻仍然有找不到文件的error是為什么?
HighTec怎么添加.o文件?
Infineon官網(wǎng)下載的Demo工程,Tasking編譯通過,移植Hightec報故障怎么解決?
ARM代碼編譯與鏈接調(diào)試是怎樣的一套流程
ARM代碼編譯鏈接的工作流程
【gcc編譯優(yōu)化系列】如何獲取gcc默認(rèn)的鏈接腳本
編譯器將.c文件編譯為.o文件鏈接的過程
HighTec Tricore編譯速度優(yōu)化策略探討
![<b class='flag-5'>HighTec</b> Tricore<b class='flag-5'>編譯</b>速度優(yōu)化策略探討](https://file1.elecfans.com/web2/M00/C8/A0/wKgaomYWGV2AYPo0AAAPok0cS84452.png)
評論