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

RTX系統下Moxa多串口卡驅動程序的開發*

2019-11-13 02:59:50劉士勛劉滿國唐同斌
彈箭與制導學報 2019年3期
關鍵詞:設置

劉士勛,劉滿國,唐同斌,喻 戈,岳 超

(西安現代控制技術研究所, 西安 710065)

0 引言

RTX系統憑借其兼容了Windows良好的人機交互特性的原因,逐漸走入各大高校、研究所的實驗室內。然而,板卡出廠時大多不提供RTX驅動,即使有些板卡提供RTX驅動,這些驅動往往沒有源代碼,同時使用起來也未必方便,出現問題也不好定位[3]。對于大量使用RTX系統的研究生產單位而言,了解、掌握和開發板卡RTX驅動程序是相當必要的。當前對RTX驅動的研究工作還不是很多,已有的成果大多也是基于Rfm2g反射內存卡的。因此,文中以Moxa CP-118U板卡為例,對RTX驅動程序開發問題進行討論,以求該技術能被更多探索。

1 RTX驅動程序機理

1.1 RTX驅動程序框架簡介

Windows操作系統的架構相對復雜,用戶使用板卡API訪問底層硬件,需從頂層開始,層層穿越,跨越用戶模式和內核模式,才能訪問硬件,驅動程序可以理解為Windows內核模式下的一塊“補丁”,所有驅動程序都需要按照該模式開發。

相比Windows驅動程序模型,RTX程序就相對靈活,RTX應用程序可繞過Windows內核直接通過RTX內核訪問RTX硬件擴展層,直接通往硬件進行訪問[5,8]。RTX系統構架示意如圖1所示。

圖1 RTX框架簡圖

當板卡安裝好Windows驅動后,在RTX管理器對該板卡增加RTX支持,然后在設備管理器轉換驅動為RTX下的驅動后,即可進行RTX驅動程序的開發工作。

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

PCI板卡驅動的開發實質是操縱板卡上芯片的寄存器。每個寄存器有其特定的作用,只要了解每個寄存器的作用及其地址,通過寄存器地址對板卡上的寄存器置數取數,即可完成數據交互等功能。

1.3 PCI板卡寄存器訪問地址的獲取

PCI板卡的各類寄存器的訪問地址均存放于一個稱作“PCI配置空間”的256 Byte的內存中[10]。這個空間的前64 Byte是PCI協議標準預定義的,所有PCI板卡都會使用該標準。查詢板卡硬件手冊,即可得到板卡寄存器地址。有些板卡如果使用了其他芯片,其硬件手冊會告訴用戶查找對應芯片的手冊以尋找寄存器的作用及地址。

2 RTX驅動程序開發框架

2.1 搜尋設備

板卡驅動程序的第一步便是驗證該板卡是否存在于當前計算機系統中。

為了獲得指定板卡的PCI配置空間內存,RTX系統為編程人員提供了RtGetBusDataByOffset函數。該函數的參數有總線類型、PCI總線編號、插槽編號,傳入正確參數即可獲得PCI配置空間的參數,比較DeviceID和VendorID即可判斷該板卡是否為指定板卡。如果遍歷所有總線以及所有總線插槽仍無結果,則搜尋該板卡失敗,程序退出或返回失敗。

2.2 保存I/O映射寄存器基地址

Moxa CP-118U板卡給用戶提供I/O映射的方式來訪問寄存器。寄存器的基地址存儲在PCI配置空間的基址寄存器2中,保存該值方便后續對各個串口通道的相關寄存器進行訪問。

2.3 相關寄存器配置

操作板卡的核心便是讀寫板卡上的各個寄存器。深刻理解寄存器的意義和用法對操縱板卡有相當重要的幫助。

Moxa CP-118U板卡的配置包括各個串口通道的波特率的設置、數據位長度、奇偶校驗位的設置等。

2.4 掛接中斷服務函數

板卡一般都提供了中斷標識寄存器。中斷服務函數中就是對中斷標識寄存器中的各個中斷二進制位進行判斷,如果某個二進制位為1則對該中斷進行響應。

3 RTX驅動程序開發示例

Moxa CP-118U板卡有8路RS 422/485串口,每路串口都配備了一塊TL16C550C異步串并行收發器轉換芯片,通過操作對應串口的芯片,可以順利的完成數據的傳輸。其中,每路串口的寄存器共占有8 Byte,8路串口總共占用64 Byte,如圖2所示。

圖2 板卡寄存器組分配示意

對于每路串口,其8 Byte寄存器分配如圖3所示。

圖3 每路串口寄存器分配示意

欲操作一路串口,需對該路串口對應芯片的寄存器有如下了解:

1)配置鏈路控制寄存器LCR:完成數據位長度設置(5~8 bit),停止位長度設置(1,1/2,2),奇偶校驗位設置;

