国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

DSP匯編語言與C語言混合編程關(guān)鍵技術(shù)研究

發(fā)布時間:2010-8-12 17:47    發(fā)布者:lavida
關(guān)鍵詞: c語言 , dsp , 匯編語言 , 混合編程
DSP(數(shù)字信號處理器)憑借其高速數(shù)字信號處理功能、實時性強、低功耗、高集成度等嵌入式微計算機的特點,已在通信、航空航天、工業(yè)控制、醫(yī)療、國防、汽車等領(lǐng)域得到了廣泛的應(yīng)用。TMS320LF240xA DSP(以下簡稱LF240xA)是美國TI公司推出的高性能16位數(shù)字信號處理器,它具有運算速度快,在片集成的外設(shè)豐富等特點,故又稱其為DSP控制器。應(yīng)用領(lǐng)域主要針對工業(yè)測控、電機控制、家用電器和消費電子等場合。  

LF240xA的軟件開發(fā)過程,既可以使用匯編語言,也可以使用C語言。匯編語言的代碼執(zhí)行效率高、運行速度快,可以直接對寄存器進行操作,充分發(fā)揮了DSP控制器的硬件性能;但其開發(fā)的工作量大,程序可讀性、移植性差。與匯編語言不同的是,C語言可讀性強、編程簡單、調(diào)試方便,適合編寫結(jié)構(gòu)和算法比較復(fù)雜的程序。然而,對于控制來說,用C語言開發(fā)程序也有其明顯的缺點:首先,C語言代碼有冗余,降低了執(zhí)行效率,對于實時性要求很高的某些控制領(lǐng)域來說不符合要求;其次,C語言無法實現(xiàn)某些底層的操作。  

在具體軟件開發(fā)過程中,可以將匯編語言和C語言結(jié)合起來編程,發(fā)揮各自的優(yōu)點。這樣既能滿足實時性要求又能實現(xiàn)所需的功能,同時兼顧程序的可讀性和編程效率。為此,了解及掌握C語言和匯編語言的混合編程技術(shù)對于DSP的軟件開發(fā)具有重要的意義。  

1 準備工作  

在進行混合編程之前,首先要創(chuàng)造一個運行的基本環(huán)境。這個基本環(huán)境包括存儲空間的分配、DSP寄存器映射地址的定義以及中斷向量的定義等方面。  

(1)存儲空間的分配  

命令文件(*.cmd)用來實現(xiàn)對程序存儲器和數(shù)據(jù)存儲器空間的分配。一是目標存儲器定義(由MEMORY命令定義),二是各段的定位(由SECTIONS命令定義)。  

(2)寄存器映射地址的定義  

頭文件(*.h)用來定義所用到的DSP控制器內(nèi)部寄存器的映射地址,以及用戶自定義的常量、寄存器等。通常,頭文件在主程序的開始,使用匯編指示符“.include”和“.copy”對其調(diào)用。頭文件的定義有2種方式。第1種是以指針變量的形式定義各種寄存器,即采用如下形式:  

volatile unsigned int T1CMPR Ox7402第2種則是用宏定義的方式定義各種寄存器的名稱:  

# define T1CMPR Ox7402  

(3)中斷向量的定義  

LF240xA內(nèi)部提供了多個中斷,如INTl~INT6、TRAP等。復(fù)位中斷向量(c_intO)是在實時運行支持庫(rts2xx.1ib)中定義的一種特殊的中斷,它的作用是先進行軟件堆棧操作,然后初始化全局變量,最后調(diào)用主程序main()。所以當復(fù)位(Reset)時,程序跳轉(zhuǎn)到c_int0進行相應(yīng)的處理。中斷向量表則是將主程序中用到的中斷子程序和相應(yīng)中斷級別類型連接起來的一個簡單的跳轉(zhuǎn)指令表。表中每個中斷向量占2個字,在命令文件中將其聲明到程序存儲器空間的0000h~003Fh。  

2 混合編程的一般方法  

對于LF240xA的混合編程一般有3種方法:一、對C語言程序編譯后形成的匯編程序進行手工修改與優(yōu)化;二、在C語言程序中直接嵌人匯編語句;三、分別編寫C語言程序和匯編語言程序,然后獨立編譯成目標代碼模塊,再進行鏈接。第一種編程方式要求對匯編與C語言都極其熟悉,并且這樣的編程方式對程序的可讀性和擴展性的負面影響比較大,一般不建議使用。第二種方法適用于語句執(zhí)行頻率非常高,并且C編程與匯編編程效率差異較大的情況,例如進入中斷的通用中斷子程序等。第三種方式是混合編程最常用的方式之一,在這種方式下,C語言程序與匯編語言程序均可使用另一方定義的函數(shù)與變量。下面著重介紹后兩種方法。  

