一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

優(yōu)化TC3xx系統(tǒng)運行效率的策略

汽車ECU開發(fā) ? 來源:汽車ECU開發(fā) ? 2024-11-16 11:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

目錄

1.Tricore尋址模式

2.lsl鏈接文件Section分析

3.限定符對于代碼的影響

4.小結(jié)

1.Tricore尋址模式

今天聊個好玩的事情。 之前ARM培訓(xùn)的時候,他們對于函數(shù)形參的先后順序、數(shù)據(jù)類型、對齊方式等等做了介紹,詳細(xì)分析了上述操作不同寫法對于CPU的通用寄存器使用效率上的影響,這給我留下了一點印象,但不多。 而最近我在用ADS驗英飛凌LMU、DSPR、PSRP等等訪問效率時,發(fā)現(xiàn)了這樣一行代碼:

#pragma section farbss lmubss
#pragma ,section,咱們都非常熟悉了,這個farbss是什么意思呢?以前做BSW還真沒多大關(guān)注這個。 查看Tasking的手冊,得到了一些答案,如下:

f2a05598-907f-11ef-a511-92fbcf53809c.png

可以看到,上述farbss這類屬于lsl里的section類型,而對于其memory 限定符則為__far,它表示遠(yuǎn)程數(shù)據(jù);再看其他的限定符,分別出現(xiàn)了__a0,__a1等等,很明顯講的是Tricore內(nèi)核的尋址模式,那么順著這個思路來捋捋線索,為代碼能力和系統(tǒng)優(yōu)化打基礎(chǔ)。 Tricore 1.6.2的編程模型長這樣:

f2bd716e-907f-11ef-a511-92fbcf53809c.png

總共32個通用寄存器,其中16個作為數(shù)據(jù)寄存器D[0]-D[15],16個作為地址寄存器A[0]-A[15],特別的,A[0]、A[1]、A[8]、A[9]還可以作為系統(tǒng)Global寄存器進(jìn)行使用,我們再回過頭來看看Tasking文件里給的memory限定符,似乎有某種聯(lián)系,因此接下來我們了解Tricore的尋址模式。 Tricore是32位機(jī),很明顯可以訪問4GBytes(2^32)的memory空間,這4GB空間分成了16個Segment[0H-FH],用地址高四位來索引,每個Segment為256MBytes,其用法如下:

f2d154e0-907f-11ef-a511-92fbcf53809c.png

所謂尋址模式,就是LoadStore這類指令訪問數(shù)據(jù)元素的機(jī)制,這些數(shù)據(jù)元素長度可以為8163264bits。Tricore提供了7種尋址模式,如下圖:

f2ddd788-907f-11ef-a511-92fbcf53809c.png

絕對尋址:主要用于I/O 外設(shè)寄存器和全局?jǐn)?shù)據(jù)的訪問,值得一提的是,這種方式只能訪問每個segment的前16K,原因如下:

f2ea7b5a-907f-11ef-a511-92fbcf53809c.png

利用高四位定位segment,利用低14位定位目標(biāo),而2^14剛好為16KB,這與Tasking memory限定符__near關(guān)聯(lián)。 基地址+偏移:主要用于局部變量、靜態(tài)數(shù)據(jù)等訪問,根據(jù)偏移的不同尋址方式可以分為short offset尋址(10 bits)和long offset尋址(16bits)。long offset尋址剛好就對應(yīng)__a0a1a8a9訪問。 故對于尋址方式與限定符關(guān)聯(lián)關(guān)系如下:

f303fd1e-907f-11ef-a511-92fbcf53809c.png

那這個__far到底指的是什么呢?根據(jù)手冊描述,指的是能夠訪問所有memory區(qū)域的數(shù)據(jù),難不成這些個限定符還會對匯編代碼有所影響嗎?這些限定符與鏈接文件有沒有關(guān)聯(lián)呢?

2.lsl鏈接文件Section分析

在ADS給的lsl模板中,可以看到關(guān)于上述限定符以及對應(yīng)section type的描述,例如:



/*Near Abbsolute Addressable Data Sections*/
section_layout abs18
{
group
    {
    }
}


