基于VxWorks的VME從板驅(qū)動設(shè)計與實現(xiàn)
摘要:基于VxWorks操作系統(tǒng)設(shè)計了數(shù)據(jù)采集從板的驅(qū)動程序,程序框架上驅(qū)動程序?qū)陌宓牟僮鞒橄鬄閷ψ址驮O(shè)備的操作,驅(qū)動程序在內(nèi)部實現(xiàn)了數(shù)據(jù)IO操作的阻塞機(jī)制、查詢機(jī)制及信號通知機(jī)制,采用這種方式設(shè)計的驅(qū)動程序向用戶提供了統(tǒng)一的接口,方便用戶使用,同時將硬件操作與應(yīng)用程序分開便于驅(qū)動程序進(jìn)行擴(kuò)展;驅(qū)動設(shè)計工作是精密環(huán)境控制系統(tǒng)的一部分,驅(qū)動程序的設(shè)計方法可以廣泛地應(yīng)用于基于VME總線的從設(shè)備驅(qū)動設(shè)計。
關(guān)鍵詞:VxWorks操作系統(tǒng);VME總線;設(shè)備驅(qū)動程序;數(shù)據(jù)采集
基于VME總線搭建了精密環(huán)境控制系統(tǒng),整個系統(tǒng)中基于VxWorks的VME總線驅(qū)動程序連接了軟件操作與VME從板的硬件通信,VxWorks操作系統(tǒng)下驅(qū)動程序的開發(fā)是應(yīng)用VxWorks操作系統(tǒng)的關(guān)鍵因素。本文應(yīng)用通用公司的VG5-7457PowerPC嵌入式VME單板機(jī)作為主板及通用公司的VME-3122A作為數(shù)據(jù)采集從板組成數(shù)據(jù)采集系統(tǒng)。針對數(shù)據(jù)采集從板的通用特征詳細(xì)的設(shè)計了基于VG5硬件和VxWorks操作系統(tǒng)的VME數(shù)據(jù)采集從板的驅(qū)動程序,在驅(qū)動程序的設(shè)計過程中,特別地考慮了驅(qū)動程序數(shù)據(jù)傳輸機(jī)制的設(shè)計,采用良好傳輸機(jī)制設(shè)計的驅(qū)動程序具有優(yōu)良的驅(qū)動架構(gòu),便于移植及擴(kuò)展。
1 采集系統(tǒng)的系統(tǒng)結(jié)構(gòu)
1.1 采集系統(tǒng)結(jié)構(gòu)分析
采集系統(tǒng)基于VME總線實現(xiàn),系統(tǒng)是精密環(huán)境控制的重要組成部分,它的整體結(jié)構(gòu)如圖1所示。
系統(tǒng)以VME總線為整體架構(gòu),VME總線上使用VG5-7457PowerPC嵌入式VME單板機(jī)作VME總線控制器,通過VME總線控制數(shù)據(jù)采集設(shè)備(AD數(shù)據(jù)采集卡),同時將控制輸出經(jīng)過VME總線下傳到控制輸出(DA數(shù)據(jù)輸出卡),它同時通過以太網(wǎng)絡(luò)與上位機(jī)相連;數(shù)據(jù)在VME總線的可靠傳輸是系統(tǒng)實現(xiàn)功能的關(guān)鍵部分,這主要通過在VG5單板機(jī)上設(shè)計基于VxWorks操作系統(tǒng)的VME總線的驅(qū)動來保證。
1.2 VG5主控板的結(jié)構(gòu)分析及其對VME總線驅(qū)動的支持
驅(qū)動程序最終運行在VG5-7457單板機(jī)上,單板機(jī)的VME總線支持是實現(xiàn)單板機(jī)對VME總線驅(qū)動的關(guān)鍵因素。單板機(jī)系統(tǒng)的VME總線硬件結(jié)構(gòu)如圖2所示。
單板機(jī)使用UniverseⅡVME-to-PCI總線橋芯片實現(xiàn)系統(tǒng)的VMM總線,芯片實際上完成了VME總線與PCI總線的操作的互相轉(zhuǎn)化,它同時具備多種轉(zhuǎn)換方式,首先可以完成2個總線中斷的互相轉(zhuǎn)換操作,其次可以完成通過VME總線訪問PCI總線,最后可以完成PIC總線訪問VME總線;這些轉(zhuǎn)換操作很多都是通過芯片的內(nèi)部寄存器實現(xiàn)的。由于總線橋芯片的轉(zhuǎn)換能力,使得VG5-7457單板機(jī)既可以作為VME主控板使用,又可以作為從板使用。
VxWorks操作系統(tǒng)下將VME總線地址映射為CPU的本地地址,其映射可以在相關(guān)的BSP文件中定義,設(shè)計中的映射如表1所示,將VME總線映射為CPU本地地址后,對從板的操作就轉(zhuǎn)化為于對內(nèi)存訪問操作相似的讀寫操作,使得VME總線的驅(qū)動可以方便的實現(xiàn)。
對于操作VME總線區(qū)域的內(nèi)存空間,系統(tǒng)提供了一系列的接口函數(shù),系統(tǒng)提供的接口函數(shù)列表如表2所示。
寫內(nèi)存空間的函數(shù)使用svsOut*函數(shù)族來完成,需要提供給函數(shù)的參數(shù)是寫入的地址及寫入的數(shù)據(jù);讀內(nèi)存空間使用sysIn*函數(shù)族來完成,需要提供的參數(shù)是讀的地址,返回值是讀到的內(nèi)容。函數(shù)在VxWorks的BSP中定義,使用匯編語言的方法實現(xiàn)相關(guān)的操作。
2 數(shù)據(jù)采集板的硬件結(jié)構(gòu)抽象
從主板的VME地址空間上看從板的結(jié)構(gòu)圖如圖3所示。
VME地址空間上從板主要分為4塊地址區(qū)域,它們分別為從板的標(biāo)識寄存器、從板的隨機(jī)讀寫寄存器、功能設(shè)置寄存器及數(shù)據(jù)緩沖區(qū),前兩個存儲區(qū)域主要用來標(biāo)識從板及對從板進(jìn)行測試,功能設(shè)置寄存器主要用來完成對數(shù)據(jù)采集從板的功能配置,數(shù)據(jù)緩沖區(qū)主要用來完成數(shù)據(jù)的傳輸;其中功能設(shè)置寄存器及數(shù)據(jù)緩沖區(qū)是實現(xiàn)對從板數(shù)據(jù)采集及控制的關(guān)鍵。依據(jù)從板的結(jié)構(gòu)特點設(shè)計字符型設(shè)備驅(qū)動框架,驅(qū)動程序設(shè)計的重點是驅(qū)動模型的建立。
3 驅(qū)動程序的設(shè)計
3.1 數(shù)據(jù)結(jié)構(gòu)設(shè)計
將從板所占用的系統(tǒng)硬件及軟件資源抽象成為從板字符型設(shè)備的結(jié)構(gòu)體,其定義如下所示。
這樣的數(shù)據(jù)結(jié)構(gòu)設(shè)計實現(xiàn)了對從板的抽象,使得驅(qū)動程序具有良好的可移植性,方便的實現(xiàn)對多種板卡的驅(qū)動。
3.2 數(shù)據(jù)傳輸機(jī)制設(shè)計
驅(qū)動程序設(shè)計模仿了Linux操作系統(tǒng)實現(xiàn)了數(shù)據(jù)傳輸?shù)臋C(jī)制——查詢機(jī)制,數(shù)據(jù)傳輸?shù)淖枞麢C(jī)制及信號通知機(jī)制。
查詢機(jī)制主要是指驅(qū)動程序為應(yīng)用程序提供查詢緩沖區(qū)標(biāo)志的接口,應(yīng)用程序可以隨時查詢緩沖區(qū)的狀態(tài)而不會引起任務(wù)狀態(tài)的變化;阻塞機(jī)制是調(diào)用獲取緩沖區(qū)的任務(wù)在緩沖區(qū)沒有數(shù)據(jù)時會使該任務(wù)處于阻塞狀態(tài),直到緩沖區(qū)數(shù)據(jù)可用獲得后,任務(wù)才會重新獲得運行;信號機(jī)制是應(yīng)用程序預(yù)先設(shè)定一個信號處理函數(shù),當(dāng)緩沖區(qū)有數(shù)據(jù)時,系統(tǒng)就會自動調(diào)用這個信號處理函數(shù)而完成用戶預(yù)定的操作;阻塞機(jī)制的任務(wù)圖示如圖4所示,這些機(jī)制的細(xì)節(jié)可用參考文獻(xiàn)。要實現(xiàn)這些功能需要實現(xiàn)中斷處理機(jī)制、字符設(shè)備操作的ioctrl方法和read方法。
4 驅(qū)動程序的實現(xiàn)
4.1 中斷程序的實現(xiàn)
中斷程序的實現(xiàn)上使用了上、下兩半部機(jī)制,上半部是中斷處理函數(shù),下半部是中斷處理任務(wù),上、下兩半部使用信號量進(jìn)行同步,其中功能性的操作主要安排在中斷處理任務(wù)中。其程序框架如圖5所示。在中斷任務(wù)中實現(xiàn)對數(shù)據(jù)緩沖區(qū)的操作及緩沖區(qū)標(biāo)志操作,實現(xiàn)操作的過程中著重解決與ioctrl方法和read方法進(jìn)行同步。
4.2 驅(qū)動程序ioctrl方法的實現(xiàn)
驅(qū)動程序的ioctrl方法在驅(qū)動程序中具有重要地位,它除了要實現(xiàn)從板功能寄存器的設(shè)置及驅(qū)動程序的查詢機(jī)制外,還要實現(xiàn)用戶信號處理函數(shù)的注冊工作,結(jié)合這些功能實現(xiàn)的ioctrl方法的框架代碼如下所示。
整個的ioctl方法由switch結(jié)構(gòu)組成,這樣的結(jié)構(gòu)代碼簡單明了,易讀性和可維護(hù)性都很好,同時可以方便地通過擴(kuò)充命令的方法來實現(xiàn)對從板功能寄存器多種多樣的操作,便于驅(qū)動程序的重用。
4.3 驅(qū)動程序read方法的買現(xiàn)
驅(qū)動程序的read方法主要實現(xiàn)對緩沖區(qū)數(shù)據(jù)的讀取,同時它是實現(xiàn)數(shù)據(jù)阻塞操作的關(guān)鍵,read方法的程序流程圖如圖6所示。
函數(shù)首先進(jìn)行參數(shù)的檢查及轉(zhuǎn)化;然后檢查緩沖區(qū)標(biāo)志,如果緩沖區(qū)存在數(shù)據(jù)則直接讀出數(shù)據(jù),如果緩沖區(qū)沒有數(shù)據(jù),函數(shù)就會申請緩沖區(qū)的信號量而使任務(wù)處于掛起狀態(tài),當(dāng)中斷處理任務(wù)處理完緩沖區(qū)后會發(fā)送一個信號量而使任務(wù)重新運行并且讀出緩沖區(qū)數(shù)據(jù);函數(shù)最后是設(shè)置緩沖區(qū)標(biāo)志,表示緩沖區(qū)數(shù)據(jù)已經(jīng)讀出。函數(shù)要與中斷處理任務(wù)進(jìn)行同步;讀取和設(shè)置緩沖區(qū)標(biāo)志使用原子操作的方法,等待中斷處理任務(wù)設(shè)置緩沖區(qū)時使用了信號量的方式完成了同步。
5 VME總線數(shù)據(jù)傳輸測試
VME數(shù)據(jù)傳輸測試主要是測試總線數(shù)據(jù)傳輸?shù)目煽啃?,只有總線數(shù)據(jù)傳輸?shù)目煽啃阅軌虮WC,驅(qū)動才能穩(wěn)定的運行,其測試的方法是通過隨機(jī)地讀寫從板的隨機(jī)讀寫寄存器來完成的,整個測試中為了模擬操作系統(tǒng)在有負(fù)載情況下的運行效果,增加了一些定時器操作,
其測試的程序流程圖如圖7所示。
使用這種測試的方法最終得到測試的結(jié)果如表3所示。從測試結(jié)果可以看出,數(shù)據(jù)傳輸?shù)臏?zhǔn)確性比較好,通過閱讀VG5-7457PowerPC的板級支持包可以發(fā)現(xiàn)其實現(xiàn)VME數(shù)據(jù)總線操作的函數(shù)都有原子操作過程,以此保證數(shù)據(jù)傳輸?shù)目煽啃?。良好的VME總線傳輸特性為驅(qū)動的實現(xiàn)提供了良好的基礎(chǔ)。
6 結(jié)論
設(shè)計了基于VxWorks操作系統(tǒng)的VME總線從板的驅(qū)動程序框架,著重介紹了驅(qū)動程序的機(jī)制及這些機(jī)制的實現(xiàn)方法;在設(shè)計的整體上重點地考慮了驅(qū)動程序的可維護(hù)性及可移轉(zhuǎn)性。采用這種方式建立起來的驅(qū)動程序代碼的可讀性好,可維護(hù)性強(qiáng),而且可以方便地移植到其他的應(yīng)用場合。