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