DSP(數(shù)字旌旗燈號(hào)處置器)憑仗其高速數(shù)字旌旗燈號(hào)處置功用、及時(shí)性強(qiáng)、低功耗、高集成度等嵌入式微核算機(jī)的特點(diǎn),已在通訊、航空航天、工業(yè)節(jié)制、醫(yī)療、國防、汽車等范疇獲得了普遍的使用。TMS320LF240xA DSP芯片(以下簡稱LF240xA)是美國TI公司推出的高功能16位數(shù)字旌旗燈號(hào)處置器,它具有運(yùn)算速度快,在片集成的外設(shè)豐厚等特點(diǎn),故又稱其為DSP節(jié)制器。使用范疇首要針對(duì)工業(yè)測(cè)控、電機(jī)節(jié)制、家用電器和消費(fèi)電子等場所。
LF240xA的軟件開拓進(jìn)程,既可以運(yùn)用匯編言語,也可以運(yùn)用C言語。匯編言語的代碼執(zhí)行效率高、運(yùn)轉(zhuǎn)速度快,可以直接對(duì)存放器進(jìn)行操作,充沛發(fā)揚(yáng)了DSP節(jié)制器的硬件功能;但其開拓的任務(wù)量大,順序可讀性、移植性差。與匯編言語分歧的是,C言語可讀性強(qiáng)、編程簡略、調(diào)試便利,合適編寫構(gòu)造和算法比擬復(fù)雜的順序。但是,關(guān)于節(jié)制來說,用C言語開拓順序也有其分明的缺陷:起首,C言語代碼有冗余,降低了執(zhí)行效率,關(guān)于及時(shí)性要求很高的某些節(jié)制范疇來說不契合要求;其次,C言語無法完成某些底層的操作。 在詳細(xì)軟件開拓進(jìn)程中,可以將匯編言語和C言語連系起來編程,發(fā)揚(yáng)各自的長處。如許既能知足及時(shí)性要求又能完成所需的功用,還統(tǒng)籌順序的可讀性和編程效率。為此,調(diào)查及把握C言語和匯編言語的夾雜編程技能關(guān)于DSP的軟件開拓具有主要的意義?! ? 預(yù)備任務(wù) 在進(jìn)行夾雜編程之前,起首要發(fā)明一個(gè)運(yùn)轉(zhuǎn)的根本情況。這個(gè)根本情況包羅存儲(chǔ)空間的分派、DSP存放器映射地址的界說以及中綴向量的界說等方面。 (1)存儲(chǔ)空間的分派 敕令文件(.cmd)用來完成對(duì)順序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器空間的分派。一是目的存儲(chǔ)器界說(由MEMORY敕令界說),二是各段的定位(由SECTI敕令界說)?! ?2)存放器映射地址的界說 頭文件(.h)用來界說所用到的DSP節(jié)制器內(nèi)部存放器的映射地址,以及用戶自界說的常量、存放器等。凡間,頭文件在主順序的開端,運(yùn)用匯編指示符“.include”和“.copy”對(duì)其挪用。頭文件的界說有2種方法。第1種是以指針變量的方式界說各類存放器,即采用如下方式: volatile unsigned int T1CMPR Ox7402第2種則是用宏界說的方法界說各類存放器的稱號(hào): # define T1CMPR Ox7402 (3)中綴向量的界說 LF240xA內(nèi)部供應(yīng)了多個(gè)中綴,如INTl~I(xiàn)NT6、TRAP等。復(fù)位中綴向量(c_intO)是在及時(shí)運(yùn)轉(zhuǎn)支撐庫(rts2xx.1ib)中界說的一種非凡的中綴,它的效果是進(jìn)步前輩行軟件倉庫操作,然后初始化全局變量,最終挪用主順序main()。所以當(dāng)復(fù)位(Reset)時(shí),順序跳轉(zhuǎn)到c_int0進(jìn)行響應(yīng)的處置。中綴向量表則是將主順序頂用到的中綴子順序和響應(yīng)中綴級(jí)別類型銜接起來的一個(gè)簡略的跳轉(zhuǎn)指令表。表中每個(gè)中綴向量占2個(gè)字,在敕令文件中將其聲明到順序存儲(chǔ)器空間的0000h~003Fh。 2 夾雜編程的普通辦法 關(guān)于LF240xA的夾雜編程普通有3種辦法:一、對(duì)C言語順序編譯后構(gòu)成的匯編順序進(jìn)行手工修正與優(yōu)化;二、在C言語順序中直接嵌人匯編語句;三、辨別編寫C言語順序和匯編言語順序,然后自力編譯成目的代碼模塊,再進(jìn)行鏈接。第一種編程方法要求對(duì)匯編與C言語都極端熟習(xí),而且如許的編程方法對(duì)順序的可讀性和擴(kuò)展性的負(fù)面影響比擬大,普通不建議運(yùn)用。第二種辦法合用于語句執(zhí)行頻率十分高,而且C編程與匯編編程效率差別較大的狀況,例如進(jìn)入中綴的通用中綴子順序等。第三種方法是夾雜編程最常用的方法之一,在這種方法下,C言語順序與匯編言語順序均可運(yùn)用另一方界說的函數(shù)與變量。下面著重引見后兩種辦法?! ?.1 C言語順序中嵌入?yún)R編言語 C言語順序支撐asm指令,所以可以應(yīng)用這條指令直接將匯編語句嵌入到C言語順序中。LF240xA中一些C言語無法操作的節(jié)制位,可以采用這種方法來完成。這種辦法只需在匯編語句雙方加上雙引號(hào)并用小括號(hào)括起來,前面再加上asm要害字,即“asm(“匯編語句”);”。需求留意的是,匯編語句不克不及緊挨著前一個(gè)雙引號(hào),它們之間必需用空格、Tab或標(biāo)號(hào)開首。例如,在匯編言語中開中綴指令SETC INTM,嵌入到C言語中為“asm(“SETCINTM”);”。這種方法固然操作簡略,然則匯編代碼很有能夠毀壞本來的C言語情況,然后招致不成意料的后果。因而只倡導(dǎo)在順序開端的系統(tǒng)初始化局部少數(shù)運(yùn)用,而在C言語中嵌入完成某一完好功用的多句匯編言語時(shí),不倡導(dǎo)采用這種方法。 2.2 C言語與匯編言語順序互相挪用 (1)C言語順序挪用匯編函數(shù) C言語順序中挪用的匯編函數(shù),在匯編言語中其稱號(hào)以順序標(biāo)號(hào)的方式呈現(xiàn)。順序標(biāo)號(hào)作為操作數(shù)用.global進(jìn)行界說,在前面加下劃線“_”。匯編函數(shù)也可以應(yīng)用累加器給C言語順序傳遞返回值?! F240xA有8個(gè)輔佐存放器(AR0~AR7)可供運(yùn)用,在C言語情況中這些存放器都有明白的分工?! 、貯R0:幀指針(Frame.Pointer,F(xiàn)P)。LF240xA只供應(yīng)了巨細(xì)為8個(gè)字的硬件棧,不克不及知足需求。因而,C情況界說了一段非凡的存儲(chǔ)器空間,作為軟件棧。軟件棧的效果是分派部分變量、傳遞函數(shù)的參數(shù)、保管處置器的形態(tài)、保管暫時(shí)后果等。AR0指向軟件棧中函數(shù)部分?jǐn)?shù)據(jù)空間的開始處?! 、贏Rl:軟件棧的棧頂指針(Stack Pointer,SP)。ARl為指向軟件棧棧頂?shù)膶S弥羔??! 、跘R2:部分變量指針(Local Variable Pointer,LVP)。AR2寄存部分變量的偏移量,與AR0(FP)一同對(duì)部分變量進(jìn)行尋址定位?! 、蹵R6、AR7:存放器型變量。在C言語順序頂用register潤飾的變量寄存在AR6、AR7中?! 、軦R3~AR5:用戶自界說。AR3~AR5沒有非凡的商定,可以由用戶自在決議其用處。在匯編順序的進(jìn)口處,假定ARP曾經(jīng)被設(shè)置為ARl,這是由C編譯器主動(dòng)完成的。C言語順序挪用匯編函數(shù)時(shí),匯編函數(shù)順序必需遵照下述標(biāo)準(zhǔn): ?、購挠布}庫中彈出返回地址,然后把它壓入軟件倉庫; ?、诎袰順序的數(shù)據(jù)構(gòu)造指針FP壓入倉庫; ?、奂偃鐓R編順序改動(dòng)了AR6或AR7,也需求把它們 壓入倉庫; ?、芊峙刹糠?jǐn)?shù)據(jù)構(gòu)造; ?、輬?zhí)行匯編順序的實(shí)踐義務(wù)代碼; ?、藜偃鐓R編順序有返回值,則把這個(gè)返回值放入累加器中; ?、咴O(shè)置ARP為ARl; ?、嘟獬峙傻牟糠?jǐn)?shù)據(jù)構(gòu)造; ?、峒偃鏏R6和AR7曾經(jīng)被保管過,則從軟件倉庫恢復(fù)它們的值; ?、鈴能浖}庫恢復(fù)FP; ?、习衍浖}庫中存儲(chǔ)的返回地址壓入硬件倉庫; ⑿返回。 當(dāng)匯編函數(shù)挪用終了后,C言語順序要彈出先前壓入倉庫的傳遞參數(shù)。這個(gè)操作經(jīng)過下面的敕令語句完成:SBRK i(i是C順序向匯編順序傳遞的參數(shù)個(gè)數(shù))。在上述操作進(jìn)程中,對(duì)軟件倉庫的處置至關(guān)主要。圖1所示為C言語順序挪用時(shí)軟件倉庫的分派表示圖,詳細(xì)步調(diào)如下: ①在C言語順序的部分幀后將匯編函數(shù)的參數(shù)順次壓棧; ?、陧樞蛑羔?PC)跳轉(zhuǎn)到匯編函數(shù)的代碼段; ?、郾9艹隹诘刂?; ④保管C言語順序部分幀指針; ⑤分派部分變量; ?、夼灿猛戤吳皩⒁陨弦磺袃?nèi)容彈出軟件棧?! ∠旅嬉栽敿?xì)例子來講述這個(gè)操作進(jìn)程?!?2)匯編言語順序挪用C函數(shù) 匯編言語順序中挪用C函數(shù)。被挪用的C函數(shù)在C言語情況中需求用extern進(jìn)行界說,在匯編順序頂用.ref闡明為外部標(biāo)號(hào),且函數(shù)名加“_”。在挪用C函數(shù)之前應(yīng)手工編程將參數(shù)以逆序?qū)懭氘?dāng)時(shí)運(yùn)轉(zhuǎn)義務(wù)所運(yùn)用的義務(wù)倉庫中,壓棧之前倉庫指針可不作調(diào)整。被挪用的C函數(shù)即可正常拜訪挪用者傳遞的參數(shù),函數(shù)挪用終了后需求調(diào)整倉庫指針,肅清函數(shù)挪用中參數(shù)所占用的倉庫空間。C函數(shù)的返回值可以經(jīng)過拜訪累加器取得。詳細(xì)例子如下。 C言語模塊中編寫乘法函數(shù): 3 留意事項(xiàng) (1)中綴的處置 LF240xA發(fā)作中綴時(shí),順序指針(PC)就指向響應(yīng)的中綴向量,并經(jīng)過中綴向量映射到響應(yīng)的中綴效勞子順序。例如,在0004h~0005h處是INT2的中綴向量,在此存儲(chǔ)了1條跳轉(zhuǎn)指令,跳轉(zhuǎn)至INT2的效勞子順序。LF240xA的C言語有interrupt潤飾符可以用來界說中綴效勞子順序,如下所示:
將上述2個(gè)模塊辨別編譯后鏈接,就能呼應(yīng)INT2中綴了?! ?2)字母巨細(xì)寫 在C言語情況中,關(guān)于字母巨細(xì)寫的區(qū)分是很嚴(yán)厲的,因而在夾雜編程的進(jìn)程中也應(yīng)該嚴(yán)厲恪守這一點(diǎn)。例如,在寫敕令文件時(shí),誤將“.data”寫成“.daTA”,此時(shí)系統(tǒng)將無法給初始化代碼分派存儲(chǔ)空間,招致順序無法執(zhí)行?! ?3)C言語庫函數(shù)使用 TI的C編譯器中內(nèi)置了良多函數(shù),包括在rts2xx.1ib的函數(shù)庫中。庫函數(shù)并不是C言語的一局部,它是由人們依據(jù)需求編制并供應(yīng)給用戶直接運(yùn)用的。每一種C編譯系統(tǒng)都供應(yīng)了一批庫函數(shù),分歧的編譯系統(tǒng)所供應(yīng)的庫函數(shù)的數(shù)量、函數(shù)名及函數(shù)功用是不完全一樣的。要運(yùn)用庫函數(shù),只需在源文件中添加語句“#include”函數(shù)名.h””,就可運(yùn)用響應(yīng)的庫函數(shù)了。 結(jié) 語 以上提到的LF240xA DSP的C言語和匯編言語夾雜編程技能曾經(jīng)在筆者參加開拓的卷煙機(jī)分量節(jié)制系統(tǒng)的節(jié)制軟件中獲得使用。理論證實(shí),采用夾雜編程的軟件愈加契合普通嵌入式系統(tǒng)對(duì)時(shí)問和空間的嚴(yán)厲約束。設(shè)計(jì)優(yōu)越的夾雜編程軟件既能有用地知足嵌入式系統(tǒng)對(duì)功用與功能的需求,還也可認(rèn)為順序的擴(kuò)展和移植預(yù)留足夠的空間。夾雜編程是編制復(fù)雜的LF240xA節(jié)制軟件的有用辦法,還也是嵌入式系統(tǒng)軟件最優(yōu)化的主要路子。