?? c2000系cmd文件的配置理解2.txt
字號:
C2000系CMD文件的配置理解
近來群里問CMD問題的朋友較多,工程上因為CMD配置較差引起的問題確實不少,
重新學了下CMD的理論寫了些心得與網友共享,還請批評指教。
CMD的專業名稱叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡稱為命令文件,
其中比較關鍵的就是MEMORY和SECTIONS兩個偽指令的使用,常常令人困惑,
系統出現的問題也經常與它們的不當使用有關,我將重點講解。
CCS是從DOS系統下DSP軟件繼承的開發環境。
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)] : 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 40
/*-------------------------------------------------------------------------*/
/* 命令文件 – 存儲空間 F2407 */
/*-------------------------------------------------------------------------*/
MEMORY
{
PAGE 0 : VECS : origin = 0h , length = 40h /* 程序復位 */
PVECS : origin = 40h , length = 70h /* 外圍模塊中斷向量 */
PROG : origin = 0b0h , length = 7F50h /* 在片FLASH */
PAGE 1 : MMRS : origin = 0h , length = 05Fh /* MMRS */
B2 : origin = 0060h , length = 020h /* DARAM B2 塊 */
B0 : origin = 0200h , length = 100h /* DARAM B0 塊 */
B1 : origin = 0300h , length = 100h /* DARAM B1 塊 */
SARAM : origin = 0800h , length = 0800h /* SARAM 塊 */
EXT : origin = 8000h , length = 8000h /* 外部存儲器 */
}
/*-------------------------------------------------------------------------*/
/* SECTIONS ALLOCATION */
/*-------------------------------------------------------------------------*/
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 /* 塊 B2 */
.const : { } > SARAM PAGE 1 /* 塊 B2 */
.stack : { } > B1 PAGE 1 /* 堆棧—40個單元 */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -