999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

RTX系統下并行I/O卡驅動程序的開發

2020-04-07 10:41:28
計算機測量與控制 2020年3期
關鍵詞:功能

(1.西安現代控制技術研究所,西安 710065;2.中國人民解放軍93811部隊 保障部裝備質量控制與安全監察中心,蘭州 730000)

0 引言

PCI-1751卡是一塊基于PCI總線的擁有48路并行I/O的板卡。由于可以同時控制多路電平輸入輸出,該板卡廣泛于工業交流/直流I/O設備監控、繼電器和開關控制、并行數據傳輸、感應TTL信號邏輯、驅動LED指示器等環境。同時PCI-1751板卡上也集成了2個8254定時器/計數器,也可用于一些高精度定時計數的功能場景。

RTX操作系統作為Windows系統的擴展系統,受到許多高校研究單位的青睞。而很多板卡在出廠時都不提供RTX驅動程序,PCI-1751板卡也不例外。因此,本文結合研華科技公司的PCI-1751板卡,介紹RTX系統下板卡驅動的編寫調試方法及一些經驗,以求RTX驅動程序的開發被更多探索。

1 RTX驅動程序機理

1.1 RTX下PCI驅動程序開發實質

寄存器是板卡上的具有特定功能的內存存儲。用戶可以不了解板卡內部的具體硬件實現,但只要能理解其意義并通過地址訪問到寄存器,即可實現板卡功能,故稱為板卡與用戶之間的軟件接口。

因此,RTX下PCI板卡驅動的開發實質就是利用RTX系統函數操縱板卡上的寄存器。

1.2 PCI板卡寄存器的分類

開發驅動的用戶需要關心兩類寄存器,即PCI配置寄存器與板卡功能寄存器。

1.2.1 PCI配置寄存器

PCI配置寄存器是每塊板卡寄存器的“目錄”,是PCI協議預定義的256字節的內存[3]。在該寄存器中,標識了該板卡的所有有用信息,其具體內容如表1所示。

表1 PCI配置空間

1)DeviceID與VendorID:

每類板卡獨一無二的屬性[1],用戶在遍歷計算機系統中的所有板卡時,可根據這兩個值,來判斷該板卡是否存在于該計算機系統。

2)基地址寄存器:

用于存放寄存器映射的基地址?;刂肥前蹇üδ芗拇嫫鞯钠鹗嫉刂罚脩艨梢愿鶕刂泛推频刂酚嬎惆蹇ㄉ纤泄δ芗拇嫫鞯牡刂?。

1.2.2 板卡功能寄存器

板卡功能寄存器是板卡功能的軟件接口,用戶只需對這些寄存器置數取數,即可完成與之對應的功能。

板卡在出廠硬件手冊都會附帶寄存器功能說明及地址分布,這些地址都是從基地址開始有規律累加的,每個寄存器相對基地址的累加量稱作偏移地址。因此,只要找到了板卡I/O基地址,所有寄存器的地址都可以很容易的推算出來。

在圖1所示的計算機環境中,PCI-1751的內存基地址為0xFEBFF400,這與板卡PCI配置空間的基地址寄存器2中的值所吻合,我們可得到其基地址存放在基地址寄存器2中。感興趣的讀者可以通過該方法自己動手驗證基地址是否存放于PCI配置寄存器中的基地址寄存器2中。

圖1 板卡資源對話框

2 PCI-1751板卡簡介

2.1 板卡功能

研華PCI-1751接口卡是一塊具有48路并行DI/O輸入輸出卡,同時該板卡也攜帶3個定時器/計數器,可以完成高精度的定時計數功能。

該板卡借鑒了8255芯片的設計思路,實現了兩塊8255芯片的mode 0模式,共具有24x2=48路DI/O通道。同時該板卡的I/O驅動能力遠超出于普通的8255芯片。

同時,PCI-1751板卡提供了斷電保護功能,當所在機器遭遇突發斷電又瞬時恢復的情況,板卡可以保持之前保存的通道輸出值。

2.2 板卡DI/O通道分組

PCI-1751板卡上兩個增強的8255芯片的48路DI/O通道被分為6個組,分別為PA0、PB0、PC0(PC0H、PC0L)、PA1、PB1、PC1(PC1H、PC1L)。每個通道組可以單獨配置輸入輸出方向,PC0和PC1組高低字節也可單獨配置,互不影響。

2.3 相關寄存器配置

PCI-1751的寄存器地址列表如表2所示。

板卡上的硬件跳線可以強制配置I/O口輸入輸出方向。當跳線配置為軟件配置模式時,需要在使用前先寫入控制字。控制寄存器的偏移地址為0和7,對應Port0和Port1,其內容格式如表3所示。

表2 PCI-1751寄存器地址

表3 Port0、Port1配置寄存器

對于Port0、Port1配置寄存器,寫1為輸入方向,寫0為輸出方向。例如,只想配置PC0通道組為輸入通道,其他通道均為輸出通道,則應將控制字0x09(00001001B)寫入偏移地址為3的寄存器中。

配置好輸入/輸出方向后,對相應的通道寄存器進行讀/寫即可完成輸入/輸出操作。例如讀取PC0通道組,只需讀取base+2的寄存器值即可。

2.4 板卡定時器/計數器

PCI-1751板卡上攜帶三塊8254計數器芯片,定時器連接關系如圖2所示。

板卡在設計時,為了提供更多的靈活性,Timer1的CLK引腳可以通過跳線連接到外部信號源CLK1,亦可連接到Timer0的輸出端。當Timer1的時鐘源連接到Timer0的輸出端時,相當于Timer0與Timer1串聯形成一個32位的計數器。

板卡內部的定時器晶振頻率為10 MHz,使用Timer0與Timer1進行定時,最大定時頻率為10 MHz/2=5 MHz;最小定時頻率為10 MHz/65 536/65 536=0.002 328 Hz。

圖2 定時器/計數器結構圖

2.5 板卡中斷寄存器

在表2所示的寄存器列表中,特別值得關注的是偏移地址為32的中斷控制/狀態寄存器。該寄存器在寫入時作為控制寄存器,讀取時作為狀態寄存器,他們使用相同的偏移地址。

1751板卡將PC00、PC04、Timer1、PC10、PC14、Timer2的輸出引入到板卡的中斷電路中。中斷控制寄存器決定了中斷源的選擇、中斷觸發模式等設置,中斷狀態寄存器顯示當前中斷配置與觸發狀態,其定義如表4所示。

表4 中斷控制/狀態寄存器

其中:F是中斷標志,作為狀態寄存器時,該位表示中斷是否發生;作為控制寄存器,寫0是對中斷標志的清除。E是上升沿/下降沿的配置,1為上升沿,0為下降沿。M1M0是中斷源的選擇,具體示意如表5所示。

表5 中斷模式配置

例如,在本文的第四章節所介紹的實驗中,欲檢測PC00的上升沿中斷,需將0x05寫入中斷控制寄存器中即可完成配置;中斷服務函數中,就是通過該寄存器的D3位即可檢測PC00中斷是否來臨。

有了這些知識儲備,即可開始進行板卡驅動的開發。

3 RTX驅動程序開發示例

在本文示例的驅動程序中,主要提供關于DI/O操作的幾個重要函數,分別為打開板卡函數、中斷配置函數、配置通道組函數、讀通道組函數、寫通道組函數、等待中斷函數。通過這些函數,該板卡可以完成多路電平的輸入輸出以及上升沿/下降沿中斷采集的功能。

3.1 打開板卡函數—OpenCard_PCI1751

PC機可能存在很多板卡,因此在打開板卡函數的實現中,主要操作為根據DeviceID和VendorID搜索PCI-1751板卡是否存在。如果搜尋到板卡,則保存板卡的I/O映射基地址,方便后續讀寫板卡內部寄存器時使用。

示例代碼如下:

for ( bus=0; bFlag; bus++ )

