2023年12月6日發(fā)(作者:蔬菜兒歌順口溜)

1·什么是CMD文件,它有什么作用。
CMD文件是用來說明對應的對應的代碼、數(shù)據(jù)、變量的存放空間。
它包括兩個指令SECTOINS和MEMORY。
如果把RAM和ROM看成是兩個倉庫的話,那MEMORY指令就是把這兩個倉庫再分成不同的區(qū)域。如果把不同的代碼段是看成一件件貨物的話,那么SECTOINS指令則指出了這些貨物對應的存放位置。
.cmd文件
由匯編器產(chǎn)生的COFF格式的OBJ文件中的段作為構(gòu)造塊,當有多個文件進行鏈接時,鏈接器會將輸入段結(jié)全在一起產(chǎn)生可執(zhí)行的COFF輸出模塊,然后鏈接器為各輸出段選擇存儲器地址。
1.1 MEMORY指令說明
存儲器(MEMORY)偽指令,用來定義目標系統(tǒng)的存儲器空間。MEMORY可以定義存儲器的區(qū)域,并指定起始地址和長度。
MEMORY偽指令的一般語法:
MEMORY
{
PAGE 0: name1[(attr)]:origin=constant, length=constant;
PAGE n: name1[(attr)]:origin=constant, length=constant;
}
PAGEn中的頁號n最大為255。每個PAGE代表一個完全獨立的地址空間。通常PAGE0為程序存儲器,PAGE1為數(shù)據(jù)存儲器。
Name1:存儲器區(qū)間名。可包含8個字符。不同PAGE可以取同樣的name1,但在同一個PAGE內(nèi)區(qū)間名不可以相同。
Attr:可選項。規(guī)定存儲器屬性。
R,可以對存儲器執(zhí)行讀操作
W,可以對存儲器執(zhí)行寫操作
X,破除可以裝入可執(zhí)行的程序代碼
I,規(guī)定可以對存儲器進行初始化
Origin:起始地址。
Length:區(qū)間長度。
初始化段用SECTIONS可定位兩次:裝入和運行。如:一些關(guān)鍵的執(zhí)行代碼必須裝在系統(tǒng)的ROM中,但希望在較快的RAM中運行。
未初始化段只可被定位一次。
自己寫的關(guān)于LF2406A的.cmd文件
MEMORY
{
PAGE 0: VECS:
origin=0h,
length=40h
;中斷向量表,40h~43h為安全代碼
;或保留代碼區(qū),復位向量是0h和1h
FLASH: origin=44h, length=0ffbch ;32Kflash
}
SARAM: origin=8000h, length=800h ;當PON=1&&DON=0,
;SARAM映射為程序存儲空間
B0: origin=ff00h, length=100h ; 256 WORD DARAM,CNF=1時
PAGE 1: MMRS: origin=0h, length=60h ;內(nèi)部映射寄存器,或保留區(qū)間
B2:
B0:
B1:
origin=60h, length=20h ;32 WORD DARAM
origin=200h, length=100h ;256 WORD DARAM,CNF=0時
origin=300h, length=100h ;256 WORD DARAM
SARAM: origin=800h, length=800h ;2K WORD SARAM,DON=1&&PON=0
PF1: origin=7000, length=230h ;外設(shè)幀1
EVA:
EVB:
origin=7400, length=32h
origin=7500, length=32h
;外設(shè)幀2
;外設(shè)幀3
內(nèi)部的所有的存儲器都定義過了,最后的三個PF1、EVA、EVB可以不用定義的,因為是這外設(shè)的寄存器映射。
1.2 SECTOINS指令說明
段(SECTOINS)偽指令,告訴鏈接器如何將輸入段結(jié)合成輸出段并告訴鏈接器將輸出段放在存儲器的何處。
SECTIONS
{
Name:[property,property,…]
Name:[property,property,…]
Name:[property,property,…]
}
Name:源程序中的段名。如.text
Property:段的屬性參數(shù)。一個段的屬性參數(shù)包括下列五種:
1.2.1 Load allocation,由它定義將輸出段加載到存儲器中的什么位置。
語法:load: allocation、allocation、>allocation (allocation是將邏輯段定位的地址說明)
例如:.text: load=0x1000 ;將輸出段定位到一個特定的地址
.text: load>ROM ;將輸出段定位到命名為ROM的存儲區(qū)
.text: align=0x80
.text: block(128)
;關(guān)鍵詞align規(guī)定輸出段.text定位到從地址邊界0x80開始
;關(guān)鍵詞bolck規(guī)定段必須在兩個地址邊界之內(nèi),如果段太
;大,就從一個地址邊界開始
.text: PAGE0 ;將輸出段定位到PAGE0
如果輸出段只定位一個位置,則可省去關(guān)鍵字load。如:.text: >ROM
如果要用到一個以上參數(shù),可以將它們排成一行。如:.text: >ROM align 16 PAGE 2
或.text: load(ROM align(16) PAGE(2))
(地址邊界是2的N次方冪的地址,如地址邊界定為16,則其地址為xxx0h。)
定邊界地址用在什么情況下?
1.2.2 Run allocation,由它定義輸出段在存儲器的什么位置開始運行。 語法:run=allocation或run>allocation
鏈接器為每個輸出段在目標存儲器中分配兩個地址:加載地址和執(zhí)行地址。通常這兩個地址是相同的。但如要先將程序加載到ROM,然后在RAM中以較快的速度運行。則可兩次定位,如:
.fir: load=ROM,run=RAM
1.2.3 Input ctions,由它定義哪些輸入段組成輸出段。
語法:{input_ctions}
.text: {*(.text)} 等價于 .text: {}
這樣就把所有的.text段鏈接成.text段輸出。
也可以明確的用文件名和段名來確定輸入段:
.text:
{
(.text,ct) ;鏈接的.text、.ct段
(ct) ;這里的ct前面的點是本來就不用寫還是書上的錯誤?
;鏈接的所有段
}
1.2.4 Section type,用它為輸出段定義特殊形式的標志
語法:Type=COPY、Type= DSECT、Type=NOLOAD
1.2.5 Fill value,當初始化段中存在未初始化的存儲區(qū)間時,對其填充一指定值。
語法:fill: value 或name:…{…}=value
1.3問題
1.3.1如果不同頁中定義了相同的名字,又不指定PROG,這時默認在哪個空間呢?
如:PAGE 0: B0: origin=0ff00h, length=100h ; 256 WORD DARAM,CNF=1時
PAGE 1: B0: origin=200h, length=100h ;256 WORD DARAM,CNF=0時
這明 .const: {} >B1 是指向那個空間?
1.3.2
-o
-m
以上兩個語句用來生成.out和.map文件。如果沒寫這,也沒有關(guān)系,CCS->project->Build
options菜單下的Linker選項頁里面還可以設(shè)置。
2·代碼中關(guān)于對段的定義
對段定義目的:上面已經(jīng)說明了CMD文件的作用是倉庫分區(qū)和指定貨物的存放位置,而對代碼中段的定義則是給代碼,數(shù)據(jù),變量這些貨物起名字,使它對應CMD文件里的段名存放。
2.1 段的分類
2.1.1目標文件至少包含三個默認段:
.text
.data
.bss
文本段
數(shù)據(jù)段
通常包含可執(zhí)行代碼
通常包含初始化的數(shù)據(jù)
保留空間段 通常為沒有初始化的變量保留空間
2.1.2自定義段:
.uct 保留空間段 為沒有初始化的數(shù)據(jù)保留空間的自定義段
.ct 初始化段 自定義段
和默認段的使用相同,但它們被單獨匯編。例如,重復使用.text段在目標文件中創(chuàng)建單個.text段,在鏈接時,這個.text段作為單個單元分配到存儲器中。假中有一部分可執(zhí)行代碼(如初始化程序)不希望和.text段分配在一起,可以將它們匯編進一個自定義段,這樣就可以分配在與.text段不同的地方。
不能用不同的偽指令定義相同的段。如.uct和.ct用同一個段名。
2.1.3初始化段
.text
.data
.ct “ction name(段名)”
當匯編器第一次遇到一個.data時,.data段為空的。跟在第一個.data偽指令后的指令被匯編進.data段,直到遇到.text、.ct、.act。如果后面還遇到.data,則將跟在這些.data后面的語句匯編時已經(jīng)存在的.data段。這樣就形成了單個可被連續(xù)分配到存儲器中的.data段。
2.1.4未初始化段
.bss symbol(符號),
symbol .uct
size in words(字數(shù))[blocking flag]
“ction name(段名)”size in words,[blocking flag]
symbol:指向.bss或.uct偽指令所保留的存儲空間的第一個字。這個符號與保留空間所使用的變量名相對應。這個符號可以讓其化段引用,并且也可以用一個全局符號(.global)來聲明。
相當于C中定義 unsigned char symbol[size in words];
Size in words:保留空間大小。
Blocking flag:可選項。如果該參數(shù)指定一個大于0的值,則匯編器會將size in words指定的字數(shù)連續(xù)存放,分配的空間不跨頁面的邊界,除非字數(shù)超過一頁的長度,此時將從一個頁面邊界開始。 Section name:為保留空間的自定義段的段名。0~8個字符。最多可產(chǎn)生32767個不同的自定義段。
和symbol有什么不同?
段名是用來匯編器聯(lián)接用的,程序里用不到;而符號是地址,程序里可以引用。
自定義的段名第一個字符也可以是 . ,如:ct “.cinit”。
初始化段定義偽指令告訴匯編器停止匯編進入當前的段,而開始匯編進入指定的段,但未初始化段定義偽指令不終止當前的段而開始一個新段,它們只是簡間的臨時離開當前的段。所以.bss和.uct可以出現(xiàn)在初始化段的任何地方而不會影響它的內(nèi)容。
2.1.5 作用
鏈接器將段重新定位到目標系統(tǒng)的存儲器映射。大多數(shù)系統(tǒng)包含幾種存儲器,使用段可以使目標存儲器的使用更為有效。所有段都可獨立地重新定位,可將任意段放到目標存儲器任何已經(jīng)分配的塊。
2.2 問題
2.2.1
.data
.word 011h,022h,033h
.bss var1,1
.bss buffer,10
.word 0123
.text
LAC 0FH
Coeff
Ptr
Add:
Aloop: SBLK 1
BLEZ aloop
Ivals
Var2
Inbuf
SACL
.data
.word
.uct
.uct
.text
ADD
var1,0
0aah,0bbh
“newvars”,1
“newvars”,7
#0FFH
.text
.data
7(WORDS)
5
.bss 11
.newvars 8(由.uct創(chuàng)建的段)
在兩本書中看到這個例子,其中.data段都是5個字的目標碼。
Ptr .word 0123不算是.data段嗎?那是什么段?為什么沒有計算進去,是書上寫錯了?
查看.map文件,可以看出.data 段是6個字的目標碼,應該是書本錯了。 2.2.2
編譯連接都通過,為什么生成的.out文件無法下載,提示0x0地址數(shù)據(jù)錯誤。
查看Disasmbly,8000h前面的數(shù)據(jù)全為FF,8000h~87ffh即SARAM區(qū)里有程序PRG_inti,8800H后的數(shù)據(jù)全和87FFH里的數(shù)據(jù)相同。
8000h~87ffh里的程序是否是用來清除、擦除、燒寫FLASH用的?其只要打開CSS就存在。
答:SECTOINS段里的load指出的是LOAD PROGRAM與FLASH燒寫時的共同地址。
所以如果LOAD PROGRAM時把load地址定到FLASH空間就會出現(xiàn)上面的錯誤。而FLASH燒寫當然就不會了。
所以LOAD PROGRAM與FLASH燒寫要寫不同的CMD文件。
SECTOINS段里的run指出的是軟件調(diào)試運行時的地址,如:
MEMORY
{
PAGE 0: VECS: origin=0h, length=40h /*中斷向量表*/
FLASH: origin=100h, length=7000h /*;32Kflash*/
SARAM: origin=8000h, length=800h /*;當PON=1&&DON=0,*/
/*;SARAM映射為程序存儲空間*/
}
SECTIONS
{
vectors: {} load=VECS,
.asminti: {} load=FLASH,
.text: {} load=FLASH,
PAGE 1: MMRS: origin=0h,
B2:
B0:
B1:
length=60h /*;內(nèi)部映射寄存器,或保留區(qū)間*/
/*;32 WORDS DARAM*/
/*;256 WORDS DARAM,CNF=0時*/
/*;256 WORDS DARAM*/
origin=60h, length=20h
origin=200h, length=100h
origin=300h, length=100h
run=SARAM PAGE 0
run=SARAM PAGE 0/**/
run=SARAM PAGE 0
.data: {} >SARAM PAGE 0
.bss : {} >B2 PAGE 1
}
燒寫完FLASH后,復位,地址定位到0000H。單步執(zhí)行,跳轉(zhuǎn)到主程序入口。.text段燒寫在100H地址處開始,但程序卻跳到了8043H處,這是關(guān)鍵字run映射的地址。把
vectors: {} load=VECS,
.asminti: {} load=FLASH,
run=SARAM PAGE 0
run=SARAM PAGE 0/**/
run=SARAM PAGE 0 .text: {} load=FLASH,
改成
vectors: {} load=VECS PAGE 0
.asminti: {} load=FLASH PAGE 0/**/
.text: {} load=FLASH PAGE 0
從0000H執(zhí)行后就跳到了100H。
從中可以看出run指定的只是軟件仿真時程序段的映射地址。
本文發(fā)布于:2023-12-06 14:14:58,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1701843299239024.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:1·什么是cmd文件,它有什么作用。.doc
本文 PDF 下載地址:1·什么是cmd文件,它有什么作用。.pdf
| 留言與評論(共有 0 條評論) |