當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]DSP(數(shù)字信號(hào)處理器)憑借其高速數(shù)字信號(hào)處理功能、實(shí)時(shí)性強(qiáng)、低功耗、高集成度等嵌入式微計(jì)算機(jī)的特點(diǎn),已在通信、航空航天、工業(yè)控制、醫(yī)療、國(guó)防、汽車等領(lǐng)域得到了廣泛的應(yīng)用。

引 言

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

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

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

1 準(zhǔn)備工作

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

(1)存儲(chǔ)空間的分配

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

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

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

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

# define T1CMPR Ox7402

(3)中斷向量的定義

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

2 混合編程的一般方法

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

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

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

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

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

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

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

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

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

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

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

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

①?gòu)挠布褩V袕棾龇祷氐刂?,然后把它壓入軟件堆棧?/p>

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

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

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

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

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

⑦設(shè)置ARP為ARl;

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

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

⑩從軟件堆?;謴?fù)FP;

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

⑿返回。

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

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

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

③保存出口地址;

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

⑤分配局部變量;

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

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

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

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

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

3 注意事項(xiàng)

(1)中斷的處理

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

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

(2)字母大小寫

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

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

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

結(jié) 語(yǔ)

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