摘 要: 討論了嵌入式實時操作系統(tǒng)VxWorks的I/O" title="I/O">I/O系統(tǒng)及驅(qū)動程序?qū)崿F(xiàn)的原理,,并根據(jù)PMC-FPGA轉(zhuǎn)接卡的開發(fā),詳細分析了VxWorks下PCI9030設(shè)備驅(qū)動程序的實現(xiàn)過程及相 關(guān)代碼。同時就該驅(qū)動程序?qū)ο到y(tǒng)性能及實時性" title="實時性">實時性的提高作了必要的分析和討論,。
關(guān)鍵詞: VxWorks I/O系統(tǒng) PMC-FPGA PCI9030
隨著通信技術(shù)、計算機技術(shù)的飛速發(fā)展,,嵌入式實時操作系統(tǒng)越來越廣泛地應(yīng)用到無線通信,、交通、工業(yè)控制,、軍事,、航空航天、衛(wèi)星通信等各個領(lǐng)域,。由于這些領(lǐng)域?qū)崟r性,、可靠性要求很高,從而使得實時操作系統(tǒng)迅速發(fā)展起來,。其中VxWorks是目前公認的最出色的一種實時操作系統(tǒng),。VxWorks具有可裁減的微內(nèi)核;高效的任務(wù)管理,;優(yōu)先級搶占和時間片輪轉(zhuǎn)調(diào)度,;準(zhǔn)確的上下文切換,;快速靈活的任務(wù)間通信等優(yōu)點。它已成為實際的嵌入式實時操作系統(tǒng)的工業(yè)標(biāo)準(zhǔn)和軍用標(biāo)準(zhǔn)[1],。嵌入式系統(tǒng)特別強調(diào)“量身定做”的原則,,基于某一種特殊用途,可以針對這項用途開發(fā)出截然不同的一項系統(tǒng),,這就是所謂的客制化[2],。通常需要根據(jù)系統(tǒng)的功能、成本,、尺寸及用戶需求等方面來定制合適的硬件系統(tǒng),,這就要求用戶開發(fā)自己的硬件驅(qū)動程序。驅(qū)動程序的開發(fā)是系統(tǒng)開發(fā)的重要組成部分,,其性能,、實時性、可靠性,、指令的簡練性關(guān)系著應(yīng)用系統(tǒng)的性能和可靠性,,所以驅(qū)動程序的開發(fā)顯得至關(guān)重要。
本文針對以PCI9030為接口控制芯片的PMC-FPGA(PCI Mezzanine Card)轉(zhuǎn)接卡的開發(fā),,論述了VxWorks下設(shè)備驅(qū)動程序結(jié)構(gòu)及PMC-FPGA板卡驅(qū)動程序的實現(xiàn),。
1 VxWorks下I/O系統(tǒng)及驅(qū)動程序
1.1 I/O系統(tǒng)簡介
VxWorks下I/O系統(tǒng)為各種設(shè)備提供一個簡單、統(tǒng)一,、獨立的設(shè)備接口,,VxWorks下I/O系統(tǒng)的獨特設(shè)計使其比其他I/O系統(tǒng)更快、更靈活,。這是實時系統(tǒng)的一個重要特征,。[3]I/O系統(tǒng)的功能是將用戶的I/O請求路由到合適的驅(qū)動程序中的對應(yīng)函數(shù)。它通過一個文件描述符" title="描述符">描述符表來實現(xiàn)這一功能,。VxWorks設(shè)備驅(qū)動程序基本上通過I/O系統(tǒng)進行訪問,,設(shè)備驅(qū)動程序被作為內(nèi)核過程來實現(xiàn),進一步提高了系統(tǒng)的實時性,。I/O系統(tǒng)把設(shè)備作為特殊文件進行處理,,提供了統(tǒng)一的管理、統(tǒng)一的界面和統(tǒng)一的使用方法,,并把設(shè)備,、文件、網(wǎng)絡(luò)通信組織成為一致的層次抽象,。圖1描述了I/O系統(tǒng)與驅(qū)動程序間的層次關(guān)系,。
VxWorks下I/O系統(tǒng)中三個主要的元素是:驅(qū)動程序、設(shè)備和文件[3],。文件是用戶訪問設(shè)備的統(tǒng)一接口,;驅(qū)動程序是實現(xiàn)I/O系統(tǒng)所需的七個具體基本函數(shù),;設(shè)備是實際物理設(shè)備的抽象定義。
1.2 驅(qū)動程序的執(zhí)行邏輯
VxWorks下I/O系統(tǒng)提供七個基本的I/O函數(shù):creat( ), delete( ), open( ), close( ), read( ), write( )及ioctl(),,并將用戶的I/O請求路由到設(shè)備對應(yīng)的子程序" title="子程序">子程序,。這主要是通過找到驅(qū)動列表中對應(yīng)的驅(qū)動號來實現(xiàn)。驅(qū)動列表如表1所示,。
在驅(qū)動程序中通過調(diào)用iosDrvInstall()函數(shù)將驅(qū)動程序中的子程序(myOpen( ), myRead( )等)注冊到系統(tǒng)的設(shè)備驅(qū)動列表中并返回一個驅(qū)動號,,如表1中所示的驅(qū)動號3。
然后編寫創(chuàng)建設(shè)備子程序,,通常命名為xxCreate(),,這要定義一個雙向鏈表的DL_NODE結(jié)構(gòu)和一個設(shè)備描述符的結(jié)構(gòu),結(jié)構(gòu)中第一個變量是DEV_HDR類型,,稱為設(shè)備頭,。調(diào)用iosDevAdd()函數(shù),將設(shè)備添加到設(shè)備列表中(見圖2),。其中有管道設(shè)備,、串口設(shè)備及PCI9030設(shè)備,pmcfpga是設(shè)備名稱,。
在iosLib.h()頭文件中,,對設(shè)備頭DEV_HDR定義如下:
typedef struct
{ DL_NODE node; /* 設(shè)備表結(jié)點 */
short drvNum; /* 設(shè)備的驅(qū)動號 */
char * name; /* 設(shè)備名 */
} DEV_HDR;
此外還要定義一個稱為設(shè)備描述符表的數(shù)據(jù)結(jié)構(gòu)來將設(shè)備和驅(qū)動聯(lián)系起來(見表2)。這個設(shè)備描述符表中除了包含設(shè)備頭DEV_HDR,、設(shè)備信息(包括設(shè)備號,、廠商號、總線號,、功能號,、中斷號等)外,還可包含其他一些與設(shè)備無關(guān)的變量,,如文件偏移量,、布爾代碼設(shè)置的標(biāo)志等,。定義如下:
typedef struct PCI9030Device
{DEV_HDR;
PCI9030_INFO;
}PCI9030_DEVICE;
從表2中可以看出設(shè)備名是pmcfpga, 驅(qū)動號為3,,文件描述符號是2。通過調(diào)用iosDrvInstall()將驅(qū)動程序添加到驅(qū)動程序表并返回一個驅(qū)動號,,再調(diào)用iosDevAdd()將設(shè)備描述符添加到設(shè)備列表并用設(shè)備名字(drvName)和驅(qū)動程序號(drvNum)對DEV_HDR初始化,。
驅(qū)動程序裝載完畢后,用戶執(zhí)行open(“/ pmfpga”, 參數(shù)2,,參數(shù)3),,I/O系統(tǒng)根據(jù)文件名找到設(shè)備及驅(qū)動號,并通過驅(qū)動表找到對應(yīng)的驅(qū)動子程序入口函數(shù)myOpen(),,同時返回文件描述符號fd,。以后就可根據(jù)fd執(zhí)行其他函數(shù)的操作,,如:close (fd)、read (fd, 參數(shù)2,,參數(shù)3)等,。圖3給出了設(shè)備、驅(qū)動程序連接的邏輯示意圖,。
2 PCI9030設(shè)備的訪問
2.1 PCI9030簡介
本設(shè)計的PMC轉(zhuǎn)接卡選用PLX公司的PCI9030作PCI總線的接口控制芯片,,執(zhí)行PMC總線標(biāo)準(zhǔn),主要應(yīng)用于目前較為流行的一些只有PMC接口的單板機上,,例如:VMIC公司生產(chǎn)的VMIVME系列,;MEN公司生產(chǎn)的PowerPC單板機等。在PMC轉(zhuǎn)接卡上可以掛上FPGA,、 DSP等數(shù)字處理能力較強的芯片以實現(xiàn)高速控制器,,提高數(shù)字處理速度和運算速度,從而進一步滿足系統(tǒng)實時性的要求,。PMC轉(zhuǎn)接卡內(nèi)部邏輯結(jié)構(gòu)如圖4所示,。
?
這里FPGA作為PCI9030接口芯片的外設(shè)掛到PCI局部總線" title="局部總線">局部總線上,主板上的CPU要從PMC接口通過PCI9030才能訪問到外設(shè),,因此需要實現(xiàn)從PCI總線通過PCI9030到局部總線的訪問,,所以驅(qū)動程序的關(guān)鍵是實現(xiàn)PCI局部總線到PCI總線的地址映射。
2.2 訪問PCI9030外設(shè)的實現(xiàn)
PCI9030有一個64字節(jié)的目標(biāo)設(shè)備讀FIFO和一個128字節(jié)的PCI目標(biāo)寫FIFO,,用來實現(xiàn)PCI主設(shè)到局部總線的訪問,,并允許5個地址空間去訪問局部地址空間,它們分別是space0,、space1,、space2、space3和Expansion ROM,。每個PCI地址空間到局部地址空間的映射關(guān)系由三個寄存器來決定: Local Address Range(局部基地址范圍)——LASxRR 及EROMRR; Local Base Address(局部基地址)——LASxBA及EROMBA; PCI Base Address(PCI基地址)——PCIBAR2,、PCIBAR3、 PCIBAR4,、 PCIBAR5及PCIERBAR[4],。每一個空間的映射是一一對應(yīng)的,規(guī)定space0映射到PCI BASE2, space1映射到PCI BASE3,以此類推,。圖5為地址映射示意圖,。
PCI9030復(fù)位初始化時需定義一次地址空間的映射,具體實現(xiàn)方法是在E2PROM中配置好三個寄存器的值:①Range:指定PCI總線訪問局部總線空間范圍的PCI地址位,。除去最低一個字節(jié),,左起第一個為1的數(shù)對應(yīng)的位就是該空間范圍。例如:配置Range=FFF00008,,去掉第一個字節(jié),,左起第一個1在bit20, 所以空間范圍是220=1MB,。②Remap(Local Base Address):根據(jù)自己的硬件設(shè)計決定設(shè)備在局部總線的基地址,bit0必須置為1,,表明允許對應(yīng)的局部空間地址映射,。③Descriptor:指定局部總線的特征,包括總線寬度,、讀延時,、寫延時的延時時鐘數(shù)、是否預(yù)取等,。
驅(qū)動程序的設(shè)備初始化子程序給PCI Base Address 寄存器寫入全1,,即FFFFFFFF,然后讀回的寄存器的值就是CPU根據(jù)E2PROM中的配置分配的PCI的基地址范圍值,。在VxWorks中通過調(diào)用以下兩個函數(shù)來實現(xiàn):
pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,& baseAddress),;
pciConfigOutLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADDRESS_2,& baseAddress);
當(dāng)需要訪問某一設(shè)備時,,只需要訪問該設(shè)備占用的局部地址空間所對應(yīng)的PCI地址空間即可,,一般用PCI基地址加偏移量的方式訪問,例如:PCI_READ(MEMBase2,0x04,buffer),。此外PCI9030 還提供了四個片選信號,,以便對多個外設(shè)進行訪問,這四個片選信號是CS0,、CS1,、CS2、CS3,,對應(yīng)四個片選基地址寄存器:CS0BASE, CS1BASE,、CS2BASE、CS3BASE, 當(dāng)片選基地址寄存器表達的基地址與某一局部空間基地址相同且設(shè)定的地址范圍也相同時,,這一片選信號上所掛的設(shè)備就落在該局部空間[4],。本次設(shè)計中所用的FPGA芯片使用了CS0片選信號,設(shè)計的CS0BASE基地址和范圍落在space0,,這樣通過PCI BASE2 ADDRESS 就可訪問到FPGA,。
2.3 PCI9030的中斷及控制寄存器
PCI9030提供了兩個局部中斷引腳LINTi1和LINTi2以及中斷控制寄存器INTCSR(軟中斷)[7],用來觸發(fā)PCI中斷輸入引腳INTA#輸出有效信號,,向CPU申請中斷,。同時PCI中斷引腳寄存器PCIIPR必須在E2PROM中設(shè)置為1h, 表明通過INTA#申請中斷,。BIOS能夠?qū)NTA#路由到一個中斷控制器的中斷請求(IRQ)輸入,,為系統(tǒng)分配一個與標(biāo)準(zhǔn)的中斷控制器8259的IRQ相應(yīng)的中斷號,并由BIOS將此中斷號寫到PCI中斷線(PCI Interrupt Line)寄存器PCIILR中,。因此在寫驅(qū)動程序時,,讀取PCIILR中的值是將中斷服務(wù)子程序ISR連接到中斷控制器的關(guān)鍵,。三種中斷形式的設(shè)置可在中斷控制寄存器INTCSR中配置。也可通過設(shè)置中斷控制寄存器INTCSR[6]來禁止INTA#中斷,。
通過E2PROM編程器或PLX公司的PlxMon軟件對E2PROM編程,,可寫入幾個重要寄存器的值,其中包括配置寄存器(PCI配置首區(qū)[5]),、局部配置寄存器等的值,。系統(tǒng)上電后自動將這些數(shù)據(jù)從E2PROM傳到PCI9030內(nèi)部寄存器。在PCI配置寄存器00h中放置兩個重要參數(shù)Device ID(設(shè)備ID)和Vendor ID(廠商ID), 它們是表明設(shè)備身份的關(guān)鍵,,在VxWorks中利用這兩個參數(shù)來調(diào)用如下函數(shù):
pciFindDevice(PCI_VENDOR_ID, CI_DEVICE_ID, index,&busNo, &deviceNo, &funcNo) ,;
找到設(shè)備并讀取busNo(總線號)、deviceNo(設(shè)備號),、
funcNo(功能號)等參數(shù)后,,再利用這三個參數(shù)找到PCI基地址和中斷號,最后作地址映射,,將基地址加到內(nèi)存管理單元MMU中,。這是PCI9030設(shè)備初始化的重要步驟。
3 VxWorks下的PCI9030驅(qū)動程序結(jié)構(gòu)及流程
3.1驅(qū)動程序的框架
前面提到在VxWorks下有七個基本I/O函數(shù),,所以寫PCI9030驅(qū)動程序時首先要寫PCI9030的I/O接口子程序PCI9030Open(),、PCI9030Close()、PCI9030Read()等,。 此外還需要寫三個重要的程序[3]:
PCI9030Drv(),。該程序的主要工作是執(zhí)行必要的硬件初始化;通過調(diào)用iosDrvInstall()函數(shù)裝載驅(qū)動程序到I/O系統(tǒng),,連接I/O接口子程序PCI9030Open(),、PCI9030Close()、PCI9030Read()等到I/O系統(tǒng),;連接中斷等,。
PCI9030Create()。該程序的主要工作是將設(shè)備添加到I/O系統(tǒng),,通過調(diào)用iosDevAdd()函數(shù)來實現(xiàn),。
中斷服務(wù)子程序ISR。該程序完成寫入中斷響應(yīng)后需要執(zhí)行的操作,。
3.2 程序流程圖
圖6和圖7分別為設(shè)備驅(qū)動程序PCI9030Drv()的流程圖及設(shè)備所需接口函數(shù)的框圖,。
?
3.3 部分程序代碼
(1)sysPCI9030Init()子程序。
void sysPCI9030Init (void)
{設(shè)備初始化……
pciIntConnect(INUM_TO_IVEC(((int) btRes->irq)+INT_NUM_IRQ0),(VOIDFUNCPTR)myISR,IntParameter);
/*連接到中斷服務(wù)子程序*/ }
(2)PCI9030Drv()程序,,裝載驅(qū)動程序到驅(qū)動表并連接I/O接口函數(shù),。
int PCI9030Drv()
{
int pci9030DrvNum; /*定義驅(qū)動號*/
pci9030DrvNum=iosDrvInstall((FUNCPTR)PCI9030open,0,
(FUNCPTR)PCI9030open, (FUNCPTR)PCI9030close,
(FUNCPTR)PCI9030read, (FUNCPTR)PCI9030write,0);
……
}
本文針對PMC-FPGA轉(zhuǎn)接板的開發(fā)設(shè)計,研究了在VxWorks下的驅(qū)動程序的編寫及PCI接口控制芯片PCI9030的應(yīng)用,論述了VxWorks下PCI9030驅(qū)動程序的設(shè)計方法,。由于VxWorks操作系統(tǒng)的微內(nèi)核可裁減及高效的多任務(wù)管理方式,,為提高系統(tǒng)的實時性作了很大貢獻。又因VxWorks有豐富高效的接口函數(shù),,使編程更加簡單方便,。I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過程實現(xiàn),實時性,、可靠性都得到很大提高,。在硬件設(shè)計中,采用FPGA可編程邏輯門陣列芯片,,通過編程實現(xiàn)硬件邏輯運算,,大大提高了運算速度,進一步提高了系統(tǒng)的實時性,。這里設(shè)計的PMC-FPGA轉(zhuǎn)接板也為高速控制器的設(shè)計提供了硬件條件,,對控制系統(tǒng)中實時性、快速性的實現(xiàn)具有現(xiàn)實意義,。
參考文獻
1 王學(xué)龍. 嵌入式VxWorks系統(tǒng)開發(fā)與應(yīng)用. 北京:人民郵電出版社, 2003
2 賈智平,, 張瑞華. 嵌入式系統(tǒng)原理與接口技術(shù). 北京:清華大學(xué)出版社,2005
3 Vxworks Programmer’s Guide 5.5. Wind River Systems, Inc.,, 2002
4 PCI 9030 Data Book Version 1.4. PLX Technology, Inc.,, May 2002
5 Tom Shanley, Don Anderson. PCI System Architecture.Fourth Edition,北京:電子工業(yè)出版社,,2000