|
 |
ADI操作系統(tǒng) |
 |
|
 |
基于VDK的ADI DSP軟件開發(fā)技術(shù) |
[ 作者: ] [ 來(lái)源:ADSP開源社區(qū) ] [ 發(fā)布時(shí)間:2011/4/13 ] |
|
當(dāng)前數(shù)字信號(hào)處理器(DSP)已廣泛應(yīng)用于圖像處理、智能化儀表、通信、自動(dòng)控制等許多領(lǐng)域。AD公司是全球通用DSP領(lǐng)域最有影響力的廠家之一,VDK (VisualDSPKernel)是ADI公司DSP軟件開發(fā)工具VisualDSP的一個(gè)重要組成部分,他特別適合用來(lái)編寫需要精巧控制代碼的應(yīng)用程序。某些大型系統(tǒng)可能需要許多算法完成,而每個(gè)算法還可能包含許多功能模塊,這要由控制代碼加以組織。處理器日益強(qiáng)大功能的發(fā)揮也需要精巧的控制代碼;赩DK開發(fā)的程序中,這些控制碼是由一個(gè)叫“內(nèi)核”的程序管理的,內(nèi)核常駐在DSP中。
1. VDK的原理
VDK實(shí)際上是一種帶API(Application ProgramInterface)函數(shù)庫(kù)的實(shí)時(shí)操作系統(tǒng)內(nèi)核。下面先對(duì)VDK的各個(gè)組成部分加以介紹,然后總體描述其工作原理。文中所述的被調(diào)用的函數(shù)均在API函數(shù)庫(kù)中。
1.1 線程
一個(gè)應(yīng)用程序可以劃分為多個(gè)功能模塊,每個(gè)模塊可以用一個(gè)線程實(shí)現(xiàn),線程之間可以互相通信。線程并不是直接定義的,而是先定義線程類型,再由線程類型例化得到。一個(gè)線程類型可以有多個(gè)例化,也就是說(shuō)一個(gè)系統(tǒng)中多個(gè)線程可以屬于相同的線程類型。線程類型實(shí)質(zhì)上是各空間VDK下線程類的子類,而線程是該子類例化得到的對(duì)象。線程類型創(chuàng)建時(shí)被分配一個(gè)默認(rèn)的優(yōu)先級(jí),該優(yōu)先級(jí)可以通過(guò)調(diào)用函數(shù)SetPriority()改變,同一類型的線程具有相同的優(yōu)先級(jí)。每個(gè)線程包含5個(gè)成員函數(shù):創(chuàng)建函數(shù)、初始化函數(shù)、運(yùn)行函數(shù)、錯(cuò)誤處理函數(shù)和銷毀函數(shù)。創(chuàng)建函數(shù)類似于C++中類的構(gòu)造函數(shù),用于創(chuàng)建一個(gè)線程并為他分配資源。銷毀函數(shù)類似于C++中類的析構(gòu)函數(shù),用于銷毀一個(gè)線程并釋放其所占資源。包含線程所要完成算法的運(yùn)行函數(shù)是線程的核心部分,類似于C中的main ()函數(shù)。
1.2 調(diào)度
調(diào)度是一種管理和協(xié)調(diào)線程的機(jī)制,他保證優(yōu)先級(jí)最高的就緒線程能夠最早占用處理器來(lái)運(yùn)行。所謂就緒,就是線程已經(jīng)具備運(yùn)行所需的所有數(shù)據(jù)、參數(shù)等資源。調(diào)度在具有最高優(yōu)先級(jí)的線程改變時(shí)被激發(fā)。調(diào)度的實(shí)現(xiàn)基于一種被稱為就緒隊(duì)列的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。就緒隊(duì)列中的就緒線程先按優(yōu)先級(jí)排隊(duì),然后遵循先進(jìn)先服務(wù)的原則占用處理器,如圖1所示。線程最高優(yōu)先級(jí)為0,是保留的;最低優(yōu)先級(jí)為DSP數(shù)據(jù)字寬減去2,如32 b DSP為30。具有最低優(yōu)先級(jí)的線程是預(yù)定義的IDLE線程,他在就緒隊(duì)列為空時(shí)自動(dòng)運(yùn)行,使得DSP處于低功耗狀態(tài)。
1.3 信號(hào)
信號(hào)是線程之間進(jìn)行通信和同步的橋梁。(Semaphore)、事件位和事件(Event and EventBit)、設(shè)備標(biāo)志(Device Flag)。
信標(biāo)是應(yīng)用系統(tǒng)中所有線程都可訪問(wèn)的全局資源的抽象,VisualDSP2.0中他有2個(gè)值:真和假。他的值為真時(shí),表示該資源可用,所有正在等待該信標(biāo)的線程中優(yōu)先級(jí)最高的那一個(gè)進(jìn)入就緒隊(duì)列等候運(yùn)行;他的值為假時(shí),表示該資源已被占用。線程或者中斷服務(wù)程序利用信標(biāo)所代表的資源完成自己的任務(wù)后調(diào)用 API函數(shù)釋放該資源以便其他線程或者中斷服務(wù)程序使用。
事件和事件位是標(biāo)識(shí)系統(tǒng)狀態(tài)的信號(hào),用于協(xié)調(diào)線程的執(zhí)行。事件位用來(lái)指示系統(tǒng)某一要素所處狀態(tài);事件是所有事件位按照指定規(guī)則進(jìn)行布爾操作的結(jié)果。任何一個(gè)事件位改變都會(huì)導(dǎo)致事件的值被重新計(jì)算。信標(biāo)標(biāo)識(shí)系統(tǒng)資源是否可用,而事件位和事件標(biāo)識(shí)線程中的操作主體利用系統(tǒng)資源完成其工作后所處的狀態(tài)。線程可以調(diào)用PendEvent()等候一個(gè)事件發(fā)生。
設(shè)備標(biāo)志是設(shè)備驅(qū)動(dòng)與線程之間聯(lián)系的紐帶。例如他可以將A/D采樣數(shù)據(jù)的到來(lái)這一事件通知多個(gè)等待這些數(shù)據(jù)的線程,而信標(biāo)、事件和事件位就不能描述他。由于和設(shè)備驅(qū)動(dòng)息息相關(guān),后面將會(huì)結(jié)合設(shè)備驅(qū)動(dòng)對(duì)設(shè)備標(biāo)志進(jìn)行詳細(xì)介紹。
1.4 中斷服務(wù)程序
VDK的中斷服務(wù)程序必須用匯編語(yǔ)言編寫而且應(yīng)該比較短小,完成釋放信標(biāo)、改變事件位、激活設(shè)備驅(qū)動(dòng)、與線程交換數(shù)據(jù)等工作,而所有的計(jì)算應(yīng)該在線程域完成。中斷可以調(diào)用API函數(shù)被允許或禁止。
1.5 設(shè)備驅(qū)動(dòng)
基于VDK的應(yīng)用程序可以分解為2個(gè)域:線程域和中斷域。圖2所示線程域中對(duì)線程進(jìn)行管理的機(jī)制稱為軟件調(diào)度,也就是前文所述的調(diào)度,由內(nèi)核完成;中斷域中對(duì)中斷進(jìn)行管理的機(jī)制稱為硬件調(diào)度,由DSP硬件(中斷控制器)完成。硬件調(diào)度和軟件調(diào)度是并行的,但中斷發(fā)生時(shí)硬件調(diào)度搶先發(fā)生,這時(shí)軟件調(diào)度和線程的優(yōu)先級(jí)是無(wú)意義的。
眾所周知,操作系統(tǒng)是將鍵盤、顯示器、打印機(jī)和通信端口作為擴(kuò)充文件來(lái)處理的,而這種處理是通過(guò)設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)的。作為一種操作系統(tǒng)內(nèi)核,VDK也對(duì)外部設(shè)備進(jìn)行抽象,可以調(diào)用API函數(shù)對(duì)他們進(jìn)行打開和關(guān)閉、同步讀和同步寫以及控制。設(shè)備驅(qū)動(dòng)是線程域和中斷域之間溝通的橋梁,也是VDK應(yīng)用程序與外部環(huán)境通信的接口。其代碼既不在線程中也不在中斷服務(wù)程序中,而是一個(gè)獨(dú)立的函數(shù),他也不直接被內(nèi)核和中斷控制器調(diào)度。設(shè)備標(biāo)志是與設(shè)備驅(qū)動(dòng)相關(guān)聯(lián)的信號(hào)。一個(gè)設(shè)備標(biāo)志為真時(shí),就表示與該標(biāo)志對(duì)應(yīng)的設(shè)備準(zhǔn)備好,所有等待該設(shè)備標(biāo)志的線程進(jìn)入就緒隊(duì)列。
1.6 API
API(Application Programming Interface)是存放應(yīng)用程序可以調(diào)用的函數(shù)和宏的庫(kù)。API函數(shù)庫(kù)為VDK提供基本的服務(wù):中斷處理、調(diào)度管理、線程管理、信標(biāo)管理、事件和事件位以及設(shè)備標(biāo)志的傳遞等。
VDK總體工作原理可以用圖3描述。
VDK應(yīng)用程序以線程域和中斷域?yàn)橹黧w,以信號(hào)為紐帶,以設(shè)備驅(qū)動(dòng)作為與外部環(huán)境進(jìn)行通信的接口,以調(diào)度為線程和中斷的管理和協(xié)調(diào)機(jī)制來(lái)完成復(fù)雜的控制功能。
2. 使用VDK開發(fā)應(yīng)用程序的優(yōu)點(diǎn)
使用VDK開發(fā)AD系列DSP應(yīng)用程序具有以下優(yōu)點(diǎn):
1)開發(fā)周期比手寫控制代碼要短得多。代碼自27動(dòng)生成、文件模板和設(shè)備驅(qū)動(dòng)的標(biāo)準(zhǔn)接口,使軟件開發(fā)者可以專注于算法和控制流程的設(shè)計(jì),而不是程序執(zhí)行的細(xì)節(jié)。
2)調(diào)試方便。 程序執(zhí)行過(guò)程中發(fā)生的線程切換、信號(hào)的等待和公布(post)等重要事件可用圖形和圖表直觀地表示出來(lái)。
3)碼的可移植性和可重用性。VDK提供了硬件的抽象層,用戶可以用高級(jí)語(yǔ)言(C或C++)進(jìn)行同硬件平臺(tái)無(wú)關(guān)的編程,生成的代碼可以移植到AD公司所有的DSP核中。許多繁瑣的數(shù)據(jù)讀寫等基本工作可以直接調(diào)用API函數(shù)而無(wú)需自己編寫。
4)項(xiàng)目管理方便。采用基于線程的編程方式,可以把應(yīng)用程序分解成許多獨(dú)立的模塊進(jìn)行編寫和調(diào)試,為項(xiàng)目管理提供了極大的方便。
3. 結(jié)語(yǔ)
VDK非常適合用于構(gòu)造需要精巧控制代碼的系統(tǒng),這些系統(tǒng)中許多事件往往是隨機(jī)發(fā)生的。針對(duì)實(shí)際的應(yīng)用系統(tǒng),我們首先要進(jìn)行深入分析,建立系統(tǒng)模型,從中抽象出所要?jiǎng)?chuàng)建的線程類型、信號(hào)、設(shè)備驅(qū)動(dòng)、中斷服務(wù)程序等,然后就可以著手在VDK環(huán)境下編寫應(yīng)用程序了。值得一提的是系統(tǒng)參數(shù)、線程類型、信號(hào)及其參數(shù)、設(shè)備驅(qū)動(dòng)、中斷服務(wù)程序等均可在Project窗口中的Kernel頁(yè)直接手動(dòng)定義,VDK會(huì)自動(dòng)生成內(nèi)核文件存儲(chǔ)他們,非常方便。 |
|
|