吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入解析Tricore的Tasking鏈接文件

汽車ECU開發(fā) ? 來源:汽車ECU開發(fā) ? 2024-11-12 16:31 ? 次閱讀

目錄

1.鏈接文件有什么用?

2.文件結(jié)構(gòu)和語法解析

2.1 文件結(jié)構(gòu)

2.2 語法解析

3.小結(jié)

玩慣了ld文件,突然讓搞lsl文件,被其中花里胡哨的語法搞暈了,例如:


memory cpu0_dlmu
{
   mau = 8;
   size = 64k;
   type = ram;
   map     cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
   map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k,priority=8);
}
雖然這個字面意思寫的很清楚,但是在鏈接器實際運行時有什么不一樣嗎,mau、priority具體表示什么?因此有必要搞一搞其底層原理。 編譯原理這里就不多談了,咱們直接從鏈接器開始走起。

1.鏈接文件有什么用?

Tasking 鏈接器將Linker和Locator集合到一起, Linker階段主要把 .o文件、lib文件組合成一個可重定位的對象文件,例如.out;Locator主要用于給上述.out文件重新分配絕對地址,并生成目標(biāo)處理器的文件,例如elf、hex、s19等,總體流程如下圖:

fe2b5f7e-905d-11ef-a511-92fbcf53809c.png

在連接過程中,lsl(Linker Script Language)文件起到了非常關(guān)鍵的作用:

確定當(dāng)前目標(biāo)處理的內(nèi)核硬件架構(gòu),例如邏輯地址和物理地址的偏移等;

確定當(dāng)前系統(tǒng)的memory位置,例如RAM、ROM首地址和長度等;

確定代碼數(shù)據(jù)放到memory的什么位置,這也是我們主要關(guān)心的點,控制數(shù)據(jù)代碼到指定位置;

有了上述基本了解,我們來看看lsl的一些關(guān)鍵語法。

2.文件結(jié)構(gòu)和語法解析

2.1 文件結(jié)構(gòu)

lsl鏈接文件主要包含如下幾個部分:

內(nèi)核架構(gòu)的定義:幫助linker將目標(biāo)內(nèi)核的邏輯地址轉(zhuǎn)換為物理地址,可能還包括中斷向量表、棧的定義等,一般來說編譯器會把這個定義好,例如tc1v1_6_2.lsl;

派生的定義:主要是用于描述內(nèi)部總線定義、memeory定義等;

處理器的定義:用于定義單核還是多核,以及對應(yīng)內(nèi)核實例

段的定義:控制自定義段的具體位置

框架如下如下:

fe405384-905d-11ef-a511-92fbcf53809c.png

2.2 語法解析

首先來看幾個最常見到但是沒有關(guān)心過的關(guān)鍵字,以開頭代碼為例:

mau:Minimal Addressable Units,最小可尋址單元,對Tricore來說就是1 byte,對應(yīng)數(shù)字 8;

type:指定memory類型,常見的如rom,ram,nvram(任意時刻都可以修改),blockram

map:該關(guān)鍵字將源地址轉(zhuǎn)為目的地址,具體映射關(guān)系如下:

space => space

space => bus

bus => bus

memory => bus

上述幾個關(guān)鍵字接下來我們就來分析幾個常用的語法。 定義memory的基本格式如下:


memory mem_name
{
    type = xx;
    mau = xx;
    size = 64k;
    map map_name ( map_description );
}
以定義TC3xx CPU0 DSPR的空間為例,代碼如下:

memory dsram0 // Data Scratch Pad Ram
 {
   mau = 8;
size=240k;
type=ram;
map(dest=busfpi_bus,dest_offset=0xd0000000,size=240k,priority=8);
map(dest=bus:sri,dest_offset=0x70000000,size=240k);
}
mau = 8,表示最小尋址單位為1 byte;整塊memory為240k,屬于ram類型;比較好玩的是下面兩塊map,我們來看第一個:

map (dest=busfpi_bus, dest_offset=0xd0000000, size=240k, priority=8)
目的地是Tricore 0 的FPI 總線,偏移為0xd0000000,size為240k,優(yōu)先級為8;我們回過頭看TC3xx的手冊,會發(fā)現(xiàn)CH、DH這個Segment是保留的,這就奇怪了,鏈接文件為什么要定義這個東西?直覺告訴我這個可能和Tricore尋址方式有關(guān)系。 fpi_bus用于將CPU等連接至中低帶寬外設(shè),對應(yīng)具體實例為SPB(系統(tǒng)外設(shè)額總線)、BBB(ADAS domain相關(guān)),位寬32bit;如下圖:

fe66e62a-905d-11ef-a511-92fbcf53809c.png

其次,針對CHDH的用途在map中也給出體現(xiàn),如下

fe7f2a32-905d-11ef-a511-92fbcf53809c.png

我們繼續(xù)翻看5.3.6.1.1章節(jié),詳細(xì)描述了本地和全局尋址方式。 核內(nèi)DSPR位置始終為0xD0000000,PSPR為0xC000000,可以理解這是本地地址;而在多核系統(tǒng)中,根據(jù)Core ID,PSPR和DSPR分別對應(yīng)1-7H,這就是所謂的全局地址,如下:

fe9ac008-905d-11ef-a511-92fbcf53809c.png

但是,還有但是,CPU始終是用全局進行總線傳輸,意味著即使CPU0從本地DSPR拿數(shù)據(jù),仍然使用是的7000000的地址。 所以緊接著定義了關(guān)于多核globle的map,如下:

map (dest=bus:sri, dest_offset=0x70000000, size=240k);
那么在鏈接的時候,linker如何知道用0x7開頭還是0xd開頭的呢?根據(jù)后面的priority優(yōu)先級來定。 在測試優(yōu)先級的時候,上面關(guān)于DSPR的例子舉的不好,因為不管我怎么調(diào)優(yōu)先級都還是用的global地址,除了在調(diào)試時將某些指定到本地地址,如下: feb59efa-905d-11ef-a511-92fbcf53809c.png 所以換個DLMU來搞,cpu0_dlmu memory定義如下:

memory cpu0_dlmu
{
    mau = 8;
    size = 64k;
    type = ram;
    map     cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
    map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k);
}
我們將變量放到cpu0dlmu0,在不設(shè)置優(yōu)先級的情況下,編譯結(jié)果如下: fecb5f7e-905d-11ef-a511-92fbcf53809c.png 將not_cached地址優(yōu)先級提高,結(jié)果如下: fedd0b16-905d-11ef-a511-92fbcf53809c.png 這里我們基本可以得出結(jié)論:數(shù)值越高,優(yōu)先級越高。 我們將cached ot_cached的代碼互換位置,優(yōu)先級不變,結(jié)果如下: fef2f976-905d-11ef-a511-92fbcf53809c.png 這就很神奇了,好像不是優(yōu)先級相同,先到先得,而是默認(rèn)為cached,這是為什么呢? 我們就從這個變量放置的段來找答案,對于section的定義,有兩種關(guān)鍵詞: section_setup:定義堆棧、copy、table、啟動地址等等

section_setup ::my_space
{
    reserved address range
    stack definition
    heap definition
    copy table definition
    start address
    space reference restrictions
    input section modifications
    section reference restrictions
    MPU data table
}

ff0d9cd6-905d-11ef-a511-92fbcf53809c.png

section_layout:定義一個或者多個section,并賦予section一個地址空間,可以指定運行地址、加載地址,section空間大小等等;可以這樣理解,我們寫的代碼、數(shù)據(jù)存放位置是在linker里lsl里的section指定,在車規(guī)中常常會會將標(biāo)定數(shù)據(jù)、信息安全數(shù)據(jù)等放置到特定位置,因此掌握這部分內(nèi)容是比較重要的。 實例如下:

ff311846-905d-11ef-a511-92fbcf53809c.png

