實(shí)驗(yàn)2 : 編寫一個(gè)以C 語言為基礎(chǔ)的DSP程序
一.實(shí)驗(yàn)?zāi)康?br>1.學(xué)習(xí)用標(biāo)準(zhǔn)C語言編制程序;了解常用的C語言程序設(shè)計(jì)方法和組成部分。
2.學(xué)習(xí)編制連接命令文件,并用來控制代碼的連接。
3.學(xué)會(huì)建立和改變map文件,以及利用它觀察DSP內(nèi)存使用情況的方法。
4.熟悉使用軟件仿真方式調(diào)試程序。
二.實(shí)驗(yàn)原理
1. 標(biāo)準(zhǔn)C語言程序
CCS支持使用標(biāo)準(zhǔn)C語言開發(fā)DSP應(yīng)用程序。當(dāng)使用標(biāo)準(zhǔn)C語言編制的程序時(shí),其源
程序文件名的后綴應(yīng)為.c(如:volume.c)。
CCS在編譯標(biāo)準(zhǔn)C語言程序時(shí),首先將其編譯成相應(yīng)匯編語言程序,再進(jìn)一步編譯成目
標(biāo)DSP的可執(zhí)行代碼。最后生成的是coff格式的可下載到DSP中運(yùn)行的文件,其文件名后
綴為.out。
由于使用C語言編制程序,其中調(diào)用的標(biāo)準(zhǔn)C的庫函數(shù)由專門的庫提供,在編譯連接時(shí)
編譯系統(tǒng)還負(fù)責(zé)構(gòu)建C運(yùn)行環(huán)境。所以用戶工程中需要注明使用C的支持庫。
2. 命令文件的作用
命令文件(文件名后綴為cmd)為鏈接程序提供程序和數(shù)據(jù)在具體DSP硬件中的位置分配
信息。通過編制命令文件,我們可以將某些特定的數(shù)據(jù)或程序按照我們的意圖放置在DSP
所管理的內(nèi)存中。命令文件也為鏈接程序提供了DSP外擴(kuò)存儲(chǔ)器的描述。在程序中使用CMD
文件描述硬件存儲(chǔ)區(qū),可以只說明使用部分,但只要是說明的,必須和硬件匹配,也就是只
要說明的存儲(chǔ)區(qū)必須是存在的和可用的。
3. 內(nèi)存映射(map)文件的作用
一般地,我們?cè)O(shè)計(jì)、開發(fā)的DSP程序在調(diào)試好后,要固化到系統(tǒng)的ROM中。為了更
精確地使用ROM空間,我們就需要知道程序的大小和位置,通過建立目標(biāo)程序的map文件
可以了解DSP代碼的確切信息。當(dāng)需要更改程序和數(shù)據(jù)的大小和位置時(shí),就要適當(dāng)修改cmd
文件和源程序,再重新生成map文件來觀察結(jié)果。另外,通過觀察map文件,可以掌握DSP
存儲(chǔ)器的使用和利用情況,以便進(jìn)行存儲(chǔ)器方面的優(yōu)化工作。
4.程序設(shè)計(jì)要求
程序框圖(圖2-1):
三.實(shí)驗(yàn)設(shè)備
PC兼容機(jī)一臺(tái),操作系統(tǒng)為Windows2000(或Windows98,WindowsXP,以下默認(rèn)為
Windows2000),安裝Code Composer Studio 2.0軟件。
四.實(shí)驗(yàn)內(nèi)容與步驟
1.實(shí)驗(yàn)準(zhǔn)備
設(shè)置軟件仿真模式,參看:本書第一部分、四、1。
2.建立新的工程文件
(1)雙擊桌面上圖標(biāo),
啟動(dòng)Code Composer Studio 2.21。
(2)進(jìn)行以下設(shè)置(如圖2-2):
3.編輯輸入源程序
(1)C語言程序
-先新建源程序窗口:
-輸入源程序:
int x,y,z;
main()
{
x=1; y=2;
while ( 1 )
{
z=x+y;
}
}
圖2-3 新建源文件
-保存源程序?yàn)镃Program.c:
(2)連接命令文件
-如同第(1)步操作,建立空的源程序窗口。
-輸入連接命令文件內(nèi)容:
-l rts2800.lib
-stack 400h
-heap 100
MEMORY
{
PAGE 0 : PROG(R) : origin = 0x3E8000, length = 0x10000
PAGE 0 : BOOT(R) : origin = 0x3FF000, length = 0xFC0
PAGE 0 : RESET(R) : origin = 0x3FFFC0, length = 0x2
PAGE 0 : VECTORS(R) : origin = 0x3FFFC2, length = 0x3E
PAGE 1 : M0RAM(RW) : origin = 0x000000, length = 0x400
PAGE 1 : M1RAM(RW) : origin = 0x000400, length = 0x400
PAGE 1 : L0L1RAM(RW) : origin = 0x008000, length = 0x2000
圖2-4 保存為c文件
PAGE 1 : H0RAM(RW) : origin = 0x3F8000, length = 0x2000
}
SECTIONS
{
/* 22-bit program sections */
.reset : > RESET, PAGE = 0
vectors : > VECTORS, PAGE = 0
.pinit : > PROG, PAGE = 0
.cinit : > PROG, PAGE = 0
.text : > PROG, PAGE = 0
/* 16-Bit data sections */
.const : > L0L1RAM, PAGE = 1
.bss : > L0L1RAM, PAGE = 1
.stack : > M1RAM, PAGE = 1
.sysmem : > M0RAM, PAGE = 1
/* 32-bit data sections */
.ebss : > H0RAM, PAGE = 1
.econst : > H0RAM, PAGE = 1
.esysmem : > H0RAM, PAGE = 1
}-l rts2800.lib
-如同第(1)步操作,將文件存為:
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\Lab0102-CProgram \CProgram.cmd
(3) 將上述編譯的源程序加入工程CProgram.pjt。
5.編譯源文件、下載可執(zhí)行程序
(1) 單擊菜單“Project”、“Rebuild All”。
(2) 執(zhí)行FileàLoad Program ,在隨后打開的對(duì)話框中選擇剛剛建立的
C:\ICETEK-F2812-EDULab\Lab0102-CProgram\debug\CProgram.out 文件。完成后,系
統(tǒng)自動(dòng)打開一個(gè)反匯編窗口“Disassembly”,并在其中指示程序的入口地址為
“_c_int00”。
6.打開觀察窗口
開啟CPU寄存器觀察窗口:單擊菜單View->Registers->Core。
7.觀察程序運(yùn)行結(jié)果
這時(shí),在“Disassembly”代表程序運(yùn)行位置的綠色箭頭指向程序的入口地址,程序?qū)?br>此開始執(zhí)行。
(1) 選擇菜單中Debug->Go Main,CCS自動(dòng)打開CProgram.c,程序會(huì)停在用戶主程序入
口main上,這從反匯編窗口和CProgram.c窗口中的指示箭頭位置可以看出。
(2) 在內(nèi)存觀察窗口中觀察變量的值:
選擇“View”菜單中“Memory…”項(xiàng),在“Memroy Window Options”窗口中的“Adress”
項(xiàng)中輸入&x,單擊“OK”完成設(shè)置;“Memory”窗口中x 的當(dāng)前取值顯示在第1個(gè)地
址的后。
(3) 將變量x、y、z分別加入觀察窗口:
在源程序中雙擊變量名,再單擊鼠標(biāo)右鍵,選擇“Add to Watch Window”。這時(shí),這3
個(gè)變量還未作初始化。
(4) 單步運(yùn)行2次,在觀察窗中觀察到變量x、y被賦值。變化的值被顯示成紅色。同時(shí)
在“Memory”窗口中也能觀察到x和y值的改變。
(5) 再單步運(yùn)行,可觀察到z 的值被計(jì)算出來。雙擊觀察窗口中變量x、y在“Value”欄
中的取值并修改成其他取值,單步運(yùn)行后觀察結(jié)果。
(6) 雙擊觀察窗口中變量x、y在“Value”欄中的取值,并修改成0;選擇菜單
Debug->Restart,返回程序起點(diǎn)。
(7) 重新單步運(yùn)行程序
8.內(nèi)存映像文件
(1) 選擇菜單Project->Build Options…,啟動(dòng)“Build Options”工程設(shè)置對(duì)話框。
(2) 單擊“Linker”屬性頁,在“Map Filename”項(xiàng)中觀察生成的map文件名和路徑。
(3) 單擊“取消”退出。
9.對(duì)照觀察map文件和cmd文件的內(nèi)容
(1) 選擇菜單File->Open…,將找到
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\Lab0102-CProgram \Debug目錄,將文
件類型改為“Memory Map Files”,選擇CProgram.map文件、打開。
(2) 打開CProgram.cmd 文件。
(3) 程序的入口地址:map文件中“ENTRY POINT SYMBOL”中說明了程序入口地址
(_c_int00)。
(4) 內(nèi)存使用情況:
-map文件中“MEMORY CONFIGURATION”標(biāo)明了程序占用RAM 的使用情況,共占
用aaH 個(gè)存儲(chǔ)單元。
-觀察map文件中的“SECTION ALLOCATION MAP”段,可以看出CProgram.obj的入
口地址為0x3e801e,這也是main函數(shù)的入口地址。
-用戶堆棧段從400H 開始,程序運(yùn)行到main函數(shù)中后,變量x、y、z 均開設(shè)在棧中。
-還能看出程序運(yùn)行都需要調(diào)用rts2800.lib 中的哪些模塊。
10.改變內(nèi)存分配
修改cmd文件中的
PAGE 0 : PROG(R) : origin = 0x3E8000, length = 0x10000
改為
PAGE 0 : PROG(R) : origin = 0x3E9000, length = 0x10000
重新編譯工程,觀察map文件中有何變化。
11.退出CCS
五.預(yù)習(xí)要求
1.熟悉C語言,了解常用的C語言程序設(shè)計(jì)方法。
2.了解DSP內(nèi)存的分配情況。
六.注意事項(xiàng)
在重新單步運(yùn)行程序,注意觀察在CPU寄存器窗口中,各寄存器使用情況,觀察哪個(gè)
寄存器參與了運(yùn)算。
七.思考題
修改程序完成計(jì)算sin(2.3π)+cos(1.7π)的值。
八. 實(shí)驗(yàn)報(bào)告要求
1.通過實(shí)驗(yàn)可以發(fā)現(xiàn),修改cmd文件可以安排程序和數(shù)據(jù)在DSP內(nèi)存資源中的分配和位置;
map文件中描述了程序和數(shù)據(jù)所占用的實(shí)際尺寸和地址。
2.C語言編制的程序,在經(jīng)過編譯器編譯后,需要連接若干C標(biāo)準(zhǔn)程序輔助運(yùn)行。以下是
運(yùn)行流程:
(1)程序入口為_c_int00,執(zhí)行標(biāo)準(zhǔn)C庫中的程序,負(fù)責(zé)初始化C環(huán)境、申請(qǐng)堆棧、初始化
有初始值的變量等。
(2)程序最終轉(zhuǎn)到用戶編制的主函數(shù)運(yùn)行。
(3)程序在主函數(shù)中的無限循環(huán)中持續(xù)運(yùn)行。
評(píng)論
查看更多