小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

英飛凌TC3xx MCAL中Tasking Link文件解析

 Kuai2012 2024-02-19 發(fā)布于廣東

注:后臺回復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 開始。

section_layout :vtc:linear{/*Far Data Sections, selectable with patterns and user defined sections*/  group  {      group (ordered, attributes=rw, run_addr=0x70001000)    {    select ".bss.user_test_bss";    }      group (ordered, attributes=rw, run_addr=0x70004000)    {    select ".data.user_test_data";    }  }}

在程序中定義如下,則run_cnt1 和 run_cnt2, 則 run_cnt1 就會放在 0x70001000, run_cnt2 放在 0x70004000。

#pragma section farbss "user_test_bss"volatile uint32 run_cnt1;#pragma section farbss restore
#pragma section fardata "user_test_data" volatile uint32 run_cnt2 = 0x1234;#pragma section fardata restore

把變量放在 DLMU,在 Link 文件已經(jīng)定義了各個 CPU 所屬的 DLMU 的段,如下:

group (ordered, attributes=rw, run_addr = mem:cpux_dlmu){  select ".data.*.lmudata_cpux";  select ".bss.*.lmubss_cpux";}

 把程序放在 PSRAM 中運行,有時候需要把程序放到RAM 去運行,例如在擦寫Flash 的時候,這個時候可以直接把代碼放在 ”FLSLOADERRAMCODE”段,也可以自己在 PSRAM 中再定義一個段,如下所示:

section_layout :vtc:linear{  group MY_RAM_CODE (ordered, attributes=rwx, copy, run_addr=mem:psram0)  {  select ".text.my_ram_code";  }}

在程序中定義如下, 這樣RunTest()這個函數(shù)就會在PSRAM0 中去運行:

void RunTest(void){run_cnt1++; run_cnt2++; run_cnt1_dsram1++; run_cnt2_dsram1++; run_cnt1_dlmu2++; run_cnt2_dlmu2++; run_cnt1_lmu++; run_cnt2_lmu++;}#pragma section code restore

把程序放在 PFLASH 中指定位置,如果需要把程序放在指定位置執(zhí)行,則可以在Link 文件中首先定義一個程序段,例如把程序放在0x80041000 開始的地址,則可以如下定義:

group  user_test_code (ordered, run_addr=0x80041000){select "(.text.user_test_code*)";}

在程序中定義如下,則AddTest()就會放在 0x80041000 地址:

#pragma section code "user_test_code" uint32 AddTest(uint32 a, uint32 b){  uint32 c = a+b;  return c;}#pragma section code restore

-end-

,??

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多