/*Relative A0/A1/A8/A9 Addressable Sections*/
section_layout linear
{
group
    {
    }
}

  其中,abs18表示18bit絕對尋址空間,linear表示線性地址空間,如下圖所示:

f3102440-907f-11ef-a511-92fbcf53809c.png

.bss:未初始化數(shù)據(jù)

.bss_a0a1a8a9:未初始化數(shù)據(jù),用寄存器A0A1A8A9尋址

.data:已初始化數(shù)據(jù)

.data_a0a1a8a9:已初始化的數(shù)據(jù),用寄存器A0A1A8A9尋址

.sbss:未初始化的數(shù)據(jù),a0尋址

.sdata:已初始化的數(shù)據(jù),a0尋址

.zbss:未初始化數(shù)據(jù),abs18尋址

.zdata:已初始化數(shù)據(jù),abs18尋址

我們在Cpu0_main.c里定義兩個變量,不添加任何限定符,如下:

f3360926-907f-11ef-a511-92fbcf53809c.png

編譯生成出來的map,可以看到這兩個變量是放在.bss中: f349f152-907f-11ef-a511-92fbcf53809c.png?對應(yīng)lsl定義的Far Data Section:

f35eeb66-907f-11ef-a511-92fbcf53809c.png

如果加上限定符__near,如下:

uint32 __near example_x ;
uint32 __near example_y;

  編譯出來發(fā)現(xiàn)已經(jīng)放到了zbss段

f38aa0e4-907f-11ef-a511-92fbcf53809c.png

如果加上限定符__a0,我們會發(fā)現(xiàn)這時候編譯出了問題,如下:

ltc E121: relocation error in "task1": relocation value 0x50000000, type R_TRICORE_16SM, offset 0x34, section ".text.Cpu0_Main.core0_main" at address 0x800023bc is not within a 16-bit signed range from the value of A0 as defined by the symbol _SMALL_DATA_

這就意味著,如果要使用寄存器+偏移尋址的方式,那么就必須是A0A1...寄存器中內(nèi)容上下偏移±32KB,例如,當(dāng)A0寄存器里內(nèi)容為0xD0018000時,那么通過A0寄存器尋址的所有變量就應(yīng)該在0xD0010000 - 0xD001FFFF。這個場景后面構(gòu)建了我們再討論,但至少我們確定了利用寄存器+偏移的方式多用于局部變量訪問。

3.限定符對于代碼的影響

第二節(jié)我們發(fā)現(xiàn)了利用不同限定符將變量發(fā)到不同的section里,但是變量的地址始終沒有變化,那這到底有什么用呢? 編譯出來的C代碼最終會以匯編形式展示給機(jī)器,因此我們來看看不同限定符下對于代碼的影響。 1)添加__near限定符,編譯得到的結(jié)構(gòu),代碼如下:

uint32 __near example_x ;
uint32 __near example_y;
void main(void)
{
example_x = 3;
example_y=example_x+2;
}
得到匯編代碼如下

f3969ba6-907f-11ef-a511-92fbcf53809c.png

解釋如下:

將立即數(shù)3賦給寄存器D15

D15的值直接賦給變量(x)

立即數(shù)3賦給寄存器D15

D15和2相加

將D15的值直接賦給變量(y)

統(tǒng)計攏共5條指令完成x=3,y=x+2這個操作; 2)添加__far限定符,得到如下

uint32 __far example_x ;
uint32 __far example_y;
void main(void)
{
example_x = 3;
example_y=example_x+2;
}
匯編代碼如下:

f3b1b2e2-907f-11ef-a511-92fbcf53809c.png

解釋如下:

x的賦值:

將0x7000給到地址寄存器A15高16bit,低位補0,這時候A15 = 0x70000000

加載有效地址到A15,因為x地址為0x70000004,故A15 = 0x70000004

將數(shù)據(jù)3移至D15;

將D15賦給A15指向的地址

y的賦值

將0x7000給到地址寄存器A15高16bit,低位補0,這時候A15 = 0x70000000

加載有效地址到A15,因為y地址為0x70000008,故A15 = 0x70000008

將數(shù)據(jù)3移至D15,并加2;

將D15賦給A15指向的地址

