注:后臺回復ECU035獲取lsl學習資料。 在使用英飛凌芯片開發(fā)時,大多數(shù)會使用Tasking作為IDE開發(fā)軟件,在使用Tasking時,鏈接文件是其避開不了的話題。 1.MCAL中Link文件介紹 下面以TC387 為例,聊聊Link文件的解析以及代碼變量的定位方法。 首先TC387中每個CPU都有自己的PSRAM和 DSRAM,PSRAM 掛在指令總線上,而DSRAM 是掛在數(shù)據(jù)總線上,因此如果在 PSRAM 運行代碼,DSRAM 存放數(shù)據(jù),可以達到 0 cycle 等待,但PSRAM 上存放數(shù)據(jù)的,則效率低一點。 在 MCAL的Tasking link 文件中,每個CPU的DSRAM的存放如下圖所示. ▲圖1 各CPU的DSRAM分布 其中各段的定義如下: 1. CSA用于在函數(shù)調(diào)用或者進出中斷時保存通用寄存器的區(qū)域,具體可以看Tricore內(nèi)核參考手冊。大小由LCF_CSAx_SIZE決定; 2. ISTACK為中斷服務(wù)程序中使用的棧,它的大小由 LCF_ISTACKx_SIZE決定; 3. USTACK為用戶程序中使用的棧,它的大小由 LCF_USTACKx_SIZE決定; 4. Heap為程序中使用的堆,它的大小由 LCF_HEAP_SIZE 決定; 5. Predefine Data/Data區(qū)域是用來存放帶初始化值的全局變量,在MCAL的link文件中,這個區(qū)域有兩種類型,一種是預先定義的區(qū)域(Predefine Data)和默認區(qū)域(Data). 其中Predefine Data,主要放置MCAL中預制的C文件帶初始化值的變量,而用戶自定義的C文件中的初始化變量則放置在data段。 6. Predefine BSS/BSS:區(qū)域是用來存放沒有初始值的全局變量,在 link 文件中,這個區(qū)域有兩種類型,一種是預先定義的區(qū)域和默認區(qū)域,其邏輯與Predefine Data/Data一致。 除了PSRAM和DSRAM外,PFLash也是重要一塊,其主要用于存放常量和代碼。其中不帶Cache的地址從0xA0000000開始,帶Cache的從0x8000000開始。 在MCAL的Link文件中,常量和代碼的存放如下圖所示。 ▲圖2 各PFlash的分布 其中Predefined text/text、Predefined rodata/rodata與DSRAM中的Predefine Data/Data定義一致,其中text是用來存放代碼的,rodata用來存放數(shù)據(jù)常量。 2.代碼和變量定位 把變量放在DSRAM的固定位置,首先定義一個 data 段,從0x7001000 開始,一個 bss 段,從0x70004000 開始。
在程序中定義如下,則run_cnt1 和 run_cnt2, 則 run_cnt1 就會放在 0x70001000, run_cnt2 放在 0x70004000。
把變量放在 DLMU,在 Link 文件已經(jīng)定義了各個 CPU 所屬的 DLMU 的段,如下:
把程序放在 PSRAM 中運行,有時候需要把程序放到RAM 去運行,例如在擦寫Flash 的時候,這個時候可以直接把代碼放在 ”FLSLOADERRAMCODE”段,也可以自己在 PSRAM 中再定義一個段,如下所示:
在程序中定義如下, 這樣RunTest()這個函數(shù)就會在PSRAM0 中去運行:
把程序放在 PFLASH 中指定位置,如果需要把程序放在指定位置執(zhí)行,則可以在Link 文件中首先定義一個程序段,例如把程序放在0x80041000 開始的地址,則可以如下定義:
在程序中定義如下,則AddTest()就會放在 0x80041000 地址:
-end- 分享不易,懇請點個【??】和【在看】 |
|