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