實(shí)驗(yàn)4 :編寫一個(gè)匯編和C混合的DSP程序
一.實(shí)驗(yàn)?zāi)康?br>1.在了解純C語言程序工程和匯編語言程序工程結(jié)構(gòu)的基礎(chǔ)上,學(xué)習(xí)在C工程中加入?yún)R編
編程的混合編程方法。
2.了解混合編程的注意事項(xiàng)。
3.理解混合編程的必要性和在什么情況下要采用混合編程。
二.實(shí)驗(yàn)原理
1.使用C語言開發(fā)應(yīng)用程序的優(yōu)缺點(diǎn)
*優(yōu)點(diǎn):
-易于開發(fā)和維護(hù)。由于用C語言書寫接近自然語言,其可讀性強(qiáng)、利于理解,在編
制、修改、實(shí)現(xiàn)算法方面比用匯編語言開發(fā)容易。
-可移植性強(qiáng)。
-不容易發(fā)生流水線沖突。編譯器能提供完善的解決流水線沖突的結(jié)果。
-有大量現(xiàn)存的算法可利用。
-適用于人機(jī)界面的開發(fā)。
*缺點(diǎn):
-代碼量大。
-程序效率較低。
-優(yōu)化代碼存在一定困難。
綜上所述,我們一般用C語言設(shè)計(jì)應(yīng)用程序的總體框架、解決人機(jī)接口和對(duì)速度效率要
求不太高的復(fù)雜算法。
2.使用匯編語言開發(fā)應(yīng)用程序的優(yōu)缺點(diǎn)
*優(yōu)點(diǎn):
-更能發(fā)揮系統(tǒng)特點(diǎn)。由于匯編語言掌控系統(tǒng)硬件的能力強(qiáng)于C語言,設(shè)計(jì)出來的程
序更加貼近硬件特性,往往能將硬件效能發(fā)揮到極致。
-代碼精練,效率高。用匯編語言設(shè)計(jì)的程序,代碼短、不容易產(chǎn)生冗余。
-代碼量小。
*缺點(diǎn):
-可讀性差。不利于復(fù)雜算法的開發(fā)和實(shí)現(xiàn)。
-可移植性差。
-容易產(chǎn)生流水線沖突。由于排除沖突需要靠人來輔助完成,這要求編程人員有較為豐
富的開發(fā)經(jīng)驗(yàn)和對(duì)硬件工作機(jī)制的深刻理解。
3.如何混合編程
(1)混合工程:在工程中可以同時(shí)包含C語言程序和匯編語言程序,無需更改編譯選項(xiàng)。一
般地,我們使用C程序?yàn)橹鳎尤雲(yún)R編語言程序模塊。
(2)使用模塊技術(shù):在應(yīng)用程序中劃分出比較清晰的模塊,不同模塊可采用不同語言設(shè)計(jì)。
強(qiáng)調(diào)效率和速度的模塊采用匯編設(shè)計(jì)。盡量少用匯編語言設(shè)計(jì)程序。
(3)如何找出需要用匯編程序設(shè)計(jì)的模塊:
-用C語言完成設(shè)計(jì)后,運(yùn)用CCS的軟件仿真功能,充分測(cè)試程序,找到程序運(yùn)行中的瓶
頸(速度方面的和空間方面的)。
-再使用分塊仿真技術(shù)盡可能縮小模塊。
-找到的模塊單獨(dú)寫成子程序,存入獨(dú)立的文件中。
-由于CCS編譯器能產(chǎn)生C語言程序到匯編程序的中間文件,觀察需要優(yōu)化的模塊的匯編
結(jié)果,進(jìn)行人工優(yōu)化。
-最后運(yùn)用人工優(yōu)化后形成的匯編程序模塊,代替原來需要優(yōu)化的C語言模塊,進(jìn)行編譯。
-程序中可使用內(nèi)嵌匯編。編譯器可直接使用內(nèi)嵌的匯編語句生成最終代碼。但需要語句
中雙引號(hào)中為合法的匯編語句。
4.何時(shí)使用混合編程技術(shù)
-當(dāng)程序中需要操作與硬件密切相關(guān)的設(shè)備,而用C語言較難實(shí)現(xiàn)時(shí)。比如:在中斷程序
設(shè)計(jì)時(shí)需要設(shè)置中斷向量表,向量表中空間有限用C語言語句有困難,且需向量表要在
內(nèi)存中精確定位,這時(shí)可將設(shè)置中斷向量表的部分用匯編語言代替。
-當(dāng)需要繞開C編譯器的規(guī)定,進(jìn)行特殊操作時(shí)。比如:C語言規(guī)定,程序不能訪問程序
代碼區(qū),而系統(tǒng)功能需要進(jìn)行類似訪問時(shí)可采用限制較小的匯編語言程序設(shè)計(jì)。
-當(dāng)需要提高模塊的效率(包括空間上和時(shí)間上兩方面的),而C語言程序無法達(dá)到要求時(shí)。
5.實(shí)驗(yàn)程序解釋
實(shí)驗(yàn)程序提供了一個(gè)使用C與匯編程序混合編程的實(shí)例,是一個(gè)用匯編語言模塊優(yōu)化自
己編制的應(yīng)用程序的實(shí)例。
首先是一個(gè)純用C語言開發(fā)的工程,再根據(jù)假設(shè),需要將其中一個(gè)模塊改造成用匯編語
言模塊優(yōu)化的模塊。通過實(shí)驗(yàn)過程,用戶可充分了解混合編程可以采取的步驟和方法。
三. 實(shí)驗(yàn)設(shè)備
計(jì)算機(jī),ICETEK-F2812-EDU實(shí)驗(yàn)箱(或ICETEK 仿真器+ICETEK-F2812-A系統(tǒng)板+相關(guān)連
線及電源)。
四.實(shí)驗(yàn)內(nèi)容與步驟
1.實(shí)驗(yàn)準(zhǔn)備
-設(shè)置軟件仿真模式,參看:第一部分、四、1。
-啟動(dòng)CCS。
2.打開工程、瀏覽程序內(nèi)容、編譯生成和下載可執(zhí)行代碼、
(1)打開工程:選擇菜單Project->Open…,選擇打開工程文件
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\lab0104-CAsm\CASM.pjt
(2)展開工程管理窗口中CASM工程,雙擊Source下的CProgram.c項(xiàng),打開CProgram.c源
程序窗口??梢钥吹?,程序完成了一個(gè)簡(jiǎn)單的運(yùn)算,它先開設(shè)了三個(gè)全局變量x、y、z,
然后分別給x 和y賦初值,再在循環(huán)中計(jì)算x+y,結(jié)果賦值給z。
(3)編譯并下載程序(如圖4-1 所示):
此設(shè)置完成在每次編譯完成后將程序自動(dòng)下載到DSP上。
選擇菜單Project->Build All,編譯、連接和下載程序。
(4)運(yùn)行程序,觀察結(jié)果:在程序中有“在此加軟件斷點(diǎn)”注釋的語句上加軟件斷點(diǎn);將變
量z 加入變量觀察窗口(watch window);運(yùn)行程序到斷點(diǎn),觀察變量z 的結(jié)果值。
圖4-1 設(shè)置自動(dòng)下載out文件
3.修改程序
(1)修改算法部分成單獨(dú)子程序:假設(shè)在循環(huán)中進(jìn)行的運(yùn)算是需要用匯編語言程序模塊優(yōu)化
的部分。首先將“z=x+y;”語句修改成“z=add(x,y);”,在程序頭上,變量定義之前加上一
行“int add(int a,int b);”,在程序末尾,添加如下子程序:
int add(int a,int b)
{
return(a+b);
}
如此,將算法搬移到一個(gè)C語言的子程序模塊中實(shí)現(xiàn)。修改完成后,可以編譯、下載、
運(yùn)行到斷點(diǎn),觀察運(yùn)行結(jié)果,判斷是否子程序能完全與原程序一樣完成算法。
(2)將子程序移入add.c:打開一個(gè)新的空的源文件窗口,將main函數(shù)后的子程序復(fù)制到窗口
中;注釋main函數(shù)后面的子程序(在子程序前一行加“/*”,在子程序結(jié)尾行后加“*/”);
將新窗口中的內(nèi)容保存為文件add.c。
(3)將add.c加入工程,編譯、下載、運(yùn)行,檢查結(jié)果,保證運(yùn)算無誤。
(4)選擇菜單Project->Build Options…,進(jìn)行如下設(shè)置(如圖4-2所示):
(5)重新編譯工程;打開
C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\lab0104-CAsm\add.asm;在其中的“.line
2”行、“.line3”行、“.line 4”行頭上分別加分號(hào),即注釋這3 個(gè)語句。
圖4-2 參數(shù)設(shè)置
(6)將工程中的add.c換成add.asm:在工程管理窗口中用鼠標(biāo)右鍵單擊add.c,選擇“Remove
from Project”;用鼠標(biāo)右鍵單擊CASM.pjt,選擇“Add Files to Project…”,選擇
C:\ICETEK-F2812-EDULab\Lab0104-CASM\add.asm。
(7)重新編譯、下載、運(yùn)行程序并觀察結(jié)果。由于add.asm是CCS編譯器從add.c編譯得來的,
下面要做的就是手工調(diào)整add.asm中的匯編代碼,從而實(shí)現(xiàn)優(yōu)化處理。
4.退出CCS
五.預(yù)習(xí)要求
1.了解純C語言程序工程和匯編語言程序工程結(jié)構(gòu)
2.了解混合編程的方法。
六.注意事項(xiàng)
1.在匯編程序中使用其他C語言模塊中定義的變量或函數(shù)名稱時(shí),需要在引用的名稱前加一
下劃線。如:C中定義的變量為x,在匯編中引用時(shí)要用_x。
2.匯編語言寫的子程序需要符合C語言的調(diào)用規(guī)則,尤其是在默認(rèn)的輔助寄存器使用上和棧
的使用上要求兼容。
3.在匯編語言模塊中,需要編程者自己消除流水線沖突。
4.在使用內(nèi)嵌匯編技術(shù)時(shí),需要考慮以下內(nèi)容:
a. 要非常小心地處理,以免破壞C語言操作環(huán)境。編譯器在遇到內(nèi)嵌匯編語句時(shí),不會(huì)
對(duì)其中的匯編語句進(jìn)行分析處理。
b.避免從內(nèi)嵌匯編語句跳轉(zhuǎn)到C語言模塊中,那將極容易造成寄存器使用上的混亂,從而產(chǎn)生難以預(yù)料的結(jié)果。
c.不要在內(nèi)嵌匯編語句中改變C語言模塊中變量的值,但可以安全地讀取它們的值。
d.在匯編程序中不要使用內(nèi)嵌匯編。
七.思考題
使用混合編程法完成計(jì)算sin(2.3π)+cos(1.7π)的值。
八.實(shí)驗(yàn)報(bào)告要求
1.說明修改程序的方法和前后順序
2.說明重新編譯的方法和結(jié)果的觀察情況
評(píng)論