for(deviceNumber=0;deviceNumber

for(functionNumber=0;functionNumber

{

bytesWritten = RtGetBusDataByOffset(…)

if(( PciData->VendorID == vendorID ) && ( PciData->DeviceID == deviceID ))

base_add = base_add_register[2];//get add

}

這三層循環會遍歷所在計算機系統中的所有板卡。通過RTX系統提供的接口RtGetBusDataByOffset,可以獲得PCI配置空間的內存指針,即表1所示的內存區域,將該內存中的DeviceID和VendorID成員與PCI-1751板卡的進行對比,即可驗證當前所遍歷板卡是否為1751板卡。如果找到,保存I/O映射基地址。

對于PCI-1751板卡而言,DeviceID為0x1751,VendorID為0x13FE。

3.2 打開中斷——EnableInterrupt_1751

打開中斷函數內部完成兩個操作。

首先根據用戶需求,對中斷控制寄存器進行配置,其次使用RTX提供的API函數RtAttachInterruptVector對PCI中斷進行掛接響應。

完成上述兩個設置之后,板卡上被使能的中斷就可以觸發中斷服務函數。

中斷寄存器的配置示例代碼如下:

IntCmd = IntMode<<(port*4);

RtWritePortUchar(BaseAdd+32, (UCHAR)IntCmd);

其中,IntMode對應表5中的中斷模式選擇,取值0~3;port定義為Port口編號,Port0為0,Port1為1。

3.3 配置通道組——SetPortDirection_1751

在配置通道組函數中,主要操作就是對欲使用的通道組的控制字進行設置,然后將控制字寫入對應的寄存器中。

示例代碼如下:

dirsetting=PA<<4+PCH<<3+PB<<1+PCL;

RtWritePortUchar(BaseAdd+(port+1)*4-1, (UCHAR)dirsetting);

在形參列表中,PA、PCH、PB、PCL是通道組輸入輸出方向,定義為輸出傳0,輸入傳1;port定義為Port口編號,Port0為0,Port1為1。

3.4 讀通道組——ReadPort_1751

讀取通道組,就是讀取指定通道對應的寄存器。

示例代碼如下:

if (channel >= 3) channel += 1;

cResult=RtReadPortUchar(BaseAdd+channel);

在形參列表中,channel代表I/O口編號,定義為PortA0、PortB0、PortC0、PortA1、PortB1、PortC1依次為0~5。

3.5 寫通道組——WritePort_1751

輸出通道組,就是向指定通道對應的寄存器上寫值。

示例代碼如下:

if (channel >= 3) channel += 1;

RtWritePortUchar(BaseAdd+channel, (UCHAR)value);

在形參列表中,channel代表I/O口編號,定義為PortA0、PortB0、PortC0、PortA1、PortB1、PortC1依次為0~5。

3.6 等待中斷——WaitPortInterrupt_1751

3.6.1 原理解析

對于像Windows、RTX這樣的多任務操作系統,每個任務對應一個運行的進程,每個運行的進程中又可以包含很多線程。如果沒有同步機制,所有的線程會任意運行。然而,多個線程可能會要求同一個資源,這就需要同步處理。

等待中斷函數就使用到了同步機制。調用等待函數后,其內部的等待同步對象的函數,例如WaitForSingleObject函數,就會處于等待狀態,對于用戶,其表征為“卡死”狀態,只有當中斷觸發后,中斷服務函數內部對該同步對象使能后,等待同步對象的函數才會釋放線程占有權,等待中斷函數才能繼續運行下去。

RTX操作系統提供的等待信號量的函數為RtWaitForSingleObject,形參和用法兼容Windows操作系統函數。形參1是信號量的句柄,形參2是等待時間,當形參2傳入INFINITE時,永久等待,直至信號量有效。等待中斷函數就是利用永久等待信號量來實現的。

3.6.2 函數實現

等待中斷函數內部對兩個port口,3類中斷進行等待。當用戶調用該函數時,先清空對應信號量,然后等待信號量,此時該函數處于阻塞狀態。

中斷服務函數檢測到中斷觸發后,將對應信號量激活。等待中斷函數才能繼續進行,達到了“卡死”等待的作用。

這里對port0口的PC00中斷進行示意。

IntCmd = 0x01;//中斷源,對應表5

RtWritePortUchar(BaseAdd+32, (UCHAR)IntCmd);//寫中斷控制寄存器

RtWaitForSingleObject(hInterHandle[0], INFINITE);

Printf(“PC00 Int found/n”);//中斷到達了

return 0;

在中斷服務函數內部,其核心代碼如下:

temp1=RtReadPortUchar(base+32);//得到中斷狀態寄存器

if (temp1 & 0x08)//對比表4中的D3位

RtSetEvent(hInterHandle[0]);

4 RTX驅動程序測試

4.1 測試原理

對于板卡驅動性能的測試,這里使用了一個“自發自收”的閉環測試模型,即板卡PA00自己產生上升沿,板卡PC00采集該上升沿,通過對比上升沿產生前后的時間間隔來衡量驅動程序的性能。測試流程如圖3所示。

圖3 驅動測試流程

4.2 測試方法

板卡硬件上用導線連接引腳1與引腳19,即PA00引腳與PC00引腳。

軟件上將PA口配置為輸出方向,PC口設置為輸入方向,這樣PA00的電壓會被PC00實時采集。

I/O口方向設置好后,使PA00口先輸出低電平,再輸出高電平,等待PC00口檢測到該上升沿觸發中斷。

Windows與RTX的測試程序均按照圖3所示流程進行編寫,具體流程如下:

1)打開板卡,配置PA口為輸出方向,PC口為輸入方向;

2)配置中斷控制寄存器,使能PC00上升沿中斷;

3)記錄當前時刻t1;

4)PA00輸出低電平;

5)PA00輸出高電平;

6)等待PC00上升沿中斷,記錄中斷觸發時刻t2;

7)計算“閉環”時間t2-t1;

8)程序結束。

4.3 測試環境與考核指標

本次試驗使用研華610L原裝機箱作為測試硬件環境,系統環境為Windows XP SP3+RTX8.1,編譯器使用Visual Studio 6.0。

Windows與RTX實驗程序均按照4.2節中的流程開發,t1和t2通過系統函數獲取,t2與t1的差值作為最終考核指標。

4.4 測試結果與分析

實驗100次取平均值作為測試最終結果,Windows驅動與RTX驅動的“閉環”測試結果如表6所示。