總計9條指令,咋一看僅僅節(jié)省了4條指令,但從統(tǒng)計角度來看,效率提升了44.44%,F(xiàn)lash消耗更少了。 同樣兩行C代碼,僅僅因為尋址方式的不同,匯編指令差異如此之大 ,從而影響系統(tǒng)運行效率。

4.小結(jié)

現(xiàn)在MCU的性能越來越強(qiáng)大,導(dǎo)致我在使用上越來越隨意,對于這種特別底層的知識非常匱乏,直到遇到了系統(tǒng)優(yōu)化問題,才會去從這些角度來考慮??偨Y(jié)下來,在系統(tǒng)性能優(yōu)化時要注意:

構(gòu)建memory限定符使用場景以優(yōu)化代碼執(zhí)行效率;

多使用靠近CPU的memory,例如ARM TCM、Tricore DSPR、PSPR;

DCache數(shù)據(jù)一致性問題

通過調(diào)試匯編代碼,也更進(jìn)一步了解了Tricore內(nèi)核的運行原理;接下來,思考如何將這些理論引入到工程代碼中。

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

    關(guān)注

    31

    文章

    5430

    瀏覽量

    123911
  • 效率
    +關(guān)注

    關(guān)注

    0

    文章

    151

    瀏覽量

    20438
  • TriCore
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    11905

