對剛學(xué)習DSP的我,覺(jué)得首先有點(diǎn)無(wú)所適從.因為E文水平一般.面對一些芯片資料覺(jué)得有很多看不懂的地方.但后來(lái)從一DSP群里面一位同仁的建議其實(shí)E文資料也并不可怕.于是靜下心來(lái)在打開(kāi)電腦的同時(shí)把金山詞典打開(kāi).慢慢的也可以理解文中意思.對于我來(lái)說(shuō)也是一個(gè)提高了.在學(xué)習過(guò)程中我感覺(jué)就是CMD配置文件比較難,難的原因是對它的存儲器結構不熟.因為每個(gè)定義就是把存儲器空間的分配.下面是我個(gè)人的一些見(jiàn)解.一部分是從網(wǎng)上摘錄:
CMD的專(zhuān)業(yè)名稱(chēng)叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡(jiǎn)稱(chēng)為命令文件,其中比較關(guān)鍵的就是MEMORY和SECTIONS兩個(gè)偽指令的使用,常常令人困惑,系統出現的問(wèn)題也經(jīng)常與它們的不當使用有關(guān)。CCS是DSP軟件對DOS系統繼承的開(kāi)發(fā)環(huán)境,CCS的命令文件經(jīng)過(guò)DOS命令文件長(cháng)時(shí)間的引申發(fā)展,已經(jīng)變得非常簡(jiǎn)潔(不知道TI文檔有沒(méi)有詳細CMD配置說(shuō)明)。我學(xué)CMD是從DOS里的東西開(kāi)始的,所以也從DOS環(huán)境下的CMD說(shuō)起:
1.命令文件的組成
命令文件的開(kāi)頭部分是要鏈接的各個(gè)子目標文件的名字,這樣鏈接器就可以根據子目標文件名,將相應的目標文件鏈接成一個(gè)文件;接下來(lái)就是鏈接器的操作指令,這些指令用來(lái)配置鏈接器,接下來(lái)就是MEMORY和SECTIONS兩個(gè)偽指令的相關(guān)語(yǔ)句,必須大寫(xiě)。MEMORY,用來(lái)配置目標存儲器,SECTIONS用來(lái)指定段的存放位置。結合下面的典型DOS環(huán)境的命令文件link.cmd來(lái)做一下說(shuō)明:
file.obj //子目標文件名1
file2.obj //子目標文件名2
file3.obj //子目標文件名3
- o prog.out //連接器操作指令,用來(lái)指定輸出文件
- m prog.m //用來(lái)指定MAP文件
MEMORY
{ 略 }
SECTIONS
{ 略 }
otherlink.cmd
本命令文件link.cmd要調用的otherlink.cmd等其他命令文件,則文件的名字要放到本命令文件最后一行,因為放開(kāi)頭的話(huà),鏈接器是不會(huì )從被調用的其他命令文件中返回到本命令文件。
2 MEMORY偽指令
MEMORY用來(lái)建立目標存儲器的模型,SECTIONS指令就可以根據這個(gè)模型來(lái)安排各個(gè)段的位置,MEMORY指令可以定義目標系統的各種類(lèi)型的存儲器及容量。MEMORY的語(yǔ)法如下:
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關(guān)鍵詞對獨立的存儲空間進(jìn)行標記,頁(yè)號n的最大值為255,實(shí)際應用中一般分為兩頁(yè),PAGE0程序存儲器和PAGE1數據存儲器。
name存儲區間的名字,不超過(guò)8個(gè)字符,不同的PAGE上可以出現相同的名字(最好不用,免的搞混),一個(gè)PAGE內不許有相同的name。
attr的屬性標識,為R表示可讀;W可寫(xiě)X表示區間可以裝入可執行代碼;I表示存儲器可以進(jìn)行初始話(huà),什么屬性代碼也不寫(xiě),表示存儲區間具有上述的四種屬性,基本上我們都選擇這種寫(xiě)法。
origin:略。
length:略。
下面是經(jīng)常用的812的簡(jiǎn)單寫(xiě)法大家參考,
-l rts2800.lib
-w
-stack 400h
-heap 100
MEMORY
{
PAGE 0 :
*/
//RAMM0
MEMORY
{
PAGE 0 :
PRAMH0 : origin = 0x3f8000, length = 0x001000
PAGE 1 :
RAMM0 : origin = 0x000000, length = 0x000400
RAMM1 : origin = 0x000400, length = 0x000400
DEV_EMU : origin = 0x000880, length = 0x000180
FLASH_REGS : origin = 0x000A80, length = 0x000060
CSM : origin = 0x000AE0, length = 0x000010
XINTF : origin = 0x000B20, length = 0x000020
CPU_TIMER0 : origin = 0x000C00, length = 0x000008
CPU_TIMER1 : origin = 0x000C08, length = 0x000008
CPU_TIMER2 : origin = 0x000C10, length = 0x000008
PIE_CTRL : origin = 0x000CE0, length = 0x000020
PIE_VECT : origin = 0x000D00, length = 0x000100
ECAN_A : origin = 0x006000, length = 0x000100
ECAN_AMBOX : origin = 0x006100, length = 0x000100
SYSTEM : origin = 0x007010, length = 0x000020
SPI_A : origin = 0x007040, length = 0x000010
SCI_A : origin = 0x007050, length = 0x000010
XINTRUPT : origin = 0x007070, length = 0x000010
GPIOMUX : origin = 0x0070C0, length = 0x000020
GPIODAT : origin = 0x0070E0, length = 0x000020
ADC : origin = 0x007100, length = 0x000020
EV_A : origin = 0x007400, length = 0x000040
EV_B : origin = 0x007500, length = 0x000040
SPI_B : origin = 0x007740, length = 0x000010
SCI_B : origin = 0x007750, length = 0x000010
MCBSP_A : origin = 0x007800, length = 0x000040
CSM_PWL : origin = 0x3F7FF8, length = 0x000008
DRAMH0 : origin = 0x3f9000, length = 0x001000
}
SECTIONS
{
//放在PAGE0
.reset : > PRAMH0, PAGE = 0
.text : > PRAMH0, PAGE = 0
.cinit : > PRAMH0, PAGE = 0
//放在PAGE1
.stack : > RAMM1, PAGE = 1
.bss : > DRAMH0, PAGE = 1
.ebss : > DRAMH0, PAGE = 1
.const : > DRAMH0, PAGE = 1
.econst : > DRAMH0, PAGE = 1
.sysmem : > DRAMH0, PAGE = 1
DevEmuRegsFile : > DEV_EMU, PAGE = 1
FlashRegsFile : > FLASH_REGS, PAGE = 1
CsmRegsFile : > CSM, PAGE = 1
XintfRegsFile : > XINTF, PAGE = 1
CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1
CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1
CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1
PieCtrlRegsFile : > PIE_CTRL, PAGE = 1
PieVectTable : > PIE_VECT, PAGE = 1
ECanaRegsFile : > ECAN_A, PAGE = 1
ECanaMboxesFile : > ECAN_AMBOX PAGE = 1
//在*.cmd中定義段在空間中的位置然后在別的地方再把另外的變量指向這個(gè)空間
SysCtrlRegsFile : > SYSTEM, PAGE = 1
SpiaRegsFile : > SPI_A, PAGE = 1
SciaRegsFile : > SCI_A, PAGE = 1
XIntruptRegsFile : > XINTRUPT, PAGE = 1
GpioMuxRegsFile : > GPIOMUX, PAGE = 1
GpioDataRegsFile : > GPIODAT PAGE = 1
AdcRegsFile : > ADC, PAGE = 1
EvaRegsFile : > EV_A, PAGE = 1
EvbRegsFile : > EV_B, PAGE = 1
ScibRegsFile : > SCI_B, PAGE = 1