精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺談hightec的編譯鏈接文件

汽車ECU開發 ? 來源:汽車ECU開發 ? 2023-03-15 11:13 ? 次閱讀

hightec的編譯鏈接文件的后綴為ld,因此后文簡稱ld文件,ld文件主要分為三個部分:宏定義、MEMORY命令、SECTIONS命令。

1.宏定義

宏定義部分如下圖所示,該部分主要定義ld文件中常用的宏,便于ld文件的可讀性,格式如上圖所示。模板定義了STACK、CAS、HEAP、中斷相關的幾個宏,可以按照實際需求添加。

ad0e9d16-c2de-11ed-bfe3-dac502259ad0.png

2.MEMORY命令

MEMORY命令主要用于劃分內存空間,將內存空間按照用途和種類劃分為區域,并定義各區域的名稱、大小、起始地址。模板提供的內存劃分如下圖所示:

ad75db34-c2de-11ed-bfe3-dac502259ad0.png

內存主要分為兩部分:RAM和FLASH。RAM又分為DSPR和PSPR,DSPR主要存儲變量、堆棧和上下文,PSPR主要存儲一些特殊用途的代碼。FLASH也分為PFLASH和DFLASH,PFLASH主要用于存儲非易失性代碼和常數,而DFLASH常用于模擬EPPROM,存儲代碼運行過程中產生的非易失性數據。

上圖中的MEMORY命令是對整個片上的RAM和FLASH資源進行劃分和定義,圖中整個分為3個部分:PFLASH、RAM、FLASHLOADER。

PFLASH主要劃分了幾個必要區域,如圖3.2所示,主要包括:BMI、Startup Code、Trap Table、Interrupt Table、Constant、Executable Code、Calibaration、OB Data、Backup。模板劃分的區域對PFLASH完成了基礎覆蓋,基本保證了每個區域空間冗余,同時也預留了部分空間用于區域擴展。模板并沒有對DFLASH進行劃分,這是因為DFLASH被用于模擬EPPROM,不參與代碼區域劃分。

RAM分為CPU0、CPU1、CPU2、LMU四個部分,前三個部分的RAM區域分別為核心1/2/3本地RAM,而LMU為芯片全局RAM。每個核心的本地RAM都依次劃分為7個區域:Calibration、SafeTLib、Local Data、Heap、Stack、CSA、Local Program;LMU作為芯片全局變量RAM,只劃分一個區域。如此一來對全部RAM空間進行了劃分。

FLASHLOADER作為特定功能代碼,單獨開辟PFLASH和PSPR空間來存放其功能代碼。

3.SECTIONS命令

“section”分為輸出段和輸入段,輸入段是在代碼中定義的section,輸出段是在LD文件的SECTIONS命令里定義的section,鏈接的過程就是將代碼中的輸入段鏈接到LD文件中的輸出段中,然后再將輸出段鏈接到MEMORY命令定義的區域中,從而實現代碼至內存地址的唯一鏈接,而SECTIONS命令完成了輸出段的定義,輸入段至輸出段的鏈接、輸出段至MEMORY區域的鏈接這三個過程。

一個軟件工程的源代碼可分成若干個輸入段,如.text、.rodata、.data、.bss等等,這些輸入段表示了代碼的屬性。.text代表code;.rodata代表常數;.data代表非0全局變量;.bss代表未初始化全局變量。這些輸入段都是默認段類型,編譯器自動將代碼分解成各個段類型,除此之外還有如圖3.3的段默認類型。

ada68130-c2de-11ed-bfe3-dac502259ad0.png

當用戶需要自行建立新的輸入段時,只需要在代碼中定義好該段,并在SECTIONS命令中按語法鏈接至MEMORY區域中即可。這個過程中要注意兩點,一個是輸入段與輸出段按照規范命名,另一個是鏈接時的順序。

輸入段命名規范:.段類型.屬性.描述?!岸晤愋汀笔侵冈摱蔚哪J段類型,如.bss;“屬性”是指該段的范圍屬性,如.Shared、.CPUx;“描述”是對該段的功能或特征描述。例:

a.“.text.CPU1.Ramcode”:該段是需要加載至核1的PSPR中運行的代碼。

b.“.rodata.Shared.DEFAULT_CONST_32BIT”:該段是32位的三核心共用的常數段。

c.“.sdata.CPU1.Private”:該段是核1的專用非0全局變量。

輸出段的命名規范:.屬性_描述_段類型。與輸出段相比,除了第一個“.”,其他間隔符都使用的“_”;屬性、描述和段類型的順序也做了改變;另外,輸出段命名只使用大寫字母。例:“.CPU1_RAMCODE_TEXT”、“. CPU0_PRIVATE_SDATA”。

輸入段和輸出段命名可以省略“屬性”或“描述”。

鏈接時,如果存在輸入段名字沖突的情況,會優先按照在前面的輸入段鏈接命令執行,如下圖所示。

ade17006-c2de-11ed-bfe3-dac502259ad0.png

