TI公司dsp的cmd配置文件的說明

hit2015spring歡迎關注我的博客晨鳧追風

本文爲原創作品,未經本人同意,禁止轉載,禁止用於商業用途!

這篇文章主要是兩年前用TMS320C6748的時候遇到的一點問題做的一些筆記,分享一下:

cmd文件主要是:

規定內存分配的文件,其中malloc函數分配內存,在堆中,在cmd文件中分配堆的空間,使得堆足夠大,存的下需要分配的空間。

1 CMD文件的分配方法

TI公司新的彙編器和鏈接器創建的目標文件採用一種COFF(通用目標文件格式),該目標文件格式更利於模塊化編程,爲管理代碼段和目標系統存儲器提供了強有力和靈活的編程方法。用戶可以通過編寫鏈接命令文件(.cmd文件)將鏈接信息放在一個文件中,以便在多次使用同樣的鏈接信息時調用。在命令文件中使用兩個十分有用的僞指令MEMORY和SECTIONS,來指定實際應用中的存儲器結構和進行地址的映射。

Memory用來指定目標存儲器結構,Memory下可以通過PAGE選項配置地址空間,鏈接器把每一頁都當作一個獨立的存儲空間。通常情況下,PAGE0代表程序存儲器用來存放程序,PAGE1代表數據存儲器,用來存放數據。

由編譯器生成的可重定位的代碼和數據塊叫做“SECTIONS”(段),SECTIONS用來控制段的構成與地址分配。對於不同的系統配置,“SECTION”的分配方式也不相同,鏈接器通過“SECTIONS”來控制地址的分配,所以“SECTIONS”的分配就成了配置.cmd文件的重要環節。

以下是對“SECTIONS”的定義及分配的詳細介紹。

(1) 被初始化的“SECTIONS”(包括數據表和可執行代碼)

.text 它包括所有的可執行代碼和常數,必須放在程序頁;

.cinit  它包括初始化的變量和常量表,要求放在程序頁;

.pinit 它包括全局構造器(C++)初始化的變量和常量表,要求放在程序頁;

.const 它包括字符串、聲明、以及被明確初始化過的全局和靜態變量,要求放在低地址的數據頁;

.econst 它是在使用大存儲器模式時使用的,包括字符串、聲明、以及被明確初始化過的全局變量和靜態變量,可以放在數據頁的任何地方。

.switch 它包括爲轉換聲明設置的表格,可以放在程序頁也可以放在低地址的數據頁。

(2)未被初始化的“SECTIONS”(爲程序運行中創建和存放的變量在存儲器中保留空間)

.bss 它爲全局變量和靜態變量保留空間。在程序開始運行時,C導入路徑把數據從.cinit節複製出去然後存在.bss節中,要求放在低地址的數據頁;

.ebss 它是在遠(far)訪問(只用於C)和大存儲模式下使用,它爲全局變量和靜態變量保留空間。在程序開始運行時,C導入路徑把數據從.cinit段複製出去然後存在.ebss節中,可以放在數據頁的任何地方;

.stack 爲C系統堆棧保留空間,這部分存儲器爲用來將聲明傳給函數及爲局部變量留出空間,要求放在低地址的數據頁;

.system 動態存儲器分配保留空間。這個空間用於malloc函數,如果不使用malloc函數,這個段的大小就是0,要求放在低地址的數據頁;

.esystem 動態存儲器分配保留空間,這個空間用於外部malloc函數,如果不使用外部malloc函數,這個段的大小就是0,可以放在數據頁的任何地方。

2 舉例說明.cmd文件的分配方法

以下是仿真調試串行通信接口SCI時的.cmd文件的分配,已經在TMS320F2812仿真調試中得到了很好的應用。

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區分成兩部分,一部分用做存放程序放在PAGE0裏,一部分用做存放數據放在PAGE1中以達到合理的分配;對實際仿真調試過程中的外圍幀frame0,frame1,frame2等的分配因爲篇幅問題就不做具體介紹了。

3 查看段的分配及使用情況

在cmd文件中包括各種各樣的鏈接器選項,每種選項代表不同的含義。其中,使用-m選項可以創建一個擴展名爲.map的鏈接器(存儲器)分配映射文件,其語法爲:-m filename(文件名)。鏈接器的map文件描述以下內容:

存儲器結構

輸入和輸出段的定位

在重新定位後外部符號的地址

通過map文件可以查看各段的分配情況,包括段的起始地址,使用的字節數等配合cmd文件的使用,可確定各個段的使用情況,從而保證程序的正常運行和最小的空間使用。

4 VisualLinker可視化鏈接器

TI公司出品的DSP軟件環境CCS還提供了一種可視化生成存儲器配置文件的工具:VisualLinker可視化鏈接器。

如果程序原來包含了一個鏈接器命令文件(.cmd文件),則當創 建可視化鏈接文件的時候,原來cmd文件中的內存配置仍然會被使用。如果讀者想修改內存配置,雙擊.rcp文件就會在CCS中打開可視化鏈接器的圖形界面,調整每個內存模塊的大小,直到認爲合適,然後只需要重新連編,程序即可生成新的輸出文件,重複上面的步驟,直到出現滿意的結果。

5 總結

不同的DSP芯片內集成的存儲器大小各異,但其配置方式是類似的。大家可通過查閱DSP芯片的數據手冊,瞭解芯片內部存儲空間大小。在實際的配置過程中,可根據開發程序的實際代碼,正確的劃分程序和數據空間中各段的大小,使其空間配置達到最優。

福利答謝大家!

感謝您閱讀本篇文章,對此特別發放一個無門檻的現金紅包,打開支付寶掃碼領取,可以領到錢的哦!
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章