2)中斷使能寄存器IER:完成各類中斷的使能與關閉;

3)中斷標識寄存器IIR:對當前是否發生中斷與當前中斷類型進行標識;

4)發送保持寄存器THR與接收緩沖區寄存器RBR:串口發數和接數會分別頻繁使用這兩個寄存器;

5)波特率分辨率寄存器DLL、DLM:配置這兩位寄存器完成串口波特率設置。

有了以上了解,即可開始驅動程序的開發。

3.1 打開板卡函數——InstallMoxa118UCard

在打開板卡函數的實現中,主要操作為根據DeviceID和VendorID查找板卡,如果搜尋到板卡,保存板卡的I/O映射地址,方便后續操作寄存器使用。

示例代碼如下:

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

for(deviceNumber=0;deviceNumber

for(functionNumber=0;functionNumber

{

bytesWritten = RtGetBusDataByOffset(…)

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

…;//找到板卡

}

其中,PciData是通過RTX系統提供的RtGetBusDataByOffset接口所獲得的PCI配置空間的內存指針,將該內存中的DeviceID和VendorID成員與118U板卡的進行對比,即可驗證當前所遍歷板卡是否為118U板卡。對于Moxa CP-118U而言,DeviceID為0x1180,VendorID為0x1393。

3.2 打開串口——OpenMoxa118UPort

在打開串口函數中,主要操作就是對欲使用的串口進行參數設置,其核心就是操縱對應串口的LCR寄存器。

1)波特率設置

Moxa CP-118U板卡上有參考輸入脈沖,其頻率為XIN=14.745 6 MHz,對每路串口的波特率設置就是對該脈沖進行分頻,分頻因子計算方法如公式(1)所示:

(1)

例如,欲設置波特率為115 200 bit/s,則分頻因子divisor=14.745 6×106/115 200/16=8。

下面的工作就是將分頻因子寫入到分頻寄存器DLL和DLM中即可,需要注意的是,讀寫DLL和DLM,需先置LCR的BIT7為1。示例代碼如下:

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+LCR, (UCHAR)(c|0x80));

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+DLL,(UCHAR)(divisor&0x00FF));

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+DLM,(divisor>>8)&0x00FF);

2)數據位設置

配置LCR的BIT0和BIT1可以設置數據位長度,示例代碼如下:

setting=WordLength-5;

3)停止位

配置LCR的BIT2可以設置停止位長度,示例代碼如下:

setting |= 0x00;//1位停止位

4)校驗位

配置LCR的BIT3-BIT5可以設置校驗位使能及校驗位類型。

if(parity ==PARITY_DISABLE_118){setting |=0x00;}

else if(parity == PARITY_ODD_118){setting |=0x08;}

else if (parity == PARITY_EVEN_118){setting |=0x18;}

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+LCR,(UCHAR)setting);

3.3 打開中斷模式——OpenInterruptMode

使用RtAttachInterruptVector函數掛接中斷服務函數。

3.4 中斷發數——WriteMoxaPort

使用中斷模式向外發數,具體實現為向發數寄存器寫數,當數據發送成功后,會進入2號中斷(“發送保持寄存器空”中斷),在該中斷發生時繼續給發數寄存器寫入待發送的數據。循環這個過程直至欲發送的數據全部發送結束。

a)WriteMoxaPort的核心代碼示例

WriteCounter[port-1] = 0;//清理已發送數據計數器

WriteDataLength[port-1] = iLength;//記錄發送數據長度

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+THR,WriteBuffer[port-1][WriteCounter[port-1]++]);//向發送寄存器寫數,當前已發送計數器+1

b)中斷服務函數相關實現示例

if(WriteCounter[port-1]

{

RtWritePortUchar(moxa118uBaseAdd+(port-1)*8+THR,WriteBuffer[port-1][WriteCounter[port-1]++]); //繼續向緩沖區寫數當前已發送計數器+1

}

else

{

WriteDataLength[port-1]=0; //結束本次發送,清空標志位

WriteCounter[port-1] =0;

}

3.5 中斷收數——ReadMoxaPort

收數是一個被動的過程,當串口總線有數據到來并且超過中斷觸發深度時會自動觸發收數中斷,觸發之前,數據會存儲在板卡的硬件緩沖區內。由于板卡的硬件緩存只有128 Byte,因此需要在驅動程序層增加一層緩沖區。文中設計的ReadMoxaPort函數的參數列表中有一項為用戶提供欲接收數據的長度,當數據接收量大于該值時返回,具體流程如下:

1)當數據來臨時存儲在驅動層緩沖區內;

2)定時器檢測數據長度到達用戶欲得到的數據長度;

3)當數據長度滿足要求后,將數據填入用戶傳進的緩沖區內存,返回結束。

具體實現如下:

a)中斷服務函數的核心實現

