TI公司dsp的cmd配置文件的说明
hit2015spring晨鳧追風(fēng)歡迎關(guān)注我的博客晨鳧追風(fēng)
本文為原創(chuàng)作品,未經(jīng)本人同意,禁止轉(zhuǎn)載,禁止用于商業(yè)用途!
這篇文章主要是兩年前用TMS320C6748的時候遇到的一點問題做的一些筆記,分享一下:
cmd文件主要是:
規(guī)定內(nèi)存分配的文件,其中malloc函數(shù)分配內(nèi)存,在堆中,在cmd文件中分配堆的空間,使得堆足夠大,存的下需要分配的空間。
1 CMD文件的分配方法
TI公司新的匯編器和鏈接器創(chuàng)建的目標文件采用一種COFF(通用目標文件格式),該目標文件格式更利于模塊化編程,為管理代碼段和目標系統(tǒng)存儲器提供了強有力和靈活的編程方法。用戶可以通過編寫鏈接命令文件(.cmd文件)將鏈接信息放在一個文件中,以便在多次使用同樣的鏈接信息時調(diào)用。在命令文件中使用兩個十分有用的偽指令MEMORY和SECTIONS,來指定實際應(yīng)用中的存儲器結(jié)構(gòu)和進行地址的映射。
Memory用來指定目標存儲器結(jié)構(gòu),Memory下可以通過PAGE選項配置地址空間,鏈接器把每一頁都當(dāng)作一個獨立的存儲空間。通常情況下,PAGE0代表程序存儲器用來存放程序,PAGE1代表數(shù)據(jù)存儲器,用來存放數(shù)據(jù)。
由編譯器生成的可重定位的代碼和數(shù)據(jù)塊叫做“SECTIONS”(段),SECTIONS用來控制段的構(gòu)成與地址分配。對于不同的系統(tǒng)配置,“SECTION”的分配方式也不相同,鏈接器通過“SECTIONS”來控制地址的分配,所以“SECTIONS”的分配就成了配置.cmd文件的重要環(huán)節(jié)。
以下是對“SECTIONS”的定義及分配的詳細介紹。
(1) 被初始化的“SECTIONS”(包括數(shù)據(jù)表和可執(zhí)行代碼)
.text 它包括所有的可執(zhí)行代碼和常數(shù),必須放在程序頁;
.cinit 它包括初始化的變量和常量表,要求放在程序頁;
.pinit 它包括全局構(gòu)造器(C++)初始化的變量和常量表,要求放在程序頁;
.const 它包括字符串、聲明、以及被明確初始化過的全局和靜態(tài)變量,要求放在低地址的數(shù)據(jù)頁;
.econst 它是在使用大存儲器模式時使用的,包括字符串、聲明、以及被明確初始化過的全局變量和靜態(tài)變量,可以放在數(shù)據(jù)頁的任何地方。
.switch 它包括為轉(zhuǎn)換聲明設(shè)置的表格,可以放在程序頁也可以放在低地址的數(shù)據(jù)頁。
(2)未被初始化的“SECTIONS”(為程序運行中創(chuàng)建和存放的變量在存儲器中保留空間)
.bss 它為全局變量和靜態(tài)變量保留空間。在程序開始運行時,C導(dǎo)入路徑把數(shù)據(jù)從.cinit節(jié)復(fù)制出去然后存在.bss節(jié)中,要求放在低地址的數(shù)據(jù)頁;
.ebss 它是在遠(far)訪問(只用于C)和大存儲模式下使用,它為全局變量和靜態(tài)變量保留空間。在程序開始運行時,C導(dǎo)入路徑把數(shù)據(jù)從.cinit段復(fù)制出去然后存在.ebss節(jié)中,可以放在數(shù)據(jù)頁的任何地方;
.stack 為C系統(tǒng)堆棧保留空間,這部分存儲器為用來將聲明傳給函數(shù)及為局部變量留出空間,要求放在低地址的數(shù)據(jù)頁;
.system 動態(tài)存儲器分配保留空間。這個空間用于malloc函數(shù),如果不使用malloc函數(shù),這個段的大小就是0,要求放在低地址的數(shù)據(jù)頁;
.esystem 動態(tài)存儲器分配保留空間,這個空間用于外部malloc函數(shù),如果不使用外部malloc函數(shù),這個段的大小就是0,可以放在數(shù)據(jù)頁的任何地方。
2 舉例說明.cmd文件的分配方法
以下是仿真調(diào)試串行通信接口SCI時的.cmd文件的分配,已經(jīng)在TMS320F2812仿真調(diào)試中得到了很好的應(yīng)用。
MEMORY
{PAGE0: /ProgramMemory/
RAMH0:origin=0x3F8000,length=0x001000
RAML0:origin=0x008000,length=0x001000
RAML1:origin=0x009000,length=0x001000
ROM:
origin=0x3FF000,length=0x000FC0
RESET: origin=0x3FFFC0,length=0x000002M
VECTORS:origin=0x3FFFC2,length=0x00003EM
PAGE1:/DataMemory/
RAMM0:origin=0x000000,length=0x000400
RAMM1:origin=0x000400,length=0x000400
RAMH0:origin=0x3F9000,length=0x001000
,,,
}
SECTIONS
{/Allocateprogramareas:/
.cinit :>RAMH0 PAGE=0
.pinit :>RAMH0 PAGE=0
.text :>RAMH0 PAGE=0
.reset :>RESET,PAGE=0,TYPE=DSECT
Vectors :>VECTORS,PAGE=0,TYPE=DSEC
/Allocateuninitalizeddatasections:/
.stack :>RAMM0 PAGE=1
.ebss :>RAMH0 PAGE=1
.esysmem :>RAMH0 PAGE=1
.econst :>RAMM1 PAGE=1
.switch :>RAMM1 PAGE=1
,,,
}
為充分利用18k×16位的SARAM,本例將高地址的8k×16位的H0 SARAM區(qū)分成兩部分,一部分用做存放程序放在PAGE0里,一部分用做存放數(shù)據(jù)放在PAGE1中以達到合理的分配;對實際仿真調(diào)試過程中的外圍幀frame0,frame1,frame2等的分配因為篇幅問題就不做具體介紹了。
3 查看段的分配及使用情況
在cmd文件中包括各種各樣的鏈接器選項,每種選項代表不同的含義。其中,使用-m選項可以創(chuàng)建一個擴展名為.map的鏈接器(存儲器)分配映射文件,其語法為:-m filename(文件名)。鏈接器的map文件描述以下內(nèi)容:
存儲器結(jié)構(gòu)
輸入和輸出段的定位
在重新定位后外部符號的地址
通過map文件可以查看各段的分配情況,包括段的起始地址,使用的字節(jié)數(shù)等配合cmd文件的使用,可確定各個段的使用情況,從而保證程序的正常運行和最小的空間使用。
4 VisualLinker可視化鏈接器
TI公司出品的DSP軟件環(huán)境CCS還提供了一種可視化生成存儲器配置文件的工具:VisualLinker可視化鏈接器。
如果程序原來包含了一個鏈接器命令文件(.cmd文件),則當(dāng)創(chuàng) 建可視化鏈接文件的時候,原來cmd文件中的內(nèi)存配置仍然會被使用。如果讀者想修改內(nèi)存配置,雙擊.rcp文件就會在CCS中打開可視化鏈接器的圖形界面,調(diào)整每個內(nèi)存模塊的大小,直到認為合適,然后只需要重新連編,程序即可生成新的輸出文件,重復(fù)上面的步驟,直到出現(xiàn)滿意的結(jié)果。
5 總結(jié)
不同的DSP芯片內(nèi)集成的存儲器大小各異,但其配置方式是類似的。大家可通過查閱DSP芯片的數(shù)據(jù)手冊,了解芯片內(nèi)部存儲空間大小。在實際的配置過程中,可根據(jù)開發(fā)程序的實際代碼,正確的劃分程序和數(shù)據(jù)空間中各段的大小,使其空間配置達到最優(yōu)。
福利答謝大家!
感謝您閱讀本篇文章,對此特別發(fā)放一個無門檻的現(xiàn)金紅包,打開支付寶掃碼領(lǐng)取,可以領(lǐng)到錢的哦!
總結(jié)
以上是生活随笔為你收集整理的TI公司dsp的cmd配置文件的说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式深度学习运用的思路
- 下一篇: makefile文件的一些解读