仔細(xì)看,在示例中section_layout里還定義group了,它包含了一個或者多個input section,因此需要使用語法select 選擇section。 在上一個試驗中,我們把g_DataTest放到了section lmubss_cpu0,如下圖:

ff4e8d18-905d-11ef-a511-92fbcf53809c.png

該section在lsl鏈接文件中定義如下:

ff602172-905d-11ef-a511-92fbcf53809c.png

注意看,此時run_addr為cpu0_dlmu,對應(yīng)memory:

ff73aad0-905d-11ef-a511-92fbcf53809c.png

編譯出來是cached地址,那有沒有辦法讓它在non-cached的地址? 根據(jù)lsl說明,使用語法:

group (run_addr = mem:A/map_name)
修改如下:

ff8ba8e2-905d-11ef-a511-92fbcf53809c.png

編譯得到結(jié)果如下: ffa1796a-905d-11ef-a511-92fbcf53809c.png

3.小結(jié)

上面兩節(jié)將lsl的基本框架和常用語法進行了梳理,其中比較重要的就是memory定義和section定義,這里最后再總結(jié)下如何將數(shù)據(jù)或者代碼放到指定位置:

首先定義一塊memory,使用語法memory name{ },指定map地址,mau,size;

在section_layout里用group定義運行地址,如有必要定義加載地址;

代碼里在待處理的數(shù)據(jù)或者代碼前后添加限定符#pragma,或者_(dá)_attribute__ ((section".name"))

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7145

    瀏覽量

    89587
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4828

    瀏覽量

    69059
  • TriCore
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    11768

原文標(biāo)題:基于Tricore的Tasking鏈接文件解讀

