在DSP系統中,存在大量、各式各樣的存儲器,CMD文件所描述的,就是開發工程師對物理存儲器的管理、分配和使用情況。CMD全稱鏈接器配置文件,是存放鏈接器配置信息的,簡稱命令文件,有三部分組成分別爲:輸入/輸出定義、memory命令、SECTIONS命令。
- 、輸入/輸出定義:
.obj文件:鏈接器要鏈接的目標文件;
.lib文件:鏈接器要鏈接的庫文件;
.map文件:鏈接器生成的交叉索引文件;
.out文件:鏈接器生成的可執行代碼;
- 、MEMORY命令
描述系統實際的硬件資源,無論DSP芯片自帶還是用戶外擴的,凡是可以使用的、需要用到的存儲器和空間,用戶都要一一聲明出來:有哪些存儲器,它們的位置和大小。
僞指令:
PAGE關鍵詞:對獨立的存儲空間進行標記,頁號n的最大值爲255。實際應用中一般分爲兩頁:PAGE0程序存儲器好PAGE1數據存儲器。
name:存儲區間的名字,不超過8個字符,不同的PAGE上可以出現相同的名字,一個PAGE內不許有相同的name。
origin:空間的起始地址。
length:空間的數據長度
- 、SECTIONS命令
描述段如何定位。
.vectors:中斷向量表
.cinit:存放C程序中的變量初值和常量;
.const:存放C程序中的字符常量、浮點常量和用const聲明的常量;
.switch:存放C程序中的switch語句的跳幀表;
.text:存放C程序的代碼;
.bss:存放C程序中的全局和靜態變量保留存儲空間;
.far:爲C程序用far聲明的全局和靜態變量保留空間;
.stack:爲C程序系統堆棧保留存儲空間,用於保存返回空間、函數間的參數傳遞、存儲局部變量和中間結果。
.sysmem:用於C程序中的malloc、calloc和realloc函數動態分配存儲空間。
其實在寫.CMD文件主要就是告訴DSP:程序放哪,數據放哪,堆棧放哪、中斷向量放哪。
例:
/*-w
-stack 500
-sysstack 500
-l rts55x.lib
-heap 102400
*/
-heap 81920 /*100KB=102400 sysmem動態分配的內存大小*/
MEMORY
{
PAGE 0:
MMR : origin = 0000000h, length = 00000c0h
SPRAM : origin = 00000c0h, length = 0000040h
VECS : origin = 0000100h, length = 0000100h
SARAM0 : origin = 0010100h, length = 0000F00h
SARAM1 : origin = 0011000h, length = 0007000h
DARAMBOOT0 : origin = 0000300h, length = 0001400h /*一次加載用的內存*/
SARAM2 : origin = 0018000h, length = 0004000h
SARAM3 : origin = 001c000h, length = 0004000h
DARAM3 : origin = 000c000h, length = 0004000h
PAGE 1:
DARAMBOOT1 : origin = 0001700h, length = 0001400h /*二次加載用的內存*/
DARAM0 : origin = 0002B00h, length = 0001200h
DARAM00 : origin = 0003D00h, length = 0000100h
DARAM01 : origin = 0003E00h, length = 0000100h
DARAM02 : origin = 0003F00h, length = 0000100h
DARAM03 : origin = 0004000h, length = 0000100h
DARAM1 : origin = 0004100h, length = 0003F00h
DARAM2 : origin = 0008000h, length = 0004000h
/* DARAM3 : origin = 000c000h, length = 0004000h
SARAM2 : origin = 0018000h, length = 0004000h
SARAM3 : origin = 001c000h, length = 0004000h*/
SARAM4 : origin = 0020000h, length = 0020000h
SARAM12 : origin = 0040000h, length = 0004000h
SARAM13 : origin = 0044000h, length = 0004000h
SARAM14 : origin = 0048000h, length = 0004000h
SARAM15 : origin = 004c000h, length = 0004000h
CE0 : origin = 0050000h, length = 03b0000h
CE1 : origin = 0400000h, length = 0400000h
CE2 : origin = 0800000h, length = 0400000h
CE3 : origin = 0c00000h, length = 03f8000h
PDROM : origin = 0ff8000h, length = 07f00h
/* VECS : origin = 0ffff00h, length = 00100h */ /* reset vector */
}
SECTIONS
{
.vectors : {} > VECS PAGE 0 /* interrupt vector table */
.cinit : {} > SARAM0 PAGE 0
.text : {} > SARAM1 PAGE 0
.stack : {} > DARAM0 PAGE 1
.sysstack : {} > DARAM0 PAGE 1
.sysmem : {} > SARAM4 PAGE 1
.cio : {} > DARAM1 PAGE 1
.data : {} > DARAM1 PAGE 1
.bss : {} > DARAM1 PAGE 1
.const : {} > DARAM1 PAGE 1
.csldata : {} > DARAM0 PAGE 1
.mybuffer : {} > SARAM4 PAGE 1
.mybuffer1: {} > DARAM2 PAGE 1
.hpiEventbuff: {} > DARAM00 PAGE 1
.hpiRecvbuff : {} > DARAM01 PAGE 1
.hpiSendbuff : {} > DARAM02 PAGE 1
.hpiDebugbuff: {} > DARAM03 PAGE 1
.fftcode : {} > SARAM2 PAGE 0 /* FFT-specific sections */
.twiddle : {} > SARAM3 PAGE 0, align(2048)
.input : {} > DARAM3 PAGE 0, align(4) /* this is due to long-word data memory access */
}