表6 驅動測試結果 ms

通過平均值的對比可以看到,RTX驅動程序相比Windows驅動,響應時間縮短了68%,性能提升相當明顯。

同時,通過極值對比可以看到,RTX驅動的閉環時間相對穩定,波動保持在0.003 ms之內;Windows驅動的閉環時間相對不穩定,波動在0.008 ms之內。

本次實驗表明,無論在響應時間方面,還是在穩定性方面,RTX驅動的性能都處在領先地位,對于追求實時、穩定的環境而言,RTX驅動無疑是首選。

由于系統設計出發點的不同,無論是在線程調度算法、線程優先級定義、定時器精度方面,Windows系統均不是RTX對手。因此,Windows驅動的落敗也是在預料之中的。

這也表明,RTX可以對一個單一的低成本的平臺進行擴展,使其滿足一個廣泛的嵌入式應用程序的要求。之所以很多高校和研究所廣泛使用RTX,確實是有一定依據的。

5 結束語

本文介紹了PCI-1751接口卡在RTX實時系統下驅動程序的編寫方法,出色的實現了板卡提供的DI/O功能、中斷采集功能,可以滿足絕大多數工業、生產、仿真的實時性要求。同時對于其他類型的接口卡,亦可借鑒本文中列舉的方法和框架進行開發驅動。對于PCI-1751板卡的定時器/計數器等功能,由于篇幅所限未能介紹,感興趣的讀者可以參考本文的思路,自己探索嘗試。

猜你喜歡
功能
拆解復雜功能
鐘表(2023年5期)2023-10-27 04:20:44
也談詩的“功能”
中華詩詞(2022年6期)2022-12-31 06:41:24
基層弄虛作假的“新功能取向”
當代陜西(2021年21期)2022-01-19 02:00:26
深刻理解功能關系
鉗把功能創新實踐應用
關于非首都功能疏解的幾點思考
基于PMC窗口功能實現設備同步刷刀功能
懷孕了,凝血功能怎么變?
媽媽寶寶(2017年2期)2017-02-21 01:21:24
“簡直”和“幾乎”的表達功能
中西醫結合治療甲狀腺功能亢進癥31例
主站蜘蛛池模板: 精品国产福利在线| 波多野结衣一区二区三区AV| 九九视频在线免费观看| 伊人五月丁香综合AⅤ| 国产69囗曝护士吞精在线视频| 日韩东京热无码人妻| 国产亚洲精久久久久久无码AV| 国产理论最新国产精品视频| 成人在线欧美| 88国产经典欧美一区二区三区| 亚洲日本中文字幕天堂网| 国产视频久久久久| 综合天天色| 久久黄色视频影| 亚洲精品片911| 72种姿势欧美久久久久大黄蕉| 综合五月天网| 天堂av综合网| 国产中文一区二区苍井空| 国产精品天干天干在线观看| av大片在线无码免费| 日韩av在线直播| 欧美激情视频一区二区三区免费| 天天综合网站| 午夜精品影院| 在线看AV天堂| 97国产在线观看| 一级一级一片免费| 亚洲第一在线播放| 亚洲日韩精品伊甸| 欧美色视频网站| 波多野结衣视频网站| 在线欧美国产| 亚洲人成人无码www| av在线无码浏览| 麻豆精选在线| 日韩天堂视频| 成人年鲁鲁在线观看视频| 四虎在线高清无码| 国产精品成人啪精品视频| 亚洲av无码久久无遮挡| 一级毛片在线免费看| 免费一级大毛片a一观看不卡| 99久久精品国产麻豆婷婷| 亚洲国产精品VA在线看黑人| 丁香婷婷久久| 欧美国产日产一区二区| 国产污视频在线观看| 97青草最新免费精品视频| 日本伊人色综合网| 国产白浆视频| 亚洲区视频在线观看| 欧美一道本| 亚洲精品另类| 色婷婷色丁香| 欧美性猛交xxxx乱大交极品| 黄色片中文字幕| 国产特级毛片| 久久香蕉欧美精品| 国产精品深爱在线| 最近最新中文字幕在线第一页| 一级爆乳无码av| 狠狠v日韩v欧美v| 国产白浆在线观看| AV在线麻免费观看网站 | 毛片久久网站小视频| 国产一区在线观看无码| 四虎国产精品永久一区| 亚洲欧美极品| 激情爆乳一区二区| 热99re99首页精品亚洲五月天| 91麻豆久久久| 性做久久久久久久免费看| 国产成人精品免费视频大全五级| 国产成人午夜福利免费无码r| 亚洲精品无码AV电影在线播放| 亚洲欧美日韩成人在线| 国产一级视频久久| 国产黑人在线| 精品国产欧美精品v| 婷婷亚洲最大| 好紧好深好大乳无码中文字幕|