ReadBuffer[port-1][ReadCounter[port-1]++]=RtReadPortUchar(moxa118uBaseAdd+RBR);

b)定時器函數的核心實現

if(ReadCounter[port-1]-ReadPostion[port-1]>=iDrvTriggerLevel[port-1])

RtSetEvent(hRecWaitEvent[port-1]);

c)ReadMoxaPort的核心實現

if(RtWaitForSingleObject(hRecWaitEvent[port-1],INFINITE)==WAIT_FAILED)

return-3;

for(counter=0;counter

Buffer[counter]=ReadBuffer[port-1][ReadPostion[port-1]++];

4 RTX驅動程序測試

使用RTX Application Wizard創建RTX應用程序,加載使用上述方法創建的驅動程序靜態庫對驅動程序性能進行測試,測試結果如表1所示。

表1 驅動性能測試結果

由于高波特率條件下中斷頻繁觸發,過于占用計算機資源,同時也受計算機CPU性能等因素影響,921 600 bit/s波特率的條件下最多容許4路串口穩定工作,超過4個串口會丟失數據;230 400 bit/s及以下波特率條件下8路串口可以穩定工作。該性能滿足了絕大多數工作的條件,可以用于日常仿真研究工作。

5 結束語

文中以Moxa CP-118U板卡為例,介紹了在RTX實時系統下PCI板卡的驅動編寫方法,出色的實現了板卡提供的所有功能,驅動性能可以滿足絕大多數工業、生產、仿真的要求。同時對于Moxa公司其他類型的多串口卡,亦可借鑒文中列舉的方法和框架進行開發驅動。

猜你喜歡
設置
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
船舶防火結構及設置的缺陷與整改
水上消防(2020年5期)2020-12-14 07:16:18
中外醫學專業與專科設置對比分析及啟示
特殊場景下列控等級轉換的設置方案
7招教你手動設置參數
動車段(所)股道有效長設置研究
我國中小學將設置人工智能相關課程
玩具世界(2017年9期)2017-11-24 05:17:29
吃紙的妖怪
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
主站蜘蛛池模板: 国产综合精品日本亚洲777| 久久精品国产亚洲麻豆| 国产综合日韩另类一区二区| 在线精品视频成人网| 欧美在线视频不卡第一页| 五月综合色婷婷| 国产精品亚洲专区一区| 欧日韩在线不卡视频| 中美日韩在线网免费毛片视频 | 亚洲午夜天堂| 98超碰在线观看| 一级毛片在线直接观看| WWW丫丫国产成人精品| 永久天堂网Av| 亚洲品质国产精品无码| 伊人精品视频免费在线| 欧美日韩免费| 国产亚洲精品97在线观看| 日韩在线永久免费播放| 全部无卡免费的毛片在线看| 日韩欧美中文字幕在线精品| 性色在线视频精品| 亚洲无码高清一区| 成人午夜免费观看| 人妻少妇久久久久久97人妻| 日韩午夜片| 亚洲日韩久久综合中文字幕| 亚洲欧美成人影院| 亚洲国产成人久久精品软件| 亚洲区视频在线观看| 99re经典视频在线| 日韩欧美成人高清在线观看| 国产精品黑色丝袜的老师| 国产免费一级精品视频| 精品少妇人妻一区二区| 激情影院内射美女| 人妻21p大胆| 亚洲一区二区成人| 国产精品真实对白精彩久久| 亚洲无线观看| 成人国产精品2021| 国产成人精品亚洲日本对白优播| 久久国产av麻豆| 国产高清在线观看91精品| 国产91久久久久久| 亚洲乱强伦| 久久国产成人精品国产成人亚洲| 亚洲欧美自拍视频| 囯产av无码片毛片一级| 精品国产成人a在线观看| 国产欧美在线观看精品一区污| 欧美一级片在线| 国产XXXX做受性欧美88| 国产成人综合久久| 国产欧美视频综合二区| 国产成人亚洲综合a∨婷婷| 午夜毛片免费观看视频 | 91免费观看视频| 久久综合AV免费观看| 日本在线国产| 欧美综合成人| 久热中文字幕在线观看| 国产人在线成免费视频| 中字无码av在线电影| a级毛片在线免费| 国产精品思思热在线| 2020国产免费久久精品99| 日本a级免费| 欧美一区二区三区不卡免费| 五月婷婷亚洲综合| 亚洲不卡网| 2022国产无码在线| 99re经典视频在线| 欧美精品色视频| 666精品国产精品亚洲| 激情综合婷婷丁香五月尤物| 国产精品分类视频分类一区| 又猛又黄又爽无遮挡的视频网站| 国产成人精品2021欧美日韩| 国产精品无码翘臀在线看纯欲| 国产精品亚洲精品爽爽| 久久99精品久久久久纯品|