文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    深入探討Linux系統(tǒng)中的動態(tài)鏈接庫機制

    本文將深入探討Linux系統(tǒng)中的動態(tài)鏈接庫機制,這其中包括但不限于全局符號介入、延遲綁定以及地址無關(guān)代碼等內(nèi)容。 引言 在軟件開發(fā)過程中,動態(tài)庫鏈接問題時常出現(xiàn),這可能導(dǎo)致符號沖突,從而引起程序運行
    的頭像 發(fā)表于 12-18 10:06 ?192次閱讀
    <b class='flag-5'>深入</b>探討Linux系統(tǒng)中的動態(tài)<b class='flag-5'>鏈接</b>庫機制

    TASKING蒞臨紫光同芯參觀交流

    近日,TASKING全球CEO Gregor Zink、中國區(qū)總經(jīng)理王龍飛等一行到訪紫光同芯,進行參觀交流。
    的頭像 發(fā)表于 11-30 16:02 ?624次閱讀

    tasking導(dǎo)入文件不顯示

    Tasking導(dǎo)入zip文件,在這里project顯示不了文件,有沒有老兄知道怎么辦,重裝幾遍了
    發(fā)表于 10-28 14:28

    富芮坤主從一體多鏈接通信協(xié)議解析

    在先前我們已經(jīng)介紹了富芮坤主從一體多鏈接的概念,現(xiàn)在,我們將深入解析其技術(shù)文檔,為大家提供更詳盡的說明。
    的頭像 發(fā)表于 10-22 10:34 ?338次閱讀
    富芮坤主從一體多<b class='flag-5'>鏈接</b>通信協(xié)議<b class='flag-5'>解析</b>

    在Windows構(gòu)建環(huán)境中使用Tasking編譯器時出現(xiàn)Makefile文件錯誤的原因?

    在構(gòu)建項目時顯示以下錯誤 ltc E104:輸入文件不一致:鏈接文件 ASIN_02.o 用于"TC1V1.6.2" ,而任務(wù)用于"
    發(fā)表于 07-05 06:41

    Tasking6.2.2中怎樣修改lsl文件

    之前老項目用的是Tasking 4.2.2的編譯器,現(xiàn)在換成了Tasking 6.2.2,鏈接的時候發(fā)現(xiàn)下面的語句似乎6.2.2不識別,在6.2.2中不知道怎樣修改lsl文件? (黑體
    發(fā)表于 05-29 06:28

    如何使用AURIX?將Erika操作系統(tǒng)移植到TC387-QP MCU中?

    作室v1.9.20(Windows 11 / 64位) 2.GCC / TASKING 編譯器 3. TC382-QP TriCore? MCU 4.Erika OS(在此以 ZIP 格式共享)
    發(fā)表于 05-17 14:03

    鏈接與硬鏈接的區(qū)別

    鏈接又叫符號鏈接,和原文件不是一個文件,類似Windows的快捷方式,如果原始文件被刪除,所有指向它的符號
    的頭像 發(fā)表于 04-19 10:09 ?1271次閱讀
    軟<b class='flag-5'>鏈接</b>與硬<b class='flag-5'>鏈接</b>的區(qū)別

    深入解析與無線通信RFIC設(shè)計與測試實用指南

    深入解析與無線通信RFIC設(shè)計與測試實用指南
    發(fā)表于 04-16 11:03 ?353次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>與無線通信RFIC設(shè)計與測試實用指南

    在Windows構(gòu)建環(huán)境中使用Tasking編譯器時出現(xiàn)Makefile文件錯誤的原因?如何解決?

    $(工具路徑)$( LIBRARY_PATH ) $( LIBRARIES ) -I $( CONFIG_PATH ) -dLcf_Tasking_Tricore_Tc.lsl --cpu=tc23x
    發(fā)表于 03-05 07:59

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

    Demo工程在Tasking工程中,編譯成功。 按照論壇大神之前分享的資料移植至Hightec編譯器(lsl鏈接文件路徑已修改,頭文件已添加,),編譯報錯,如何解決?該在哪個
    發(fā)表于 02-20 08:11

    在做simulink+tasking自動代碼生成時,編譯找不到底層文件是為什么?

    在做simulink+tasking自動代碼生成時,編譯找不到底層文件,將文件添加進去后,會出現(xiàn)RT或NRT等重復(fù)定義
    發(fā)表于 02-20 08:06

    EB工程如何導(dǎo)入Tasking

    EB工程如何導(dǎo)入Tasking
    發(fā)表于 02-20 06:24

    tasking是如何生成bin文件的?

    有沒大神做過Tasking生成bin文件呢?
    發(fā)表于 02-19 07:39

    Tasking會編譯未被調(diào)用到的代碼嗎?如何使得tasking不編譯它們?

    Tasking 會編譯 未被調(diào)用到的代碼嗎,如何使得tasking 不編譯它們
    發(fā)表于 02-18 06:15
    百家乐输惨了| 打百家乐的介绍| 百汇娱乐| 百家乐21点桌| 百家乐官网游戏打水方法| 百家乐平预测软件| 一共33楼24楼风水怎么说| 德昌县| 龍城百家乐的玩法技巧和规则| 百家乐官网单人操作扫描道具| 棋牌游戏评测网| 德州百家乐赌博规则| 百家乐官网赌博论坛博客| bet365备用器| 菲利宾百家乐现场| 大世界百家乐官网娱乐场| 赌场里的美少年| 凯斯网百家乐的玩法技巧和规则| 百家乐官网正网| 百家乐官网分析概率原件| 顶级赌场官方下载| 赌博百家乐技巧| 澳门百家乐官网博牌| 大发扑克下载| 大上海百家乐官网娱乐城| 五原县| 大发888中期| 百家乐扑克片礼服| 德晋百家乐官网的玩法技巧和规则 | 澳门百家乐一把决战输赢| 百家乐官网开线| 榆林市| 大发888真钱下载| 百家乐翻天主题曲| 天玉经24山水法| 澳门百家乐官网走势图怎么看 | 大发888博彩论坛贴吧| 澳门百家乐破解方法| 犹太人百家乐官网的玩法技巧和规则 | G3百家乐官网的玩法技巧和规则 | 百家乐几点开奖|