2.1 C語言程序中嵌入?yún)R編語言  

C語言程序支持asm指令,所以可以利用這條指令直接將匯編語句嵌入到C語言程序中。LF240xA中一些C語言無法操作的控制位,可以采用這種方式來實現(xiàn)。這種方法只需在匯編語句兩邊加上雙引號并用小括號括起來,前面再加上asm關(guān)鍵字,即“asm(“匯編語句”);”。需要注意的是,匯編語句不能緊挨著前一個雙引號,它們之間必須用空格、Tab或標號開頭。例如,在匯編語言中開中斷指令SETC INTM,嵌入到C語言中為“asm(“SETCINTM”);”。這種方式雖然操作簡單,但是匯編代碼很有可能破壞原來的C語言環(huán)境,從而導(dǎo)致不可預(yù)料的結(jié)果。因此只提倡在程序開始的系統(tǒng)初始化部分少量使用,而在C語言中嵌入實現(xiàn)某一完整功能的多句匯編語言時,不提倡采用這種方式。  

2.2 C語言與匯編語言程序相互調(diào)用  

(1)C語言程序調(diào)用匯編函數(shù)  

C語言程序中調(diào)用的匯編函數(shù),在匯編語言中其名稱以程序標號的形式出現(xiàn)。程序標號作為操作數(shù)用.global進行定義,在前面加下劃線“_”。匯編函數(shù)也可以利用累加器給C語言程序傳遞返回值。  

LF240xA有8個輔助寄存器(AR0~AR7)可供使用,在C語言環(huán)境中這些寄存器都有明確的分工。  

①AR0:幀指針(Frame Pointer,F(xiàn)P)。LF240xA只提供了大小為8個字的硬件棧,不能滿足需要。因此,C環(huán)境定義了一段特殊的存儲器空間,作為軟件棧。軟件棧的作用是分配局部變量、傳遞函數(shù)的參數(shù)、保存處理器的狀態(tài)、保存臨時結(jié)果等。AR0指向軟件棧中函數(shù)局部數(shù)據(jù)空間的起始處。  

②ARl:軟件棧的棧頂指針(Stack Pointer,SP)。ARl為指向軟件棧棧頂?shù)膶S弥羔槨?nbsp; 

③AR2:局部變量指針(Local Variable Pointer,LVP)。AR2存放局部變量的偏移量,與AR0(FP)一起對局部變量進行尋址定位。  

④AR6、AR7:寄存器型變量。在C語言程序中用register修飾的變量存放在AR6、AR7中。  

⑤AR3~AR5:用戶自定義。AR3~AR5沒有特殊的約定,可以由用戶自由決定其用途。在匯編程序的入口處,假設(shè)ARP已經(jīng)被設(shè)置為ARl,這是由C編譯器自動完成的。C語言程序調(diào)用匯編函數(shù)時,匯編函數(shù)程序必須遵循下述規(guī)范:  

①從硬件堆棧中彈出返回地址,然后把它壓入軟件堆棧;  

②把C程序的數(shù)據(jù)結(jié)構(gòu)指針FP壓入堆棧;  

③如果匯編程序改變了AR6或AR7,也需要把它們壓入堆棧;  

④分配局部數(shù)據(jù)結(jié)構(gòu);  

⑤執(zhí)行匯編程序的實際任務(wù)代碼;  

⑥如果匯編程序有返回值,則把這個返回值放入累加器中;  

⑦設(shè)置ARP為ARl;  

⑧解除分配的局部數(shù)據(jù)結(jié)構(gòu);  

⑨如果AR6和AR7曾經(jīng)被保存過,則從軟件堆;謴(fù)它們的值;  

⑩從軟件堆棧恢復(fù)FP;  

⑾把軟件堆棧中存儲的返回地址壓入硬件堆棧;  

⑿返回。  

當匯編函數(shù)調(diào)用完畢后,C語言程序要彈出先前壓入堆棧的傳遞參數(shù)。這個操作通過下面的命令語句實現(xiàn):SBRK i(i是C程序向匯編程序傳遞的參數(shù)個數(shù))。在上述操作過程中,對軟件堆棧的處理至關(guān)重要。圖1所示為C語言程序調(diào)用時軟件堆棧的分配示意圖,具體步驟如下:  

  

①在C語言程序的局部幀后將匯編函數(shù)的參數(shù)依次壓棧;  

②程序指針(PC)跳轉(zhuǎn)到匯編函數(shù)的代碼段;  

③保存出口地址;  

④保存C語言程序局部幀指針;  

⑤分配局部變量;  

⑥調(diào)用結(jié)束前將以上所有內(nèi)容彈出軟件棧。  

下面以具體例子來講述這個操作過程。  




  

(2)匯編語言程序調(diào)用C函數(shù)  

