胡廣浩,阮福明,趙希昉,黃德友,井中武
(中海油田服務(wù)股份有限公司 物探事業(yè)部,天津 300450)
中國海油開展自主海上高精度地震勘探裝備研發(fā),成功研制出具有自主知識(shí)產(chǎn)權(quán)的“海亮”高精度拖纜地震采集系統(tǒng)、“海燕”拖纜定位與控制系統(tǒng)(控制系統(tǒng))、“海途”綜合導(dǎo)航系統(tǒng)、“海源”氣槍震源控制系統(tǒng),通過多次試驗(yàn)和生產(chǎn)作業(yè),實(shí)現(xiàn)了海洋地震拖纜采集裝備產(chǎn)業(yè)化應(yīng)用,關(guān)鍵技術(shù)躋身國際先進(jìn)行列,為實(shí)現(xiàn)我國海上油氣增產(chǎn)、保障國家能源安全、建設(shè)科技強(qiáng)國做出積極努力。
控制系統(tǒng)是成套地震勘探裝備的重要組成部分,它由船載控制系統(tǒng)和水下控制器組成。它通過控制掛載在拖纜上的羅經(jīng)鳥的翼板垂直方向移動(dòng)實(shí)現(xiàn)拖纜拖纜沉放深度控制,通過控制水平鳥翼板水平方向移動(dòng)實(shí)現(xiàn)拖纜間距控制,通過控制聲學(xué)鳥和水平鳥發(fā)射聲學(xué)信號(hào)進(jìn)行聲學(xué)網(wǎng)絡(luò)測距,最后通過實(shí)時(shí)采集深度數(shù)據(jù)、航向數(shù)據(jù)、相對(duì)位置數(shù)據(jù)等,給綜合導(dǎo)航系統(tǒng)提供原始測量數(shù)據(jù)用于坐標(biāo)實(shí)時(shí)解算,最終給地震數(shù)據(jù)提供位置信息。隨著勘探船拖帶能力提升和拖纜地震勘探向深海發(fā)展需要,當(dāng)前我國勘探船拖帶的拖纜規(guī)模達(dá)到12(纜)*12 km,每種拖纜上掛載的控制器按照300米間隔布放,控制系統(tǒng)需要在特定的工作周期內(nèi)完成12(拖纜)*120(控制器)規(guī)模的實(shí)時(shí)控制和數(shù)據(jù)采集,對(duì)數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性和處理效率要求極高。
VxWorks是一款嵌入式強(qiáng)實(shí)時(shí)操作系統(tǒng)(RTOS,real-time operating system),以其高可靠、高性能、可剪裁和卓越的實(shí)時(shí)性被廣泛地應(yīng)用于通信、軍事、工業(yè)控制、航空航天、地震勘探等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。緊湊型外設(shè)部件互連標(biāo)準(zhǔn)(CPCI,compact peripheral component interconnect)總線具有高開放性、高可靠性、可熱插拔、帶寬高等特點(diǎn),使其可以廣泛應(yīng)用在通訊、網(wǎng)絡(luò)、實(shí)時(shí)系統(tǒng)控制(RTMC,real time machine control)、實(shí)時(shí)數(shù)據(jù)采集(RTDA,real-time data acquisition)等需要高速運(yùn)算、高速數(shù)據(jù)通信、高可靠度、高擴(kuò)展性的應(yīng)用領(lǐng)域。本文控制系統(tǒng)的設(shè)計(jì)既要考慮到實(shí)時(shí)性和處理效率問題,又要具備一定的擴(kuò)展性要求,因此采用緊湊CPCI工控機(jī)箱作為硬件平臺(tái)。CPCI工控機(jī)箱的系統(tǒng)槽位運(yùn)行系統(tǒng)主控板,采用單板計(jì)算機(jī)和VxWorks實(shí)時(shí)操作系統(tǒng)軟件平臺(tái),非系統(tǒng)槽位運(yùn)行定制開發(fā)的多通道拖纜控制器接口卡(多通道卡),系統(tǒng)主控板與多通道卡基于CPCI背板總線連接,系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 控制系統(tǒng)結(jié)構(gòu)框圖
多通道卡由CPCI總線接口芯片和多通道處理電路模塊組成,CPCI總線接口芯片采用BROADCOM公司的PCI9054芯片,多通道處理電路模塊與掛載在拖纜上的水下拖纜控制器通訊,每個(gè)多通道處理電路模塊拖帶6個(gè)通道。控制系統(tǒng)應(yīng)用程序運(yùn)行于系統(tǒng)主控板,多通道卡驅(qū)動(dòng)程序是系統(tǒng)主控板應(yīng)用程序和多通道卡之間通訊的“橋梁”,它通過對(duì)PCI9054接口芯片的控制實(shí)現(xiàn)應(yīng)用程序與多通道處理電路6個(gè)通道的數(shù)據(jù)通訊,從而實(shí)現(xiàn)控制系統(tǒng)應(yīng)用程序?qū)λ峦侠|控制器的控制。運(yùn)行于系統(tǒng)主控板的多通道卡驅(qū)動(dòng)程序和應(yīng)用程序均運(yùn)行于VxWorks實(shí)時(shí)操作系統(tǒng)環(huán)境中,多通道卡驅(qū)動(dòng)程序的設(shè)計(jì)支持多個(gè)多通道卡的并發(fā)控制,從而為應(yīng)用程序提供了靈活的擴(kuò)展能力。
VxWorks采用分層設(shè)計(jì)和結(jié)構(gòu)化設(shè)計(jì),由性能高效的微內(nèi)核Wind、VxWorks庫、網(wǎng)絡(luò)協(xié)議棧、I/O系統(tǒng)、文件系統(tǒng)、板級(jí)支持包(BSP,board support package)、各類驅(qū)動(dòng)程序等組成。BSP和PCI驅(qū)動(dòng)程序位于硬件與操作系統(tǒng)和應(yīng)用程序之間,它們?cè)谙到y(tǒng)中的位置如圖2所示。BSP是一個(gè)軟件抽象層,它的主要功能是系統(tǒng)加電以后初始化目標(biāo)機(jī)硬件、初始化操作系統(tǒng)及提供部分硬件的驅(qū)動(dòng)程序,PCI驅(qū)動(dòng)程序是操作系統(tǒng)和應(yīng)用程序與具體硬件之間的“橋梁”,對(duì)上為VxWorks提供標(biāo)準(zhǔn)操作接口和應(yīng)用程序提供專用接口,對(duì)下直接控制硬件設(shè)備。對(duì)于BSP和PCI驅(qū)動(dòng)程序共同構(gòu)成了應(yīng)用程序和具體物理設(shè)備的中間層,這種設(shè)計(jì)思想可以實(shí)現(xiàn)應(yīng)用層軟件與具體物理設(shè)備的隔離,提高應(yīng)用程序的可移植性。本文中系統(tǒng)主控板采用成熟的商用單板計(jì)算機(jī),提供了基本的BSP開發(fā)包,因此只需要對(duì)其進(jìn)行功能擴(kuò)展,即可滿足定制的設(shè)備。
圖2 板級(jí)支持包和驅(qū)動(dòng)程序
外設(shè)部件互連標(biāo)準(zhǔn)(PCI,peripheral component interconnect)是由外圍部件互連專業(yè)組(PCI-SIG,peripheral component interconnect special interest group)推出的一種局部并行總線標(biāo)準(zhǔn),PCI總線能夠根據(jù)設(shè)備上的配置信息自動(dòng)為設(shè)備分配物理地址空間、輸入輸出(I/O,input/output)端口號(hào)、中斷號(hào),并且支持多種外部設(shè)備。本文CPCI工控機(jī)箱采用的背板通信協(xié)議是一種基于標(biāo)準(zhǔn)PCI總線的緊湊堅(jiān)固的高性能總線技術(shù),它定義了更加堅(jiān)固耐用的PCI版本,在電氣、邏輯和軟件方面,它與PCI標(biāo)準(zhǔn)完全兼容,因此CPCI多通道卡驅(qū)動(dòng)程序的設(shè)計(jì)完全兼容PCI標(biāo)準(zhǔn)協(xié)議。
根據(jù)控制系統(tǒng)功能需求,結(jié)合VxWorks驅(qū)動(dòng)程序結(jié)構(gòu)和PCI總線特點(diǎn),將多通道卡驅(qū)動(dòng)程序開發(fā)分為內(nèi)存映射模塊、中斷注冊(cè)初始化模塊和中斷處理模塊的設(shè)計(jì)和實(shí)現(xiàn)。
根據(jù)PCI規(guī)范,每一個(gè)PCI總線設(shè)備有3種相互獨(dú)立的物理地址空間:配置寄存器空間、存儲(chǔ)器空間和I/O空間。其中配置寄存器空間是其容量為256個(gè)字節(jié),其中前64個(gè)字節(jié)為配置頭標(biāo)區(qū),該區(qū)域是固定結(jié)構(gòu),后192個(gè)字節(jié)為本地配置空間(設(shè)備關(guān)聯(lián)區(qū)),主要定義卡上局部總線的特性、本地空間基地址及范圍等,寄存器布局因設(shè)備而異。
配置寄存器空間是PCI設(shè)備所特有的一個(gè)物理空間,支持設(shè)備即插即用,因此PCI設(shè)備不占用固定的內(nèi)存地址空間或I/O地址空間,而是由操作系統(tǒng)決定其映射的基址。配置寄存器空間里最重要的包括廠商標(biāo)識(shí)(Vendor ID)、設(shè)備標(biāo)識(shí)(Device ID)、基地址寄存器(BAR,base address register)、中斷號(hào)(IRQ Line)、中斷引腳(IRQ Pin)等。配置寄存器空間里基地址寄存器PCIBAR[0-5]反映了該P(yáng)CI設(shè)備的地址空間映射到系統(tǒng)內(nèi)存空間或I/O空間的起始物理地址?;刂芳拇嫫鞯淖畹臀籦it0是只讀的,其值為1表示該寄存器關(guān)聯(lián)的地址空間是要映射到I/O空間,否則映射到系統(tǒng)存內(nèi)存空間的。本文PCIBAR0用于配置本地寄存器、運(yùn)行時(shí)寄存器和DMA寄存器到系統(tǒng)內(nèi)存空間映射,PCIBAR2用于本地地址空間到系統(tǒng)內(nèi)存空間映射?;赑CIBAR0的運(yùn)行時(shí)狀態(tài)控制寄存器INTCSR用于多通道卡中斷狀態(tài)獲取和控制,基于PCIBAR2的寄存器用于多通道數(shù)據(jù)接口和本地中斷源管理。中斷號(hào)的分配由系統(tǒng)在硬件上電階段自動(dòng)分配,驅(qū)動(dòng)程序只需要獲取到中斷號(hào),通過掛接中斷服務(wù)程序即可處理多通道卡觸發(fā)的數(shù)據(jù)請(qǐng)求。主要寄存器設(shè)計(jì)如表1所示。
表1 主要寄存器定義
基于基地址寄存器PCIBAR2,分別定義6個(gè)通道讀寄存器和6個(gè)通道寫寄存器用于數(shù)據(jù)讀取和發(fā)送,定義1個(gè)中斷源寄存器和1個(gè)中斷屏蔽寄存器,分別用于6個(gè)通道的中斷標(biāo)志和屏蔽控制。對(duì)于PCI總線設(shè)備的配置和控制,VxWorks提供了pciFindDevice()、pciConfigOutLong()、pciIntConnect()等專用應(yīng)用程序編程接口(API,application programming interface)用于驅(qū)動(dòng)程序開發(fā),下面在具體的實(shí)現(xiàn)過程中介紹其使用方法。
VxWorks在BSP的支持下,自動(dòng)為PCI設(shè)備分配4k*16字節(jié)大小內(nèi)存映射空間。VxWorks的內(nèi)存管理單元(MMU,memory management unit)僅具備基本的內(nèi)存管理功能,只有將PCI設(shè)備的存儲(chǔ)空間加入到MMU中,應(yīng)用程序才能像操作內(nèi)存空間一樣操作設(shè)備存儲(chǔ)空間。VxWorks中頁大小在的BSP的VM_PAGE_SIZE定義,默認(rèn)為4k字節(jié),如果需要改變這個(gè)值,需要重新重定義config.h中的VM_PAGE_SIZE的值。vmLib.h中的數(shù)據(jù)結(jié)構(gòu)PHYS_MEM_DESC用于定義映射物理內(nèi)存的參數(shù),內(nèi)存映射用sysPhysMemDesc(被聲明為一個(gè)PHYS_MEM_DESC的數(shù)組)在sysLib.c中定義。在 sysPhysMemDesc中定義的內(nèi)存區(qū),必須是頁對(duì)齊的,并且必須跨越完整的頁,因此PHYS_MEM_DESC 的最初3個(gè)域都必須是VM_PAGE_SIZE 的倍數(shù)。如果在初始化過程中提供的sysPhysMemDesc的元素不是頁對(duì)齊的,則在VxWorks初始化期間將導(dǎo)致系統(tǒng)崩潰。有手動(dòng)配置和自動(dòng)配置兩種方式實(shí)現(xiàn)MMU對(duì)PCI存儲(chǔ)空間的映射,前者在BSP的sysLib.c文件中將設(shè)備存儲(chǔ)空間手動(dòng)添加到內(nèi)存管理表sysPhysMemDesc中,后者通過sysMmuMapAdd()函數(shù)動(dòng)態(tài)將設(shè)備的存儲(chǔ)空間地址加入到MMU中。本文基于后者實(shí)現(xiàn)方式,通過擴(kuò)展板級(jí)支持包實(shí)現(xiàn)內(nèi)存映射,以獲得更好的靈活性和擴(kuò)展性,實(shí)現(xiàn)過程如圖3所示。
圖3 內(nèi)存映射模塊流程圖
1)系統(tǒng)硬件初始化入口:在BSP的支持下,VxWorks操作系統(tǒng)初始化過程中,通過調(diào)用sysPciAutoConfig()完成系統(tǒng)硬件設(shè)備的初始化,主要通過中斷號(hào)分配、內(nèi)存映射空間分配、I/O地址等完成硬件所需資源分配;
2)查找多通道卡:根據(jù)設(shè)備vendorID(0x10B5)和deviceID(0x9054)采用pciFindDevice()找到對(duì)應(yīng)的設(shè)備,獲取到的總線號(hào)busNo、設(shè)備號(hào)deviceNo、功能號(hào)FuncNo,總線號(hào)busNo、設(shè)備號(hào)deviceNo、功能號(hào)FuncNo組合在一起可以作為該設(shè)備的唯一標(biāo)識(shí);
3)獲取基地址:采用pciConfigInLong()函數(shù)獲取設(shè)備的寄存器基地址PCIBAR2,獲得的寄存器基地址與存儲(chǔ)器屏蔽位PCI_MEMBASE_MASK邏輯與,得到內(nèi)存映射基地址;
4)獲取映射空間大?。焊鶕?jù)PCI規(guī)范,采用pciConfigoutLong()、pciConfigInLong()行數(shù)將基地址寄存器全部寫入1再讀回,得到映射空間大小,然后對(duì)映射空間進(jìn)行MMU頁面對(duì)齊,確定空間長度;
5)基地址寄存器復(fù)位:將mapBaseCsr回寫到基地址寄存器復(fù)位,用于后續(xù)其他應(yīng)用需要。
在BSP的sysLib.c中的sysHwInit()函數(shù)中擴(kuò)展內(nèi)存映射功能,關(guān)鍵代碼為:
/* 獲取多通道卡設(shè)備的總線號(hào)、設(shè)備號(hào)、功能號(hào) */
if(OK==pciFindDevice(VENDERID,DEVICEID,num,&busNo,&deviceNo,&funcNo)){
/* 獲取PCIBAR2內(nèi)容 */
pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,&PCIBAR2));
/* 將PCIBAR2全部寫入1 */
pciConfigOutLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,0xffffffff));
/* 再讀回PCIBAR2內(nèi)容,得到分配內(nèi)存空間大小 */
pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,&mapSize))
/* 將分配內(nèi)存空間大小進(jìn)行4k頁面對(duì)齊 */
mapSize=(~(mapSize&PCI_MEMBASE_MASK))+1;
mapSize=ROUND_UP(mapSize,VM_PAGE_SIZE);
pciConfigOutLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,PCIBAR2));
PCIBAR2&=PCI_MEMBASE_MASK;
/* 動(dòng)態(tài)將映射關(guān)系加入到MMU */
sysMmuMapAdd((void*)(PCIBAR2),mapSize,VM_STATE_MASK_FOR_ALL,VM_STATE_FOR_PCI);
}
VxWorks啟動(dòng)過程中,通過板級(jí)支持包完成多通道卡存儲(chǔ)空間的MMU管理后,應(yīng)用程序就可以像操作內(nèi)存空間一樣操作多通道卡的存儲(chǔ)空間。本文為了提高模塊的獨(dú)立性和移植性,將內(nèi)存映射模塊和中斷注冊(cè)初始化模塊進(jìn)行分離,在中斷注冊(cè)初始化過程中,需要再次獲取內(nèi)存映射基地址,之后中斷服務(wù)處理模塊和應(yīng)用層軟件可以通過操作內(nèi)存空間的方式對(duì)多通道卡的存儲(chǔ)空間進(jìn)行存取。
VxWorks采用中斷服務(wù)表對(duì)中斷進(jìn)行管理,中斷服務(wù)表維護(hù)了中斷向量和中斷服務(wù)程序(ISR,interrupt service routines)的入口地址對(duì)應(yīng)關(guān)系。多通道卡有數(shù)據(jù)到來時(shí)采用中斷的方式通知VxWorks系統(tǒng),以保證數(shù)據(jù)能得到及時(shí)處理,達(dá)到實(shí)時(shí)性要求。為了處理多通道卡產(chǎn)生的中斷,必須獲取其在系統(tǒng)中的中斷號(hào),這個(gè)中斷號(hào)是VxWorks系統(tǒng)啟動(dòng)時(shí)通過PCI庫進(jìn)行自動(dòng)分配。根據(jù)PCI9054配置空間定義,我們首先得到的是一個(gè)8位的中斷號(hào),這種中斷號(hào)需要通過INT_NUM_GET轉(zhuǎn)換才能得到該設(shè)備在VxWorks系統(tǒng)中的中斷號(hào)。
獲取到中斷號(hào)之后,通過INUM_TO_IVEC轉(zhuǎn)換成中斷向量,最后將中斷向量和ISR的地址在操作系統(tǒng)的中斷管理模塊中注冊(cè)。VxWorks提供intConnect()和pciIntConnect()兩種注冊(cè)ISR的方式,intConnect()使用的中斷向量是獨(dú)占的,而pciIntConnect()是共享的,即同類型的多個(gè)外部設(shè)備可以共享同一個(gè)中斷向量,它在內(nèi)部使用一個(gè)鏈表管理多個(gè)ISR,發(fā)生中斷時(shí),鏈接在一個(gè)鏈表上的各個(gè)ISR被依次調(diào)用,pciIntConnect()要求每個(gè)ISR被調(diào)用時(shí),應(yīng)該首先查詢是否為自己的設(shè)備產(chǎn)生的中斷,不是則應(yīng)立即返回,以繼續(xù)調(diào)用其它ISR??刂葡到y(tǒng)在設(shè)計(jì)上支持多個(gè)多通道卡,因此采用共享中斷向量的方式對(duì)多通道卡ISR進(jìn)行注冊(cè),可獲得更高的擴(kuò)展性和復(fù)用性。完成ISR在VxWorks的中斷系統(tǒng)中注冊(cè)后,使能PCI中斷和本地中斷,此后系統(tǒng)就可以處理多通道卡的數(shù)據(jù)請(qǐng)求。
多通道卡初始化的關(guān)鍵代碼為:
/* 獲取多通道卡設(shè)備的總線號(hào)、設(shè)備號(hào)、功能號(hào) */
if(OK==pciFindDevice(VENDERID,DEVICEID,num,&busNo,&deviceNo,&funcNo)){
/* 獲取PCIBAR2[num] 內(nèi)容,用于應(yīng)用程序訪問 */
pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,&PCIBAR2[num] ));
/* 獲取中斷號(hào) */
pciConfigInByte(busNo,deviceNo,funcNo,PCI_CFG_DEV_INT_LINE,&irqNo))
PCI_DEV[num].irqNo = irqNo;
/* x86架構(gòu)采用8259A中斷控制器,物理中斷號(hào)轉(zhuǎn)換為系統(tǒng)中斷號(hào) */
intNum = INT_NUM_GET(irqNo);
sysIntDisablePIC(irqNo);
/* 注冊(cè)中斷服務(wù)程序 */
pciIntConnect(INUM_TO_IVEC(intNum),(VOIDFUNCPTR)pciFastISR,num);
sysIntEnablePIC(irqNo);
/* 獲取中斷控制狀態(tài)寄存器 */
PCI9054_Read_PCIBAR0(num,INTCSR,&intCSR); intCSR|= INTCSR_Bit8|INTCSR_Bit11;
/* 使能PCI中斷和本地中斷 */
PCI9054_Write_PCIBAR0(num,INTCSR,intCSR)。
標(biāo)準(zhǔn)的PCI設(shè)備驅(qū)動(dòng)程序是VxWorks體系結(jié)構(gòu)中的I/O系統(tǒng)重要組成部分,它通過BSP訪問PCI設(shè)備,往上為應(yīng)用程序提供系統(tǒng)調(diào)用入口,從而實(shí)現(xiàn)應(yīng)用層程序與PCI設(shè)備的交互。本文采用自定義實(shí)現(xiàn)方式,通過跨過I/O系統(tǒng),采用中斷服務(wù)程序和應(yīng)用層任務(wù)的直接通訊,獲得更高的運(yùn)行效率和實(shí)時(shí)性。
VxWorks系統(tǒng)的強(qiáng)實(shí)時(shí)性得益于其獨(dú)特的中斷處理模型,快速的硬件中斷處理是其核心的組成部分。為了盡可能快速響應(yīng)外部中斷,VxWorks的中斷服務(wù)程序運(yùn)行在一個(gè)不同于任何任務(wù)的獨(dú)立的上下文中,中斷處理過程不涉及到任務(wù)的上下文切換。操作系統(tǒng)捕獲到中斷后,對(duì)注冊(cè)到同一個(gè)中斷向量的中斷服務(wù)程序進(jìn)行遍歷,通過回調(diào)函數(shù)完成對(duì)相應(yīng)中斷服務(wù)程序的調(diào)用。在執(zhí)行中斷過程中可能會(huì)有新的設(shè)備中斷到來,為了保證新的更緊急的中斷能得到及時(shí)處理,這就要求我們?cè)O(shè)計(jì)的中斷服務(wù)程序盡可能的簡短而高效。本文設(shè)計(jì)如圖4所示處理模型,采用中斷快速處理和中斷處理任務(wù)組合的方式完成一次多通道卡數(shù)據(jù)傳輸請(qǐng)求,中斷快速處理進(jìn)行數(shù)據(jù)傳輸請(qǐng)求的中斷快速響應(yīng),中斷處理任務(wù)進(jìn)行實(shí)際數(shù)據(jù)傳輸任務(wù)。
圖4 中斷處理模塊結(jié)構(gòu)框圖
多通道卡有數(shù)據(jù)傳輸請(qǐng)求時(shí),產(chǎn)生系統(tǒng)中斷,中斷快速處理由操作系統(tǒng)中斷服務(wù)程序自動(dòng)調(diào)用。中斷快速處理運(yùn)行在操作系統(tǒng)中斷服務(wù)的上下文中,是實(shí)現(xiàn)整個(gè)中斷服務(wù)過程的“前半部分”,僅完成必須的工作,包括清除通道中斷標(biāo)記,給中斷處理任務(wù)發(fā)出信號(hào)量通知,使能通道中斷等,運(yùn)行極其高效?!扒鞍氩糠帧敝袛嗫焖偬幚黻P(guān)鍵代碼如下:
void pciFastISR(intnum){
UINT32 intCSR;
/* 獲取中斷控制狀態(tài)寄存器 */
PCI9054_Read_PCIBAR0(num,INTCSR,&intCSR); if(INTCSR_Bit15 & intCSR){
/* 禁用PCI中斷和本地中斷設(shè)備中斷 */
PCI9054_Write_PCIBAR0(num,INTCSR,intCSR&(~(INTCSR_Bit8|INTCSR_Bit11));
/* 釋放信號(hào)量,通知上層任務(wù) */
semGive(PCI_DEV[num].semBID);
} }
中斷處理任務(wù)實(shí)現(xiàn)中斷服務(wù)的“后半部分”功能,以高優(yōu)先級(jí)任務(wù)的形式由VxWorks進(jìn)行任務(wù)調(diào)度,處理相對(duì)比較耗時(shí)操作,結(jié)束后使能下一輪數(shù)據(jù)傳輸。中斷處理任務(wù)啟動(dòng)后,循環(huán)等待中斷快速處理的信號(hào)量通知,讀取中斷源寄存器INTMAP,依次遍歷6個(gè)標(biāo)志位判斷中斷源,獲取中斷源后,通過讀取對(duì)應(yīng)的通道接口獲取數(shù)據(jù)長度和內(nèi)容,然后將數(shù)據(jù)放入消息隊(duì)列通知應(yīng)用層軟件,最后使能PCI中斷和本地中斷,通知多通道卡可進(jìn)行下一輪數(shù)據(jù)傳輸?!昂蟀氩糠帧敝袛嗵幚砣蝿?wù)的關(guān)鍵代碼如下:
void pciDealTask(int num){
while(1){
/* 等待中斷快速處理的信號(hào)量通知 */
semTake(PCI_DEV[num].semBID,WAIT_FOREVER));
UINT32 intMap;
/* 獲取中斷源 */
PCI9054_Read_PCIBAR2(num,INTMAP,&intMap); /* 依次遍歷中斷源標(biāo)志位 */
for(int chl= 0; chl< 6; ++chl){
if(intMap & (0x01 << channel)){
/*通過 PCI9054_Read_PCIBAR2(num,CHN1R_R + chl*4,&data);執(zhí)行獲取數(shù)據(jù)過程,放入消息隊(duì)列給上層應(yīng)用軟件使用,不再詳述 */
} }
/* 使能PCI中斷和本地中斷,使能下一輪數(shù)據(jù)傳輸 */
PCI9054_Write_PCIBAR0(num,INTCSR,(PCI_INT_BIT|LOCAL_INT_BIT));
} }
驗(yàn)證文中多通道卡驅(qū)動(dòng)程序,采用模擬測試和實(shí)際應(yīng)用測試相結(jié)合的方式。模擬測試通過在主控板軟件編寫模擬程序和多通道卡內(nèi)部編寫回環(huán)程序,驗(yàn)證2個(gè)多通道卡共計(jì)12個(gè)通道的數(shù)據(jù)并發(fā)讀寫功能正確性和數(shù)據(jù)處理實(shí)時(shí)性;實(shí)際應(yīng)用測試通過將驅(qū)動(dòng)程序與主控板應(yīng)用層軟件進(jìn)行功能集成,應(yīng)用到控制系統(tǒng)的生產(chǎn)應(yīng)用中,驗(yàn)證驅(qū)動(dòng)程序的可用性。
模擬程序首先完成測試任務(wù)初始化,通過pciFindDevice()查找多通道卡,找到后針對(duì)每個(gè)通道創(chuàng)建測試任務(wù),創(chuàng)建測試任務(wù)代碼如下:
taskId_simu[slotNo][channelNo]= taskSpawn(strcat(“simu_”,slotNo<<8|channelNo),200,VX_FP_TASK,0x4000,(FUNCPTR)tSimuTask,slotNo,channelNo,0,0,0,0,0,0,0,0)。
由于每個(gè)通道對(duì)應(yīng)一個(gè)測試任務(wù),測試任務(wù)采用隨機(jī)休眠10~20 ms(控制系統(tǒng)與水下羅經(jīng)鳥、水平鳥、聲學(xué)鳥的通訊間隔為約80 ms)的形式模擬多個(gè)通道的并發(fā)訪問。測試任務(wù)通過隨機(jī)產(chǎn)生數(shù)據(jù),下發(fā)至多通道卡所對(duì)應(yīng)通道,接著阻塞在中斷處理服務(wù)的消息隊(duì)列中,直到有數(shù)據(jù)返回,將獲得數(shù)據(jù)后與下發(fā)的數(shù)據(jù)進(jìn)行比較,實(shí)現(xiàn)流程如圖5所示。
圖5 測試程序流程圖
通過對(duì)12個(gè)通道連續(xù)并發(fā)測試10萬次,數(shù)據(jù)傳輸穩(wěn)定、正確,驗(yàn)證了驅(qū)動(dòng)程序的正確性和數(shù)據(jù)處理實(shí)時(shí)性滿足設(shè)計(jì)預(yù)期。
通過將多通道卡驅(qū)動(dòng)程序與應(yīng)用層軟件進(jìn)行功能集成,形成了“海燕”拖纜定位與控制系統(tǒng)。作為中國海油自主海上高精度地震勘探裝備的重要組成部分,控制系統(tǒng)在裝配2個(gè)多通道卡情況下,形成了12通道并發(fā)處理能力,完成多次實(shí)際作業(yè)應(yīng)用,驗(yàn)證其在拖纜深度控制、間距控制、聲學(xué)測距控制等方面均能滿足12條拖纜大規(guī)模海上拖纜地震勘探作業(yè)對(duì)數(shù)據(jù)傳輸實(shí)時(shí)性和處理效率的要求。集成多通道卡驅(qū)動(dòng)程序的控制系統(tǒng)在實(shí)際生產(chǎn)作業(yè)中的成功應(yīng)用表明,本文設(shè)計(jì)和實(shí)現(xiàn)的多通道卡驅(qū)動(dòng)程序結(jié)構(gòu)合理、功能正確、性能高效,滿足實(shí)際野外生產(chǎn)需求,達(dá)到了設(shè)計(jì)的預(yù)期。
本文從分析VxWorks實(shí)時(shí)操作系統(tǒng)驅(qū)動(dòng)程序結(jié)構(gòu)和CPCI總線設(shè)備特點(diǎn)入手,依次從VxWorks下內(nèi)存映射模型、中斷注冊(cè)初始化過程和中斷處理過程等方面闡述了VxWorks下CPCI設(shè)備驅(qū)動(dòng)程序開發(fā)的通用方法,并結(jié)合“海燕”拖纜定位與控制系統(tǒng)CPCI多通道卡實(shí)例給出了具體過程和關(guān)鍵程序代碼。本文實(shí)現(xiàn)的CPCI多通道卡驅(qū)動(dòng)程序集成到控制系統(tǒng)中并成功應(yīng)用于生產(chǎn)作業(yè)中,作業(yè)效果表明該驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)能滿足海上拖纜地震勘探對(duì)控制系統(tǒng)的實(shí)時(shí)性和處理效率要求,達(dá)到了設(shè)計(jì)預(yù)期。該驅(qū)動(dòng)程序的設(shè)計(jì)在不失實(shí)時(shí)性的前提下,采用了模塊塊化設(shè)計(jì)、通用性設(shè)計(jì),使之能夠靈活的應(yīng)用到其他具有類似多通道、多任務(wù)、實(shí)時(shí)性要求高的嵌入式系統(tǒng)中。