CMD文件簡介

CMD主要是用來分配romram空間用的,它告訴鏈接程序怎樣計算地址和分配空間.所以不同的芯片就有不同大小的romram.放用戶程序的地方也不盡相同.所以要根據芯片進行修改.分兩部分.MEMORYSECTIONS.

MEMORY
{ PAGE 0 ..........
PAGE 1.........
}
SECTIONS
{
.vectors .................
.reset .................
................
}

MEMORY是用來指定芯片的romram的大小和劃分出幾個區間.PAGE 0 對應romPAGE 1對應ramPAGE裏包含的區間名字與其後面的參數反映了該區間的起始地址和長度.

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表示存儲器可以進行初始話,什麼屬性代碼也不寫,表示存儲區間具有上述的四種屬性,基本上我們都選擇這種寫法。




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