".rodata.*"中的"*"是一個通配符,所以與“.rodata.FLSLOADERRAMCODE”產生沖突,最后編譯結果:輸入段".rodata.FLSLOADERRAMCODE"鏈接至區域“PMU_PFLASH0_CONST”,而非“FLSLOADER_RAM_CODE”。若要解決該問題,就需要修改輸入段的命名,或者將其順序提到“.rodata.*”前面去。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 中斷
    +關注

    關注

    5

    文章

    895

    瀏覽量

    41401
  • 文件
    +關注

    關注

    1

    文章

    561

    瀏覽量

    24703
  • 命令
    +關注

    關注

    5

    文章

    678

    瀏覽量

    21987
  • 編譯
    +關注

    關注

    0

    文章

    654

    瀏覽量

    32814
  • 宏定義
    +關注

    關注

    0

    文章

    50

    瀏覽量

    9002

原文標題:淺談hightec的編譯鏈接文件

文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言的編譯鏈接過程

    ? C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼轉換成可以在硬件上運行的程序(可執行代碼),需要進行編譯鏈接。編譯就是把文本形式源代
    的頭像 發表于 08-21 10:06 ?2513次閱讀
    C語言的<b class='flag-5'>編譯</b><b class='flag-5'>鏈接</b>過程

    TC1766通過HIGHTec編譯不會產生elf文件怎么解決?

    TC1766,在DAVE生成工程時,其編譯器選項只有GNU和TASKing,導入到HIGHTec編譯時不會產生elf文件;TC1767的話,生成DAVE工程的
    發表于 02-04 09:35

    hightec編譯時,已添加路徑卻仍然有找不到文件的error是為什么?

    如題,Hightec編譯時,已在properties中添加complier包含的文件路徑,仍然編譯不通過,顯示找不到文件的error。哪位大
    發表于 02-05 06:37

    hightec中如何將源代封裝,并編譯鏈接成.a的庫函數?

    hightec中如何將源代封裝,并編譯鏈接成.a的庫函數
    發表于 02-18 08:10

    HighTec怎么添加.o文件?

    請問大神HighTec怎么添加.o文件,我現在有個軟件包,其中幾個函數沒有源碼,軟件包里提供的是.o文件里面包含了這幾個函數,該怎么添加到編譯器里才能
    發表于 02-18 07:16

    Infineon官網下載的Demo工程,Tasking編譯通過,移植Hightec報故障怎么解決?

    Demo工程在Tasking工程中,編譯成功。 按照論壇大神之前分享的資料移植至Hightec編譯器(lsl鏈接文件路徑已修改,頭
    發表于 02-20 08:11

    淺談 Atmel Studio 6和IAR C編譯器之間的鏈接問題

    淺談 Atmel Studio 6和IAR C編譯器之間的鏈接問題
    的頭像 發表于 07-04 09:50 ?3511次閱讀

    ARM代碼編譯鏈接調試是怎樣的一套流程

    鏈接就是把編譯生成的目標文件鏈接庫處理成為相應ELF格式的映像文件(image),最終的文件
    發表于 03-09 16:30 ?948次閱讀

    GCC程序編譯的靜態鏈接和動態鏈接

    靜態鏈接使用靜態庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態鏈接生成的程序體積較大(即使是在靜態鏈接中,整個庫文件
    的頭像 發表于 11-12 15:50 ?2616次閱讀
    GCC程序<b class='flag-5'>編譯</b>的靜態<b class='flag-5'>鏈接</b>和動態<b class='flag-5'>鏈接</b>

    ARM代碼編譯鏈接的工作流程

    ARM處理器在市面上到處都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的種類繁多,今天我們就來了解一下ARM代碼編譯鏈接的工作流程,以及過程中需要的相關概念信息
    的頭像 發表于 12-22 16:57 ?2122次閱讀

    編譯鏈接的套路有哪些?

    令參數: ? g++-c file 編譯文件,但是不進行鏈接-o file 指定輸出文件的名字-s strip,移除符號信息-L dir 指令搜索
    的頭像 發表于 02-10 10:06 ?1473次閱讀
    <b class='flag-5'>編譯</b><b class='flag-5'>鏈接</b>的套路有哪些?

    嵌入式系統鏈接文件的使用與解析

    0X00 鏈接文件介紹這里以KEA128芯片,使用KDS編譯為例,鏈接文件顧名思義就是嵌入式工程在鏈接
    發表于 12-20 19:34 ?6次下載
    嵌入式系統<b class='flag-5'>鏈接</b><b class='flag-5'>文件</b>的使用與解析

    【gcc編譯優化系列】如何獲取gcc默認的鏈接腳本

    我們都知道在一般的嵌入式開發中,使用gcc編譯固件的一般流程是,先把所有的.c文件和.s文件編譯成.o文件,然后把所有的.o
    的頭像 發表于 07-11 09:15 ?3384次閱讀

    編譯器將.c文件編譯為.o文件鏈接的過程

    對大多數童鞋來說理解編譯器將.c文件編譯為.o文件并不大困難,但是卻難以明白最后鏈接的過程是什么作用和為什么要這樣做?
    的頭像 發表于 10-13 09:36 ?4809次閱讀

    HighTec Tricore編譯速度優化策略探討

    HighTec編譯時默認是根據工程源文件文件架構首先生成makefile文件,然后執行“make makefile”指令來
    的頭像 發表于 04-10 12:44 ?1850次閱讀
    <b class='flag-5'>HighTec</b> Tricore<b class='flag-5'>編譯</b>速度優化策略探討