天天看點

CMD檔案簡介

CMD主要是用來配置設定rom和ram空間用的,它告訴連結程式怎樣計算位址和配置設定空間.是以不同的晶片就有不同大小的rom和ram.放使用者程式的地方也不盡相同.是以要根據晶片進行修改.分兩部分.MEMORY和SECTIONS.

MEMORY

{ PAGE 0 ..........

PAGE 1.........

}

SECTIONS

{

.vectors .................

.reset .................

................

}

MEMORY是用來指定晶片的rom和ram的大小和劃分出幾個區間.PAGE 0 對應rom,PAGE 1對應ram。PAGE裡包含的區間名字與其後面的參數反映了該區間的起始位址和長度.

SECTIONS:在程式裡添加段名.XXXX(如.vectors.)用來指定該段名以下,另一個段名以上的程式(屬于PAGE0)或資料(屬于PAGE1)放到“>”符号後的空間名字所在的地方。下面給出一個簡單的例子:

MEMORY

{

PAGE 0: VECS: origin = 00000h, length = 00040h

LOW: origin = 00040h, length = 03FC0h

SARAM: origin = 04000h, length = 00800h

B0: origin = 0FF00h, length = 00100h

PAGE 1: B0: origin = 00200h, length = 00100h

B1: origin = 00300h, length = 00100h

B2: origin = 00060h, length = 00020h

SARAM: origin = 08000h, length = 00800h

}

SECTIONS

{

.text : { } > LOW PAGE 0

.cinit : { } > LOW PAGE 0

.switch : { } > LOW PAGE 0

.const : { } > SARAM PAGE 1

.data : { } > SARAM PAGE 1

.bss : { } > SARAM PAGE 1

.stack : { } > SARAM PAGE 1

.sysmem : { } > SARAM PAGE 1

}

CMD檔案由三部分組成:(1) 輸入輸出定義;(2) MEMORY指令;(3) SECTION指令。

輸入/輸出定義:這一部分,可以通過ccs的“Build Option........”菜單設定

         。obj 連結的目标檔案

         。lib 連結的庫檔案

         。map 生成的交叉索引檔案

         。out 生成的可執行代碼

MEMORY指令:描述系統實際的硬體資源

SECTION指令:描述“段”如何定位

下面給出一個例子:

-c

-o hello.out

-m hello.map

-stack 100

-l rts2xx.lib

MEMORY

{

   PAGE 0: VECT:origin=0x8000,length 0x040

   PAGE 0: PROG:origin=0x8040,length 0x6000

   PAGE 1: DATA:origin=0x8000,length 0x400

}

SECTIONS

{

.vextors >VECT PAGE 0

.text >PROG PAGE 0

.bss >DATA PAGE 1

.const >DATA PAGE 1

}

存儲模型說明:

.cinit 存放程式中的變量初值和常量

.const 存放程式中的字元常量、浮點常量和用const聲明的常量

.switch 存放程式中switch語句的跳轉位址表

.text 存放程式代碼

.bss 為程式中的全局和靜态變量保留存儲空間

.far 為程式中用far聲明的全局和靜态變量保留白間

.stack 為程式系統堆棧保留存儲空間,用于儲存傳回位址、函數間的參數傳遞、存儲局部變量和儲存中間結果

.sysmem 用于程式中的malloc 、calloc 、和realoc 函數動态配置設定存儲空間.text可執行代碼

CMD的專業名稱叫連結器配置檔案,是存放連結器的配置資訊的,我們簡稱為指令檔案,其中比較關鍵的就是MEMORY和SECTIONS兩個僞指令的使用,常常令人困惑,系統出現的問題也經常與它們的不當使用有關。CCS是DSP軟體對DOS系統繼承的開發環境,CCS的指令檔案經過DOS指令檔案長時間的引申發展,已經變得非常簡潔(不知道TI文檔有沒有詳細CMD配置說明)。我學CMD是從DOS裡的東西開始的,是以也從DOS環境下的CMD說起:

1指令檔案的組成

指令檔案的開頭部分是要連結的各個子目标檔案的名字,這樣連結器就可以根據子目标檔案名,将相應的目标檔案連結成一個檔案;接下來就是連結器的操作指令,這些指令用來配置連結器,接下來就是MEMORY和SECTIONS兩個僞指令的相關語句,必須大寫。MEMORY,用來配置目标存儲器,SECTIONS用來指定段的存放位置。結合下面的典型DOS環境的指令檔案link.cmd來做一下說明:

file.obj //子目标檔案名1

file2.obj //子目标檔案名2

file3.obj //子目标檔案名3

- o prog.out //連接配接器操作指令,用來指定輸出檔案

- m prog.m //用來指定MAP檔案

MEMORY

{ 略 }

SECTIONS

{ 略 }

otherlink.cmd

本指令檔案link.cmd要調用的otherlink.cmd等其他指令檔案,則檔案的名字要放到本指令檔案最後一行,因為放開頭的話,連結器是不會從被調用的其他指令檔案中傳回到本指令檔案。

2 MEMORY僞指令

MEMORY用來建立目标存儲器的模型,SECTIONS指令就可以根據這個模型來安排各個段的位置,MEMORY指令可以定義目标系統的各種類型的存儲器及容量。MEMORY的文法如下:

MEMORY

{

PAGE 0 : name1[(attr)  = constant,length = constant

          name1n[(attr)  = constant,length = constant

PAGE 1 : name2[(attr)  = constant,length = constant

          name2n[(attr) = constant,length = constant

PAGE n : namen[(attr)  = constant,length = constant

          namenn[(attr) = constant,length = constant

}

PAGE關鍵詞對獨立的存儲空間進行标記,頁号n的最大值為255,實際應用中一般分為兩頁,PAGE0程式存儲器和PAGE1資料存儲器。

name存儲區間的名字,不超過8個字元,不同的PAGE上可以出現相同的名字(最好不用,免的搞混),一個PAGE内不許有相同的name。

attr的屬性辨別,為R表示可讀;W可寫X表示區間可以裝入可執行代碼;I表示存儲器可以進行初始話,什麼屬性代碼也不寫,表示存儲區間具有上述的四種屬性,基本上我們都選擇這種寫法。

dsp

繼續閱讀