CCS中cmd文件的編寫

http://blog.sina.com.cn/s/blog_abe5740601015b3q.htmlhtml

 

CMD的專業名稱叫連接器配置文件,是存放連接器的配置信息的,咱們簡稱爲命令文件,其中比較關鍵的就是MEMORY和SECTIONS兩個僞指令 的使用,經常使人困惑,系統出現的問題也常常與它們的不當使用有關,我將重點講解。CCS是從DOS系統下DSP軟件繼承的開發環境。CCS的命令文件是 DOS命令文件通過很長時間的引伸發展了,已經變得很是了簡潔(不知道TI文檔有沒有詳細CMD配置說明)。我學CMD是從DOS裏的東西開始的,因此也 從DOS環境下的CMD提及:安全

1命令文件的組成加密

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

file.obj            //子目標文件名1blog

file2.obj         //子目標文件名2繼承

file3.obj         //子目標文件名3ci

- o prog.out   //鏈接器操做指令,用來指定輸出文件開發

- m prog.m     //用來指定MAP文件文檔

MEMORYcmd

{ 略 }

SECTIONS

{ 略 }

otherlink.cmd 

本命令文件link.cmd要調用的otherlink.cmd等其餘命令文件,則文件的名字要放到本命令文件最後一行,由於放開頭的話,連接器是不會從被調用的其餘命令文件中返回到本命令文件。

2 MEMORY僞指令
 

      MEMORY用來創建目標存儲器的模型,SECTIONS指令就能夠根據這個模型來安排各個段的位置,MEMORY指令能夠定義目標系統的各類類型的存儲器,及容量。MEMORY的語法以下:

MEMORY

{

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

 name1n[(attr)] : origin = constant,length = constant

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

name2n[(attr)] : origin = constant,length = constant

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

namenn[(attr)] : origin = constant,length = constant

}

PAGE關鍵詞對獨立的存儲空間進行標記,頁號n的最大值爲255,實際應用中通常分爲兩頁,PAGE 0程序存儲器和PAGE 1數據存儲器。

name存儲區間的名字,不超過8個字符,不一樣的PAGE上能夠出現相同的名字(最好不用,免的搞混),一個PAGE內不準有相同的name。

attr的屬性標識,爲R表示可讀;W可寫X表示區間能夠裝入可執行代碼;I表示存儲器能夠進行初始話,什麼屬性代碼也不寫,表示存儲區間具備上述的四種屬性,基本上咱們都選擇這種寫法。

 origin:略。

length:略。

下面是我常常用的2407的簡單寫法你們參考,程序從0x060是要避開加密位,不從0x0044開始更可靠一點,此例中的同名的頁能夠只寫第一個,其後省略,但寫上至少安全一點:


MEMORY

{

       PAGE 0: VECS: origin = 0x0000,  length 0x40

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

       PAGE 1: B0  : origin = 0x200,   length 0x100

       PAGE 1: B1  : origin = 0x300,   length 0x100

       PAGE 1: DATA: origin = 0x0860,  length 0x0780

}

3 SECTIONS僞指令
SECTIONS指令的語法以下:
SECTIONS
{
.text:  {全部.text輸入段名}   load=加載地址  run =運行地址
.data:  {全部.data輸入段名}   load=加載地址  run =運行地址
.bss:   {全部.bss輸入段名}    load=加載地址  run =運行地址
.other: {全部.other輸入段名}  load=加載地址  run =運行地址
}
SECTIONS必須用大寫字母,其後的大括號裏是輸出段的說明性語句,每個輸出段的說明都是從段名開始,段名以後是如何對輸入段進行組織和給段分配存儲器的參數說明:
以.text段的屬性語句爲例,「{全部.text輸入段名}」這段內容用來講明鏈接器輸出段的.text段由哪些子目標文件的段組成,舉例以下

SECTIONS
{
.text:{  file1.obj(.text) file2(.text) file3(.text,cinit)}略
}

指明輸出段.text要連接file1.obj的.text和 file2的.text 還有file3的.text和.cinit。在CCS的SECTIONS裏一般只寫一箇中間沒有內容的「{ }」就表示全部的目標文件的相應段
接 下來講明「load=加載地址  run =運行地址」連接器爲每一個輸出段都在目標存儲器裏分配兩個地址:一個是加載地址,一個是運行地址。一般狀況下兩個地址是相同的,能夠認爲輸出段只有一個地 址,這時就能夠不加「run =運行地址」這條語句了;但有時須要將兩個地址分開,好比將程序加載到FLASH,而後放到RAM中高速運行,這就用到了運行地址和加載地址的分別配置 了,以下例所示:
.const :{略} load = PROG  run = 0x0800
常量加載在程序存儲區,配置爲在RAM裏調用。
「load= 加載地址」的幾種寫法須要說明一下,首先「load」關鍵字能夠省略,「=」能夠寫成「>」, 「加載地址」能夠是:地址值、存儲區間的名字、PAGE關鍵詞等,因此你們見到「.text:{ } > 0x0080」這樣的語句可千萬不要奇怪。「run =運行地址」中的「 = 」能夠用「>」其它的簡化寫法就沒有了。你們不要亂用。

4 CCS中的案例在CCS中的命令文件好像簡化了很多,少了不少東西,語句也精簡了好多,首先不用指定輸入連接器的目標文件,CCS會自 動默認處理,其次連接器的配置命令也和DOS的環境不一樣,須要瞭解的請找TI文檔吧!下面是劉和平書中的例子,你們來看看是否是能夠很精確的理解了呢!不 懂的你們繼續在本帖討論!個人QQ605507276!-stack 40MEMORY{PAGE 0 :  VECS : origin =    0h , length = 40h        PVECS : origin =   40h , length = 70h        PROG : origin =  0b0h , length = 7F50h PAGE 1 :  MMRS : origin =    0h , length =   05Fh     B2 : origin = 0060h , length =   020h     B0 : origin = 0200h , length =   100h     B1 : origin = 0300h , length =   100h SARAM   : origin = 0800h , length =  0800h   EXT : origin = 8000h , length =  8000h }SECTIONS{    .reset   : { } > VECS   PAGE 0     .vectors : { } > VECS   PAGE 0    .pvecs   : { } > PVECS  PAGE 0    .text    : { } > PROG   PAGE 0    .cinit   : { } > PROG   PAGE 0      .bss     : { } > SARAM  PAGE 1    .const   : { } > SARAM  PAGE 1      .stack   : { } > B1     PAGE 1

相關文章
相關標籤/搜索