原文標(biāo)題:TC3xx分析--如何提高系統(tǒng)運行效率

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    三相電機(jī)驅(qū)動系統(tǒng)逆變器故障補救與容錯策略

    系統(tǒng)在不損失性能指標(biāo)或部分性能指標(biāo)有所降低的情況下安全運行。容錯和補救的前提是要對系統(tǒng)中的故障進(jìn)行診斷定位和隔離,對于逆變器故障,人們已提出了很多診斷和定位方法,文獻(xiàn)[3-7]對其進(jìn)行
    發(fā)表于 06-12 14:01

    請問tc3xx如何配置多個dedicatedRxBuffersNumber?

    tc3xx如何配置多個dedicatedRxBuffersNumber?
    發(fā)表于 04-21 07:53

    基于Infineon TC4D9+TLF4D985的Aurix StartKit

    狀態(tài)預(yù)測,提升續(xù)航里程、充電速度和電池壽命;牽引逆變器領(lǐng)域,其創(chuàng)新cDSP與虛擬傳感技術(shù)優(yōu)化能量回收與控制策略;在電源轉(zhuǎn)換方面,TC4xx支持SiC和GaN材料,集成高效控制功能,提升系統(tǒng)
    的頭像 發(fā)表于 04-16 14:16 ?615次閱讀
    基于Infineon <b class='flag-5'>TC</b>4D9+TLF4D985的Aurix StartKit

    電機(jī)大范圍調(diào)速的綜合電壓調(diào)制策略

    提高大范圍調(diào)速電機(jī)的運行效率,為系統(tǒng)的高效運行提供了有效途徑。 純分享帖,需要者可點擊附件獲取完整資料~~~ (免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如
    發(fā)表于 04-01 14:51

    嵌入式系統(tǒng)存儲的軟件優(yōu)化策略

    上抵消單位壽命低的劣勢。 (3)NAND的相關(guān)特點 ·系統(tǒng)的驅(qū)動主要是由SoC廠家及系統(tǒng)上游邏輯決定,針對不同的NAND存儲介質(zhì)無法發(fā)揮出最大優(yōu)勢,或者存在驅(qū)動邏輯兼容性問題。 ·NAND容易出現(xiàn)位
    發(fā)表于 02-28 14:17

    EE-401:ADSP-SC5xx/215xx SHARC處理器系統(tǒng)優(yōu)化技術(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-401:ADSP-SC5xx/215xx SHARC處理器系統(tǒng)優(yōu)化技術(shù).pdf》資料免費下載
    發(fā)表于 01-06 15:23 ?0次下載
    EE-401:ADSP-SC5<b class='flag-5'>xx</b>/215<b class='flag-5'>xx</b> SHARC處理器<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>優(yōu)化</b>技術(shù)

    如何優(yōu)化EEPROM的數(shù)據(jù)存儲策略

    。它廣泛應(yīng)用于需要存儲少量數(shù)據(jù)的場合,如微控制器、傳感器和嵌入式系統(tǒng)中。優(yōu)化EEPROM的數(shù)據(jù)存儲策略可以提高數(shù)據(jù)的可靠性、延長存儲器的使用壽命,并提高數(shù)據(jù)訪問效率。以下是一些
    的頭像 發(fā)表于 12-16 17:21 ?1294次閱讀

    電力系統(tǒng)中電動車充電樁布局與調(diào)度的優(yōu)化策略探究

    ,精準(zhǔn)確定充電樁的最優(yōu)布局方案。同時,結(jié)合電力系統(tǒng)運行模式、電網(wǎng)狀況及充電樁運營成本,設(shè)計出充電樁調(diào)度模型,并運用啟發(fā)式算法得出最佳調(diào)度策略。研究成果顯示,此方案顯著優(yōu)化了充電樁的布局
    的頭像 發(fā)表于 12-13 16:39 ?1432次閱讀
    電力<b class='flag-5'>系統(tǒng)</b>中電動車充電樁布局與調(diào)度的<b class='flag-5'>優(yōu)化</b><b class='flag-5'>策略</b>探究

    如何優(yōu)化智能系統(tǒng)運行效率

    智能系統(tǒng),無論是在工業(yè)自動化、智能家居還是個人設(shè)備中,都扮演著越來越重要的角色。隨著技術(shù)的發(fā)展,用戶對智能系統(tǒng)的期望也在不斷提高,這要求系統(tǒng)必須具備更高的運行
    的頭像 發(fā)表于 10-29 10:02 ?1073次閱讀

    請問AURIX TC3xx tricore架構(gòu)下浮點運算和將浮點數(shù)小數(shù)點去掉變成整數(shù)來計算哪種方式更加節(jié)省算力?

    AURIX TC3xx tricore架構(gòu)下浮點運算和將浮點數(shù)小數(shù)點去掉變成整數(shù)來計算哪種方式更加節(jié)省算力? 比如一個浮點數(shù)12.89V,如果將其寫成12890mV,再參與計算,哪種方式更加節(jié)省算力
    發(fā)表于 08-26 06:54

    請問EB tresos如何配置TC39XX的Flexray?

    EB tresos如何配置TC39XX 的 Flexray,在網(wǎng)絡(luò)上找不到相關(guān)的配置方法??梢蕴峁┮幌?EB 的配置工程嗎?
    發(fā)表于 08-14 08:14

    TC367 SYS RESET/APP RESET之后RAM不會清除怎么解決?

    我看了單片機(jī)干貨|AURIX? TC3xx 復(fù)位后RAM不初始化方法 - 知乎 (zhihu.com) 這篇文章,并且設(shè)置了UCB(僅僅設(shè)置了DFLASH_ORIG) ? 然后設(shè)置了一些變量
    發(fā)表于 07-24 07:23

    ERAY (FlexRay) 模塊卡在INTEGRATION_LISTEN狀態(tài),為什么?

    大家好, 我有 TC3XX 入門套件板,我想實施并測試 FlexRay 協(xié)議。 我的想法是在開發(fā)板上的兩個可用 ERAY 模塊之間實現(xiàn)環(huán)回。 我以演示項目為起點,只添加了 ERAY 模塊 1
    發(fā)表于 07-24 06:54

    針對特定內(nèi)核使用PFlash,是否會影響多核應(yīng)用程序的性能?

    根據(jù)AURIX TC3xx 系列用戶手冊第一部分(infineon.com)表 71,從本地內(nèi)核 PFlash 獲取指令所需的 CPU 周期比其他內(nèi)核快。因此,根據(jù)我的理解,映射到內(nèi)核 0 的運行
    發(fā)表于 07-04 06:04

    TC2XX/3XX多核斷點設(shè)置無效的原因?

    TC2XX/3XX多核斷點設(shè)置無效,請問hinghtec的多核要怎么才能被觸發(fā),(函數(shù)已經(jīng)執(zhí)行,但是斷點沒有被觸發(fā))或者如何才能進(jìn)行多核調(diào)試。
    發(fā)表于 07-03 07:33