匯編語言程序中調(diào)用C函數(shù)。被調(diào)用的C函數(shù)在C語言環(huán)境中需要用extern進行定義,在匯編程序中用.ref說明為外部標號,且函數(shù)名加“_”。在調(diào)用C函數(shù)之前應(yīng)手工編程將參數(shù)以逆序?qū)懭氘斍斑\行任務(wù)所使用的任務(wù)堆棧中,壓棧之前堆棧指針可不作調(diào)整。被調(diào)用的C函數(shù)即可正常訪問調(diào)用者傳遞的參數(shù),函數(shù)調(diào)用完畢后需要調(diào)整堆棧指針,清除函數(shù)調(diào)用中參數(shù)所占用的堆?臻g。C函數(shù)的返回值可以通過訪問累加器獲得。具體例子如下。  

C語言模塊中編寫乘法函數(shù):  

  

3 注意事項  

(1)中斷的處理  

LF240xA發(fā)生中斷時,程序指針(PC)就指向相應(yīng)的中斷向量,并通過中斷向量映射到相應(yīng)的中斷服務(wù)子程序。例如,在0004h~0005h處是INT2的中斷向量,在此存儲了1條跳轉(zhuǎn)指令,跳轉(zhuǎn)至INT2的服務(wù)子程序。LF240xA的C語言有interrupt修飾符可以用來定義中斷服務(wù)子程序,如下所示:  

  

將上述2個模塊分別編譯后鏈接,就能響應(yīng)INT2中斷了。  

(2)字母大小寫  

在C語言環(huán)境中,對于字母大小寫的區(qū)分是很嚴格的,因此在混合編程的過程中也應(yīng)該嚴格遵守這一點。例如,在寫命令文件時,誤將“.data”寫成“.daTA”,此時系統(tǒng)將無法給初始化代碼分配存儲空間,導(dǎo)致程序無法執(zhí)行。  

(3)C語言庫函數(shù)應(yīng)用  

TI的C編譯器中內(nèi)置了很多函數(shù),包含在rts2xx.1ib的函數(shù)庫中。庫函數(shù)并不是C語言的一部分,它是由人們根據(jù)需要編制并提供給用戶直接使用的。每一種C編譯系統(tǒng)都提供了一批庫函數(shù),不同的編譯系統(tǒng)所提供的庫函數(shù)的數(shù)目、函數(shù)名及函數(shù)功能是不完全相同的。要使用庫函數(shù),只需在源文件中添加語句“#include”函數(shù)名.h””,就可使用相應(yīng)的庫函數(shù)了。  

結(jié) 語  

以上提到的LF240xA DSP的C語言和匯編語言混合編程技術(shù)已經(jīng)在筆者參與開發(fā)的卷煙機重量控制系統(tǒng)的控制軟件中得到應(yīng)用。實踐證明,采用混合編程的軟件更加契合一般嵌入式系統(tǒng)對時問和空間的嚴格約束。設(shè)計良好的混合編程軟件既能有效地滿足嵌入式系統(tǒng)對功能與性能的需求,同時也可以為程序的擴展和移植預(yù)留足夠的空間。混合編程是編制復(fù)雜的LF240xA控制軟件的有效方法,同時也是嵌入式系統(tǒng)軟件最優(yōu)化的重要途徑。
本文地址:http://www.qingdxww.cn/thread-21029-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 特大毛片 | 韩国一级毛片在线观看 | 日韩精品在线观看视频 | 亚洲黄色片在线观看 | 国产无毛| 亚洲综合网在线 | 日本三级欧美三级人妇视频黑白配 | 视频国产免费 | 日本韩国一区二区三区 | 久久精品国产精品亚洲综合 | 亚洲综合欧美在线 | 色婷婷欧美 | 青青草原免费在线 | 久久精品一区二区 | 国产成人a v在线影院 | 国产91情侣在线精品国产 | 亚洲高清视频在线 | 中文有码在线观看 | 日韩欧美在线播放 | 亚洲欧美成人永久第一网站 | 亚洲欧美国产视频 | 最新99国产成人精品视频免费 | 香蕉久久久久 | 四虎影视永久免费 | 无毒不卡在线播放 | 国产在线观看精品 | 久草软件 | 亚洲国产三级在线观看 | 亚洲第一免费 | 久久综合性| 操洞洞| 日韩欧美亚洲国产精品字幕久久久 | 一级毛片特黄久久免费看 | 一级毛片免费一级直接观看 | 日韩精品欧美视频 | 一级成人a毛片免费播放 | 九色国产在视频线精品视频 | 四虎在线永久视频观看 | 大伊香蕉精品一线视频 | 国产午夜人做人免费视频中文 | 国内精品免费麻豆网站91麻豆 |