目錄
1.Tricore尋址模式
2.lsl鏈接文件Section分析
3.限定符對(duì)于代碼的影響
4.小結(jié)
1.Tricore尋址模式
今天聊個(gè)好玩的事情。 之前ARM培訓(xùn)的時(shí)候,他們對(duì)于函數(shù)形參的先后順序、數(shù)據(jù)類(lèi)型、對(duì)齊方式等等做了介紹,詳細(xì)分析了上述操作不同寫(xiě)法對(duì)于CPU的通用寄存器使用效率上的影響,這給我留下了一點(diǎn)印象,但不多。 而最近我在用ADS驗(yàn)英飛凌LMU、DSPR、PSRP等等訪問(wèn)效率時(shí),發(fā)現(xiàn)了這樣一行代碼:
#pragma section farbss lmubss#pragma ,section,咱們都非常熟悉了,這個(gè)farbss是什么意思呢?以前做BSW還真沒(méi)多大關(guān)注這個(gè)。 查看Tasking的手冊(cè),得到了一些答案,如下:






2.lsl鏈接文件Section分析
在ADS給的lsl模板中,可以看到關(guān)于上述限定符以及對(duì)應(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絕對(duì)尋址空間,linear表示線性地址空間,如下圖所示:

.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尋址
我們?cè)贑pu0_main.c里定義兩個(gè)變量,不添加任何限定符,如下:

編譯生成出來(lái)的map,可以看到這兩個(gè)變量是放在.bss中:
?對(duì)應(yīng)lsl定義的Far Data Section:

如果加上限定符__near,如下:
uint32 __near example_x ; uint32 __near example_y;
編譯出來(lái)發(fā)現(xiàn)已經(jīng)放到了zbss段

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時(shí),那么通過(guò)A0寄存器尋址的所有變量就應(yīng)該在0xD0010000 - 0xD001FFFF。這個(gè)場(chǎng)景后面構(gòu)建了我們?cè)儆懻?,但至少我們確定了利用寄存器+偏移的方式多用于局部變量訪問(wèn)。
3.限定符對(duì)于代碼的影響
第二節(jié)我們發(fā)現(xiàn)了利用不同限定符將變量發(fā)到不同的section里,但是變量的地址始終沒(méi)有變化,那這到底有什么用呢? 編譯出來(lái)的C代碼最終會(huì)以匯編形式展示給機(jī)器,因此我們來(lái)看看不同限定符下對(duì)于代碼的影響。 1)添加__near限定符,編譯得到的結(jié)構(gòu),代碼如下:
uint32 __near example_x ;
uint32 __near example_y;
void main(void)
{
example_x = 3;
example_y=example_x+2;
}
得到匯編代碼如下

將立即數(shù)3賦給寄存器D15
D15的值直接賦給變量(x)
立即數(shù)3賦給寄存器D15
D15和2相加
將D15的值直接賦給變量(y)
統(tǒng)計(jì)攏共5條指令完成x=3,y=x+2這個(gè)操作; 2)添加__far限定符,得到如下
uint32 __far example_x ;
uint32 __far example_y;
void main(void)
{
example_x = 3;
example_y=example_x+2;
}
匯編代碼如下:

x的賦值:
將0x7000給到地址寄存器A15高16bit,低位補(bǔ)0,這時(shí)候A15 = 0x70000000
加載有效地址到A15,因?yàn)閤地址為0x70000004,故A15 = 0x70000004
將數(shù)據(jù)3移至D15;
將D15賦給A15指向的地址
y的賦值
將0x7000給到地址寄存器A15高16bit,低位補(bǔ)0,這時(shí)候A15 = 0x70000000
加載有效地址到A15,因?yàn)閥地址為0x70000008,故A15 = 0x70000008
將數(shù)據(jù)3移至D15,并加2;
將D15賦給A15指向的地址
總計(jì)9條指令,咋一看僅僅節(jié)省了4條指令,但從統(tǒng)計(jì)角度來(lái)看,效率提升了44.44%,F(xiàn)lash消耗更少了。 同樣兩行C代碼,僅僅因?yàn)閷ぶ贩绞降牟煌?,匯編指令差異如此之大 ,從而影響系統(tǒng)運(yùn)行效率。
4.小結(jié)
現(xiàn)在MCU的性能越來(lái)越強(qiáng)大,導(dǎo)致我在使用上越來(lái)越隨意,對(duì)于這種特別底層的知識(shí)非常匱乏,直到遇到了系統(tǒng)優(yōu)化問(wèn)題,才會(huì)去從這些角度來(lái)考慮??偨Y(jié)下來(lái),在系統(tǒng)性能優(yōu)化時(shí)要注意:
構(gòu)建memory限定符使用場(chǎng)景以?xún)?yōu)化代碼執(zhí)行效率;
多使用靠近CPU的memory,例如ARM TCM、Tricore DSPR、PSPR;
通過(guò)調(diào)試匯編代碼,也更進(jìn)一步了解了Tricore內(nèi)核的運(yùn)行原理;接下來(lái),思考如何將這些理論引入到工程代碼中。
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
130012 -
效率
+關(guān)注
關(guān)注
0文章
151瀏覽量
20877 -
TriCore
+關(guān)注
關(guān)注
0文章
15瀏覽量
12097
原文標(biāo)題:TC3xx分析--如何提高系統(tǒng)運(yùn)行效率
文章出處:【微信號(hào):eng2mot,微信公眾號(hào):汽車(chē)ECU開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于載波優(yōu)化的云臺(tái)馬達(dá)驅(qū)動(dòng)板控制策略
AURIX? TC3xx 電機(jī)控制電源板:設(shè)計(jì)解析與特性洞察
英飛凌AURIX? TC3xx安全應(yīng)用套件快速上手
CW32 MCU在高頻率運(yùn)行下的系統(tǒng)穩(wěn)定性的提升方案
通過(guò)優(yōu)化代碼來(lái)提高M(jìn)CU運(yùn)行效率
蜂鳥(niǎo)E203內(nèi)核優(yōu)化方法
PCIM2025論文摘要 | 針對(duì)儲(chǔ)能系統(tǒng)應(yīng)用(ESS)的優(yōu)化驅(qū)動(dòng)器設(shè)計(jì)策略
請(qǐng)問(wèn)如何僅使用軟件和 TC375 精簡(jiǎn)板來(lái)測(cè)量函數(shù)調(diào)用的堆棧使用情況?
TC3XX 的端口可以同時(shí)被 EvADC 和 DSADC 用于 ADC 轉(zhuǎn)換嗎?
兩片TC3XX芯片之間的時(shí)鐘同步可以實(shí)現(xiàn)嗎?
TC3XX /TC1.6.2OCDS如何通過(guò)軟件啟用核心調(diào)試控制器?
TC397XX如何使用 EB 堆棧處理 IRQ?
請(qǐng)問(wèn)tc3xx如何配置多個(gè)dedicatedRxBuffersNumber?
基于Infineon TC4D9+TLF4D985的Aurix StartKit
優(yōu)化TC3xx系統(tǒng)運(yùn)行效率的策略
評(píng)論