分析在A(yíng)pex軟件環(huán)境下,SHARC處理器陣列板與MVME2700單板機基于VME總線(xiàn)的交互通信機制;利用該機制在VxWorks操作系統下,實(shí)現MVME2700單板機對DSP陣列板的被動(dòng)觸式工作時(shí)序控制。 目前,許多信號處理系統DSP都采用Analog Device公司的SHARC系列產(chǎn)品。隨著(zhù)DSP計算能力與應用范圍的不斷增強和擴大,越來(lái)越要求DSP具有實(shí)時(shí)控制能力以及具備多種通信接口。特別隨著(zhù)網(wǎng)絡(luò )技術(shù)的不斷發(fā)展,基于網(wǎng)絡(luò )控制的DSP應用已成為主流;而嵌入式單板機(Signal Board Computer)顯然在實(shí)時(shí)控制與多通信接口及網(wǎng)絡(luò )應用方面具有及大的優(yōu)勢。因此,通常在DSP處理機前端利用單板機設置通信控制器,加強對DSP系統的實(shí)時(shí)控制與外圍通信接口擴展。DSP系統與其前端通信控制器之間是否具有良好的實(shí)時(shí)通信,決定了其整體性能的優(yōu)良程度。本文利用Motorola公司的MVME2700單板機作為DSP信號處理機的前端通信控制器,實(shí)現了對DSP系統的實(shí)時(shí)通信控制。 1 DSP及其前端控制 在需要高強度信號處理能力的領(lǐng)域,一般可采用多塊具有拓撲結構的SHARC處理器VMEBus陣列板作為信號處理機。各陣列板通過(guò)連接線(xiàn)連接,具有很強的信號處理 能力。SHARC陣列板雖具有強大的計算功能,但是卻不適合加載實(shí)時(shí)操作系統,因此其自身管理功能并不強大,并且通信接口擴展性較差,不利于功能擴展和網(wǎng)絡(luò )控制。為了對其實(shí)施合理的工作時(shí)序控制并增強外圍通信功能,在其前端配置一塊單板機,利用VxWorks作為操作系統,并安裝控制程序對SHARC陣列板實(shí)施控制。由于單板機具有良好的通信接口擴展性,該單板機作為信號處理系統的前端機可以外接網(wǎng)絡(luò )接口、視頻接口、I/O接口等等,使得信號處理機可作為一個(gè)完整的分系統接入控制網(wǎng)絡(luò );利用單板機的強大的實(shí)時(shí)控制功能和網(wǎng)絡(luò )功能,使信號處理機發(fā)揮最大功效。下面給出SHARC陣列板與其前端的單板機組成的通信處理系統,如圖1所示。 該嵌入式系統基于標準的VME總線(xiàn)結構,SHARC處理器為ADSP21060,其時(shí)鐘頻率為40MHz,晶體振蕩器的頻率為25.6MHz。每一個(gè)SHARC處理器都支持高達240MB/s的高速通信。對SHARC的軟件開(kāi)發(fā)采用Apex(Advanced parallel excutive),即高級并行執行指令,由Signal Spectrum公司開(kāi)發(fā)的SHARC指令高級開(kāi)發(fā)語(yǔ)言。 Apex提供了性能優(yōu)良的、靈活的并行處理器指令集,以及對DSP硬件的便捷訪(fǎng)問(wèn)功能。同時(shí),Apex還提供了基于VME總線(xiàn)的通信機制,允許從主機下裝SHARC代碼到客戶(hù)機,并且具備在主機和客戶(hù)機之間進(jìn)行數據傳輸的功能。本文采用美國Motorola公司生產(chǎn)的單板機MVME2700,中央處理器PowerPC MPC750作為Melbourne的前端通信控制器。MVME2700是一個(gè)高度集成計算機系統,適用于要求高度實(shí)時(shí)控制管理的系統環(huán)境。它所使用的操作系統就是嵌入式的實(shí)時(shí)操作系統中的佼佼者VxWorks。VxWorks是具有高性能的實(shí)時(shí)操作系統內核。該內核使用中斷驅動(dòng)、搶占優(yōu)先級的任務(wù)調配機制,這種機制使得VxWorks具有高性能的實(shí)時(shí)特性。MVME2700的通信控制程序通過(guò)Tornado軟件在Windows環(huán)境下進(jìn)行程序開(kāi)發(fā)。 2 SHARC的VME總線(xiàn)通信機制分析 如果要實(shí)現MVME2700對SHARC的實(shí)時(shí)控制,則必須了解SHARC是如何基于VME總線(xiàn)對外訪(fǎng)問(wèn)的。由于MVME2700對SHARC陣列板起著(zhù)程序下載、引導和控制作用,在A(yíng)pex開(kāi)發(fā)環(huán)境下視其為主機,而SHARC陣列板則稱(chēng)為目標機。對于SHARC陣列板而言,一般只有根部SAHRC處理器參與VME總線(xiàn)通信。Apex支持兩類(lèi)主機與SHARC系統進(jìn)行VME通信的方式:一類(lèi)方式是在主機應用程序和SHARC陣列板根部處理之間進(jìn)行的較低層的數據塊拷貝,類(lèi)似于簡(jiǎn)單的本地數據拷貝標準C程序當中的memcpy;另一類(lèi)則以客戶(hù)端/服務(wù)端交互的形式在主機與SHARC之間建立通信,利用中斷實(shí)現同步,并且可以多路傳輸。下面對這兩種方式加以分析。 2.1 同存塊拷貝方式 Apex提供主機與SHARC目標機的任何內存地址拷貝數據的函數:cpy_to_SHARC()和cpy_from_SHARC()。給出SHARC陣列板上SHARC-0(根部處理器)的本地地址和主機上的本地址,即可進(jìn)行內存塊拷貝。本質(zhì)上,這是一種基于VME總線(xiàn)的共享內存DMA方式,函數cpy_to_SHARC()和cpy_from_SHARC()自動(dòng)將主機與目標機的本地址釋放成VME總線(xiàn)地址,通過(guò)共享內存進(jìn)行數據傳輸,因此可以不必關(guān)心低層具體的VME總線(xiàn)映射關(guān)系,而將重點(diǎn)在上層數據傳輸。不過(guò),某些情況下需要獲得VME映射關(guān)系的時(shí)候,例如主機需要通過(guò)VME總線(xiàn)對SHARC的控制寄存器進(jìn)行操作,此時(shí)應當利用VxWorks的函數sysLocaltoBusAddr()來(lái)主動(dòng)獲得該寄存器的VME地址映射,對該VME地址進(jìn)行位操作。要做到這一點(diǎn),在NT操作系統下則顯得要麻煩得多。由于SHARC與MVME2700的數據拷貝通過(guò)VME總線(xiàn)傳輸,其數據傳輸速率是非常高的;同時(shí),由于采取了DMA方式,幾乎不需要CPU介入,從而可提高程序執行效率。 2.2 客戶(hù)/服務(wù)的阻塞交互方式 該方式要求每次客戶(hù)端申請獲得服務(wù)的時(shí)候,向系統提供一個(gè)服務(wù)請求。該請求包括標簽和一同發(fā)送的數據包,其結構體數據格式如下: typedef struct{ INT32 tag; /*服務(wù)標簽*/ INT32 param; /*客戶(hù)服務(wù)程序參數*/ INT32 data; /*數據包指針*/ INT16 length; /*數據包長(cháng)度*/ INT16 max_len; /*返回包的最大長(cháng)度*/ } Server_packet 客戶(hù)端提完申請之后就會(huì )進(jìn)入阻塞狀態(tài)等待服務(wù)端的回答。服務(wù)端截獲該申請之后,根據服務(wù)標簽啟動(dòng)相應的服務(wù)模塊,完成相應的服務(wù)之后向客戶(hù)端發(fā)送回復,此時(shí)客戶(hù)端才能停止阻塞恢復運行,如圖2所示。申請和回復這兩種數據包具有同樣的結構,每次最大數據傳輸量不能超過(guò)4KB?蛻(hù)端與服務(wù)端之間的實(shí)時(shí)響應由系統發(fā)送中斷自動(dòng)完成,不需要人為干預,具有較高的實(shí)時(shí)性和安全性。 該方式實(shí)質(zhì)是構架于VME總線(xiàn)中斷之上的。在客戶(hù)端發(fā)送申請包的時(shí)候包含了一個(gè)VME總線(xiàn)中斷,由該中斷驅動(dòng)服務(wù)端的服務(wù)循環(huán)模塊,然后服務(wù)循環(huán)模塊再調用相應的客戶(hù)服務(wù)程序,從而實(shí)現兩路通信握手。該方式將底層的VME總線(xiàn)中斷驅動(dòng)機制封裝起來(lái),在上層建立了規范的服務(wù)循環(huán)模塊并且允許添加個(gè)人服務(wù)程序,對于軟件的規范與維護有利。當然,如果需要更高的實(shí)時(shí)性,可以不采用該方式,而是由客戶(hù)端直接發(fā)送VME總線(xiàn)中斷來(lái)實(shí)現握手,但必須對于底層的中斷寄存器直接操作,不易維護。需要指出的是,對于具有拓撲結構的SHARC芯片組而言,只能由根端SHARC處理器作為客戶(hù)端,內存拷貝也只能在根部SHARC處理器與服務(wù)端處理機之間進(jìn)行。 2.3 Apex通信機制在單板機控制中的應用 一般來(lái)說(shuō),進(jìn)行高強度運算的信號處理機都應該具有嚴格的工作時(shí)序,在每個(gè)工作時(shí)序進(jìn)入相應的工作狀態(tài),這有利于其它分系統的相關(guān)處理以及信號處理機運算流程的合理安排。因此,對于信號處理機可以采取被動(dòng)觸發(fā)控制,即信號處理機完成當前工作時(shí)序之后向通信控制器提交下一工作時(shí)序請求,通信控制器可根據外部指令(通過(guò)網(wǎng)絡(luò ))決定何時(shí)執行,這期間信號處理機應當處理阻塞狀態(tài)等待回答。那么通信控制器可以利用Apex提供的第二類(lèi)交互方式,作為服務(wù)端實(shí)時(shí)響應SHARC的服務(wù)申請,并根據整體系統工作時(shí)序決定信號處理機的阻塞時(shí)間;同時(shí),該方式提供每次4KB的傳輸量,可以用來(lái)下發(fā)工作參數和其它命令。這樣既可避免繁瑣的中斷同步設置,又有利于軟件的范也維護;而進(jìn)行大指數據傳輸應當第一類(lèi)方式?紤]到采取該方式缺乏握手機制,故應當在交互方式以及VxWorks的多任務(wù)協(xié)調與約束下進(jìn)行避免數據傳輸發(fā)生沖突與覆蓋。 3 被動(dòng)觸發(fā)控制實(shí)現 3.1 阻塞式時(shí)序控制 要實(shí)現對信號處理機的被動(dòng)觸發(fā)控制,必須在通信控制器上建立面向SHARC陣列板的服務(wù)模塊。Apex提供一個(gè)SHARC_system對象,所有的服務(wù)都基于該對象建立,包括Melbourne引導。該類(lèi)中的成員函數SHARC_system::transaction的作用是初始化一個(gè)雙向通信管道,客戶(hù)端/服務(wù)端的交互通道都通過(guò)該通道進(jìn)行。完成管道初始化之后,調用相應的成員函數SHARC_system::service_loop建立服務(wù)循環(huán),如下面的程序所示: /*服務(wù)循環(huán)線(xiàn)程*/ int service_thread(SHARC_system *sys){ int status; printf(“service thread running...”); sys->service_loop(Timeout(ENVER));/*啟動(dòng)服務(wù)循環(huán)*/ sys->exit_status(%26;amp;status); /*退出服務(wù)循環(huán)*/ exit(status); return status; } 利用VxWorks的任務(wù)產(chǎn)生函數taskSpawn(),將service_thread服務(wù)循環(huán)派生成一個(gè)獨立的線(xiàn)程來(lái)處理SHARC的申請。當SHARC的程序退出后,通信控制器的循環(huán)也將自動(dòng)終止。 由于服務(wù)端必須根據客戶(hù)端提供的服務(wù)標簽調用相應的服務(wù),這就要求為SHARC_system類(lèi)加載個(gè)人的服務(wù)程序。首先,定義系統標準類(lèi)Service_group的繼承類(lèi)Custom_group。然后,在這個(gè)類(lèi)當中添加自己的成員函數,即通信控制器SHARC的服務(wù)程序;同時(shí),再定義一個(gè)向量表table[],將不同成員函數名稱(chēng)順次列在其中編制成服務(wù)標簽,如下所示: Custom_call Custom_group::table[]={ /*在向量表里添加服務(wù)標簽,第一個(gè)對應的標簽序號為0 (table[0]),第二個(gè)為1(table),以后的以此類(lèi)推*/ executCommand1, executCommand2, …… }; void Custom_group::executCommand1(Server_packet *pkt){ /*在這里用戶(hù)寫(xiě)入自己的服務(wù)代碼*/ } 當服務(wù)端接收到了申請后,會(huì )立刻自動(dòng)調用Custom_group::call_service()。該函數的作用是讀取服務(wù)標簽號碼,并從table[]當中取出相應的客戶(hù)服務(wù)程序執行它,如下所示: void Custom_group::call_service(Server_packet *pkt){ int tag=MINOR_TAG(pkt->tag); /*讀取申請包里的標簽序號*/ if(tag>=0 %26;amp;%26;amp; tag*(table[tag]))(pkt); /*根據標簽調用相應的服務(wù)*/ } …… } 此時(shí)可將需要下達的指令裝載在回復包,當客戶(hù)服務(wù)程序執行完畢之后,該回復包立刻被自動(dòng)發(fā)送出去,因此,可在允許信號處理機進(jìn)入下一工作時(shí)序的時(shí)候將客戶(hù)服務(wù)程序返回。在Custom_group類(lèi)當中可以添加各項控制服務(wù)項目,例如Melbourne開(kāi)機/關(guān)機、工作參數下發(fā)等等。 3.2 非阻塞數據拷貝方式 由于這種客戶(hù)/服務(wù)交互通信采用了阻塞模式,即SHARC必須等待通信控制器的回復才可以繼續執行,但在某些情況下SHARC不需要等待。例如,SHARC提出申請,通知通信控制器將計算完畢的數據取走,而SHARC不必等待通信控制器將數據拷貝完畢才執行后面的計算。為了避免一直阻塞,可在相應的客戶(hù)服務(wù)程序當中設置一個(gè)信號燈,當該程序被調用的時(shí)候即釋放該信號燈,由信號燈驅動(dòng)其它的模塊進(jìn)行數據拷貝,而該客戶(hù)服務(wù)程序立刻返回使SHARC解除阻塞狀態(tài),如圖3所示。 要實(shí)現該功能,可采取如下的程序代碼: void Custom_group::executCommand1(Server_packet *pkt){ semGive(semId); /*信號燈驅動(dòng)數據拷貝模塊*/ return; } /*數據拷貝模塊*/ void SharcDataCopy(void){ semTake(semId); /*等待獲得信號燈*/copy_from_SHARC(localBuffer,SHARCBufferAddress,dataLength); /*從SHARC拷貝數據*/ } 通過(guò)以上代碼,當SHARC提出申請后,通信控制器立刻響應該申請,并在客戶(hù)服務(wù)程序當中釋放信號燈。驅動(dòng)數據拷貝模塊向Melbourne的根部處理器提取數據,客戶(hù)服務(wù)程序迅速返回,解除信號處理機的阻塞狀態(tài)。 4 結論 通過(guò)以上的步驟,MVME2700作為服務(wù)端可以隨時(shí)響應SHARC的服務(wù)請求,利用阻塞特性執行相應的時(shí)序控制操作;同時(shí),也可以執行非阻塞數據拷貝,從而在VxWorks環(huán)境下建立起通信控制器與SHARC之間完整的被動(dòng)觸發(fā)控制模式。實(shí)際上,也可以由SHARC作為服務(wù)端,MVME2700作為客戶(hù)端,建立的方法與上述基本一致。這種模式下,陣列板的任何一塊SHARC處理器均可以作為服務(wù)端,而并非僅有根部處理器。 |