<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于DSP的混合編程關(guān)鍵技術(shù)研究

基于DSP的混合編程關(guān)鍵技術(shù)研究

作者: 時(shí)間:2012-04-26 來(lái)源:網(wǎng)絡(luò ) 收藏

引 言

本文引用地址:http://dyxdggzs.com/article/257551.htm

(數字信號處理器)憑借其高速數字信號處理功能、實(shí)時(shí)性強、低功耗、高集成度等嵌入式微計算機的特點(diǎn),已在通信、航空航天、工業(yè)控制、醫療、國防、汽車(chē)等領(lǐng)域得到了廣泛的應用。TMS320LF240xA (以下簡(jiǎn)稱(chēng)LF240xA)是美國TI公司推出的高性能16位數字信號處理器,它具有運算速度快,在片集成的外設豐富等特點(diǎn),故又稱(chēng)其為控制器。應用領(lǐng)域主要針對工業(yè)測控、電機控制、家用電器和消費電子等場(chǎng)合。

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

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

1 準備工作

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

(1)存儲空間的分配

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

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

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

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

# define T1CMPR Ox7402

(3)中斷向量的定義

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

2 的一般方法

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

2.1 C語(yǔ)言程序中嵌入匯編語(yǔ)言

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

2.2 C語(yǔ)言與匯編語(yǔ)言程序相互調用

(1)C語(yǔ)言程序調用匯編函數

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

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

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

②A(yíng)Rl:軟件棧的棧頂指針(Stack Pointer,SP)。ARl為指向軟件棧棧頂的專(zhuān)用指針。

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

④AR6、AR7:寄存器型變量。在C語(yǔ)言程序中用register修飾的變量存放在A(yíng)R6、AR7中。

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

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

②把C程序的數據結構指針FP壓入堆棧;

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

④分配局部數據結構;

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

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

⑦設置ARP為ARl;

⑧解除分配的局部數據結構;

⑨如果AR6和AR7曾經(jīng)被保存過(guò),則從軟件堆?;謴退鼈兊闹?;

⑩從軟件堆?;謴虵P;

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

⑿返回。

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

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

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

③保存出口地址;

④保存C語(yǔ)言程序局部幀指針;

⑤分配局部變量;

⑥調用結束前將以上所有內容彈出軟件棧。

下面以具體例子來(lái)講述這個(gè)操作過(guò)程。

(2)匯編語(yǔ)言程序調用C函數

匯編語(yǔ)言程序中調用C函數。被調用的C函數在C語(yǔ)言環(huán)境中需要用extern進(jìn)行定義,在匯編程序中用.ref說(shuō)明為外部標號,且函數名加“_”。在調用C函數之前應手工編程將參數以逆序寫(xiě)入當前運行任務(wù)所使用的任務(wù)堆棧中,壓棧之前堆棧指針可不作調整。被調用的C函數即可正常訪(fǎng)問(wèn)調用者傳遞的參數,函數調用完畢后需要調整堆棧指針,清除函數調用中參數所占用的堆??臻g。C函數的返回值可以通過(guò)訪(fǎng)問(wèn)累加器獲得。具體例子如下。

C語(yǔ)言模塊中編寫(xiě)乘法函數:

3 注意事項

(1)中斷的處理

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

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

(2)字母大小寫(xiě)

在C語(yǔ)言環(huán)境中,對于字母大小寫(xiě)的區分是很?chē)栏竦?,因此在混合編程的過(guò)程中也應該嚴格遵守這一點(diǎn)。例如,在寫(xiě)命令文件時(shí),誤將“.data”寫(xiě)成“.daTA”,此時(shí)系統將無(wú)法給初始化代碼分配存儲空間,導致程序無(wú)法執行。

(3)C語(yǔ)言庫函數應用

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

結 語(yǔ)

以上提到的LF240xA DSP的C語(yǔ)言和匯編語(yǔ)言混合編程技術(shù)已經(jīng)在筆者參與開(kāi)發(fā)的卷煙機重量控制系統的控制軟件中得到應用。實(shí)踐證明,采用混合編程的軟件更加契合一般嵌入式系統對時(shí)問(wèn)和空間的嚴格約束。設計良好的混合編程軟件既能有效地滿(mǎn)足嵌入式系統對功能與性能的需求,同時(shí)也可以為程序的擴展和移植預留足夠的空間?;旌暇幊淌蔷幹茝碗s的LF240xA控制軟件的有效方法,同時(shí)也是嵌入式系統軟件最優(yōu)化的重要途徑。



關(guān)鍵詞: DSP 混合編程 LF240xADSP

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>