Other Parts Discussed in Post: TMS320F280049
作者:Chen Yang, Benjamin Zhou, Strong Zhang
CLA(Control Law Accelerator)控制率加速器是一個(gè)獨(dú)立可編程的32位浮點(diǎn)數(shù)字處理單元,為快速觸發(fā)響應(yīng)及數(shù)學(xué)運(yùn)算而設(shè)計(jì)。CLA獨(dú)立于C28x CPU工作,時(shí)鐘頻率與CPU相同,可執(zhí)行算法以及周期性的計(jì)算工作。通過增加平行的處理單元CLA,拓展了C28x CPU的性能。當(dāng)前C2000系列產(chǎn)品共有3種類型的CLA, 不同的C2000型號(hào)對(duì)應(yīng)不同的CLA類型, 各類型的差別及對(duì)應(yīng)的C2000器件型號(hào)詳情如圖1所示。Type 2型的CLA可直接讀取ADC 結(jié)果寄存器,極大減小ADC采樣至輸出的延時(shí),提高系統(tǒng)的響應(yīng)并允許系統(tǒng)以更高的頻率運(yùn)行;并且可直接操作所有的Epwm,HRPWM,eCAP,eQEP,CMPSS,DACSDFM,PGA,SPI,LIN,F(xiàn)SI,PMBUS,CLB和GPIO數(shù)據(jù)寄存器;CLA可獨(dú)立地響應(yīng)外設(shè)中斷。利用CLA執(zhí)行一些周期性任務(wù)可以解放CPU,使其工作于其他系統(tǒng)任務(wù)。
圖1 CLA類型及對(duì)應(yīng)C2000器件
CLA的使用包括初始化設(shè)置和任務(wù)定義。初始化由CPU完成,包括程序內(nèi)存和數(shù)據(jù)內(nèi)存分配,任務(wù)的觸發(fā)配置;Type 2型CLA提供 8個(gè)獨(dú)立的任務(wù)(也可配置為7個(gè)獨(dú)立的任務(wù)和1個(gè)底層持續(xù)運(yùn)行的任務(wù)),這些任務(wù)類似中斷服務(wù)函數(shù),由中斷觸發(fā)并運(yùn)行至任務(wù)結(jié)束,并且可配置在任務(wù)完成時(shí)產(chǎn)生中斷, CLA 框圖如圖2所示。
圖2 CLA框圖
CLA可訪問RAMLS0-LS7 區(qū)塊的內(nèi)存,并且每個(gè)塊可以配置為CPU專用或CPU與CLA之間共享數(shù)據(jù)。這些內(nèi)存塊復(fù)位時(shí)默認(rèn)分配給CPU,需要由CPU初始化后才可用于與CLA共享數(shù)據(jù)。如果這些內(nèi)存塊被配置為數(shù)據(jù)共享的,則可進(jìn)一步配置為程序內(nèi)存或數(shù)據(jù)內(nèi)存,程序內(nèi)存用于存放CLA的程序代碼,數(shù)據(jù)內(nèi)存用于存放供CLA程序使用的變量和系數(shù),并且有專用的消息內(nèi)存MSG RAMs用于在CPU和CLA之間傳遞數(shù)據(jù), CLA的Memory及寄存器操作方式描述如圖3所示。
圖3 CLA Memory及寄存器操作
CLA的初始化是在軟件初始化期間由CPU執(zhí)行,主要包括6個(gè)步驟:
從Flash中復(fù)制CLA 任務(wù)代碼至CLA 程序內(nèi)存中
分配CLA數(shù)據(jù)內(nèi)存
配置CLA寄存器:包括使能CLA時(shí)鐘;分配CLA任務(wù)函數(shù)地址;選擇任務(wù)觸發(fā)源;根據(jù)需要使能軟件觸發(fā)任務(wù);映射CLA程序內(nèi)存和數(shù)據(jù)內(nèi)存到CLA空間
在PIE中配置CLA任務(wù)完成中斷的服務(wù)函數(shù)
在MIER寄存器中使能CLA任務(wù)觸發(fā)
初始化觸發(fā)源外設(shè),使其能觸發(fā)CLA任務(wù)
在CLA開發(fā)過程中,工程師往往專注于代碼層面對(duì)CLA初始化,CLA_task的配置以及算法設(shè)計(jì),忽略了更為底層的問題——CMD文件中CLA內(nèi)存分配問題。不合理的內(nèi)存分配可能會(huì)導(dǎo)致編譯報(bào)錯(cuò)及內(nèi)存溢出。
本博文將舉例使用TI的TMS320F280049進(jìn)行CLA開發(fā)時(shí),由于內(nèi)存分配錯(cuò)誤導(dǎo)致的具體報(bào)錯(cuò)。
本例中在完成了CLA初始化,CLA_task的中斷函數(shù)配置后,點(diǎn)擊編譯CCS報(bào)43個(gè)“#17003-D” warnings,如圖4:
圖4 #17003-D Warning
Description Resource Path Location Type:
#17003-D relocation to symbol “CLAscratch_end” overflowed; the 6-bit relocated address 0xee is too large to encode in the 16-bit unsigned field (type = ‘R_ABS16_OC’ (107), file = “。./xxxxxxx”, offset = 0x00000312, section = “Cla1Prog”)
警告顯示CLAscratch_end內(nèi)存溢出,問題定位至CMD文件,檢查CMD中與scratch相關(guān)的內(nèi)存分配, 如圖5。
圖5 CMD文件scratchpad描述
發(fā)現(xiàn)僅有.scrathpad分配至RAMLS1,并未找到CLAscratch_end以及對(duì)CLA_SCRATCHPAD_SIZE的定義。
于是,打開.map文件判斷是否分配了__cla_scratchpad_end/start,在.map文件中搜索scratchpad,如圖6所示。
圖6 .map文件中cla_scratchpad_end描述
如圖6,在.map中僅僅找到__cla_scratchpad_end,可以判斷工程使用了scratchpad,但是并沒有__cla_scratchpad_start的內(nèi)存分配。
至此找到了問題原因,解決方案就是需要在CMD文件中對(duì)scratchpad進(jìn)行相關(guān)配置, 如圖7所示。
參考配置如下:
①在CMD文件的頭部添加以下代碼,如圖所示
CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
圖7 scratchpad配置
②在CMD文件的SECTIONS{}代碼部分的末尾添加以下代碼
CLAscratch :
{ *.lib(CLAscratch)
。 += CLA_SCRATCHPAD_SIZE;
*.lib(CLAscratch_end) } 》 RAMLS1,
PAGE = 1
再次編譯,#17003-D警告已經(jīng)消失,編譯通過,結(jié)果如圖8所示。
圖8 修改CMD后編譯結(jié)果
此時(shí),再次查看.map文件,發(fā)現(xiàn)__cla_scratchpad_end/start以及CLA_SCRATCHPAD_SIZE已經(jīng)成功分配,如圖9所示。
圖9 修改CMD文件編譯生成.map文件圖
以上就是關(guān)于“#17003-D warning”的解決方案,希望通過這個(gè)例子,讓廣大工程師在CLA開發(fā)時(shí)能夠注意到CMD對(duì)CLA內(nèi)存正確配置的重要性,防止在實(shí)際開發(fā)時(shí)遇到問題,難以排查。
審核編輯:金巧
-
嵌入式處理
+關(guān)注
關(guān)注
0文章
341瀏覽量
10012 -
Cla
+關(guān)注
關(guān)注
0文章
15瀏覽量
10483 -
CMD文件
+關(guān)注
關(guān)注
0文章
5瀏覽量
7434
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論