基于簡(jiǎn)化HDLC規程的通信卡及驅動(dòng)程序設計

發(fā)布時(shí)間:2009-2-12 18:41    發(fā)布者:比爾蓋
關(guān)鍵詞: HDLC , 驅動(dòng)程序 , 通信卡
在我國的靶場(chǎng)測控領(lǐng)域,所有的數據交換都是基于簡(jiǎn)化版的HDLC規程進(jìn)行的,因此我們自行研制開(kāi)發(fā)了基于簡(jiǎn)化HDLC規程的通信卡。簡(jiǎn)化HDLC規程主要是為了提高通信的實(shí)時(shí)性,將HDLC規程中所有通信聯(lián)絡(luò )命令幀全部簡(jiǎn)化,只保留數據通信幀,從而保證一定的實(shí)時(shí)性。由于該卡具有可靠性高,使用簡(jiǎn)單方便,工作時(shí)具有智能化等特點(diǎn),被廣泛地應用于測控系統數據傳送的各個(gè)領(lǐng)域中。同時(shí),隨著(zhù)WindowsXP操作系統在測控系統逐漸應用,開(kāi)發(fā)通信卡WindowsXP驅動(dòng)程序勢在必行。因此,我們針對自行研制的通信卡開(kāi)發(fā)出了核心態(tài)的驅動(dòng)程序,經(jīng)過(guò)廣泛的用戶(hù)使用,普遍反映應用好。下面介紹該通信卡的設計以及驅動(dòng)程序的設計。
通信卡的硬件設計

1 通信卡的主要特點(diǎn)

通信卡的硬件設計目的是智能化通信:在卡上具有4個(gè)DMA通道及相應的數據緩沖存儲區。在數據的接收過(guò)程中,通信卡會(huì )自動(dòng)接收幀數據,判別幀長(cháng)度,在幀尾將接收到的幀數據提交系統。在發(fā)送數據過(guò)程中,系統只須把發(fā)送的數據提交給本卡,具體的發(fā)送過(guò)程由該卡自行完成,不因多路通信而使主機增加開(kāi)銷(xiāo)。該卡有內/外時(shí)鐘兩種工作方式,近距離可省去調制解調器,波特率為600b/s~64Kb/s,提供2路符合RS-232/CCITT V.24和RS-422A標準的接口信號。

2 通信卡的電路設計


圖1 通信卡框圖


通信卡組成框圖如圖1所示。其主要由DMA控制器、總線(xiàn)竟爭仲裁器、串行通信控制器、數據緩沖存儲器SRAM、存儲器I/O映像和物理地址產(chǎn)生器、總線(xiàn)接口及防護、波特率產(chǎn)生器、接口電路等單元電路組成。
DMA控制器作為通信卡的主設備,控制卡上的數據接收和發(fā)送(來(lái)自通信控制器和CPU),并負責仲裁優(yōu)先權。由于在進(jìn)行數據通信時(shí),允許主機CPU訪(fǎng)問(wèn)本卡SRAM,且主機對其中某一路發(fā)控制命令時(shí),不影響其余三路通信,這樣將會(huì )使主機CPU與本卡DMA竟爭本卡總線(xiàn)控制權。而總線(xiàn)上沒(méi)有給出主機CPU指令排隊狀態(tài)序列,故不能直接設計多主竟爭,因而在本卡總線(xiàn)上用門(mén)陣列設計了一個(gè)狀態(tài)機,不斷地監視總線(xiàn)爭用情況,完成本卡總線(xiàn)竟爭、仲裁功能。完成HDLC規程的串行通信的器件是INTEL8274多規程串行控制器,它能完成2個(gè)獨立的串行接收/發(fā)送全雙工通信。為了使4個(gè)信道在一幀數據的發(fā)送或接收過(guò)程中,主機不干預,故將發(fā)送的一幀數據在發(fā)送開(kāi)始前由CPU用批命令放入卡上的SRAM中;同樣,在接收過(guò)程中,卡上DMA將接收到的數據放入SRAM中,等一幀接收完成后,再用批命令取出,放入系統存儲器中?ㄉ蟂RAM不占用主機內存地址,采用I/0映像,該適配器插入主機之后,主機通過(guò)系統I/O地址對其訪(fǎng)問(wèn),這由地址產(chǎn)生器完成?偩(xiàn)接口包括數據收發(fā)器,數據開(kāi)關(guān)電路,讀、寫(xiě)及中斷等控制電路,地址譯碼等。波特率產(chǎn)生器提供了一個(gè)可編程的時(shí)鐘信號發(fā)生器,用戶(hù)可自行設置通信速率,供工作于內時(shí)鐘方式時(shí)使用。接口電路提供符合RS-232/CCITT V.24和RS-422A標準的接口信號。
3通信流程設計

如果要發(fā)送一幀數據,CPU用批命令將數據放到本卡SRAM中,然后設置相應的發(fā)送DMA通道。DMA通道是非自動(dòng)重裝方式,啟動(dòng)8274控制器發(fā)送,然后CPU就不需要管理,由卡上硬件自動(dòng)發(fā)送。
如果需要接收數據,啟動(dòng)接收通道。接收通路自動(dòng)搜索輸入信號,搜索到數據幀時(shí),由卡上DMA控制器來(lái)管理,將接收的數據放入本卡SRAM中,并向CPU請求中斷,讀出數據。
4 總線(xiàn)竟爭設計
由于同時(shí)可進(jìn)行四路通信,且CPU可隨時(shí)對某一路發(fā)控制命令或訪(fǎng)問(wèn)卡上SRAM存儲器,就將出現CPU與本卡主設備DMA爭用本卡總線(xiàn)的狀況。由于ISA總線(xiàn)沒(méi)能給出CPU指令排隊狀態(tài)序列,這給總線(xiàn)仲裁帶來(lái)了困難,而本卡的總線(xiàn)竟爭、仲裁是由可編程邏輯器件設計的狀態(tài)機來(lái)完成的。狀態(tài)機使用一個(gè)4MHz信號作為時(shí)鐘,共設3種狀態(tài):
① CPU控制狀態(tài)。
② DMA控制狀態(tài)。
③ 空閑狀態(tài), CPU及DMA均未能得到控制權。
當狀態(tài)機檢測到無(wú)CPU及DMA申請總線(xiàn)使用權時(shí),就進(jìn)入空閑狀態(tài),而一旦CPU或DMA請求總線(xiàn),狀態(tài)機立即將總線(xiàn)使用權交給CPU或DMA。如果正在CPU控制狀態(tài)期間,DMA申請總線(xiàn)使用權,狀態(tài)機仍然判定CPU控制總線(xiàn),讓DMA處于等待,直到檢測CPU指令完成,狀態(tài)機才轉為DMA控制狀態(tài)。如果在DMA控制狀態(tài)時(shí),CPU申請總線(xiàn)使用權,狀態(tài)機仍然判定DMA控制總線(xiàn),讓CPU處于等待,直至DMA字節傳送完,狀態(tài)機轉為CPU控制狀態(tài)。CPU及DMA對總線(xiàn)的使用權是單個(gè)指令或字節傳送,不設置總線(xiàn)封鎖,因而CPU、DMA可頻繁交換使用權,不會(huì )出現等待時(shí)間過(guò)長(cháng)的現象。
通信卡的驅動(dòng)程序設計
1 設備驅動(dòng)程序的I/O模型
通信卡的驅動(dòng)程序是利用WindowsXP的DDK軟件開(kāi)發(fā)的標準的核心態(tài)設備驅動(dòng)程序。它使用統一的“文件”形式,用戶(hù)可以通過(guò)代表通信卡設備的文件名,在WIN32子系統中用文件操作函數來(lái)訪(fǎng)問(wèn)。該設備驅動(dòng)和程序可以根據用戶(hù)的需要,設置為自動(dòng)加載,或手動(dòng)加載,也可以動(dòng)態(tài)的加載該驅動(dòng)程序。通信卡的驅動(dòng)程序設計成為支持同步I/O模型,也可以為異步I/O模型。
2 發(fā)送數據I/O例程設計
在用戶(hù)態(tài)提交發(fā)送任務(wù)到核心態(tài),由I/O管理程序負責調用驅動(dòng)程序,驅動(dòng)程序發(fā)送IRP交給硬件,假若當前發(fā)送器不忙,則具體的發(fā)送操作全部由發(fā)送器自行完成,而驅動(dòng)程序則返回已經(jīng)一個(gè)本幀可以發(fā)送的標志。具體的發(fā)送完成結果則可以在發(fā)送任務(wù)完成后查詢(xún)得到?墒,如果程序向當前設備發(fā)送器提交發(fā)送任務(wù)時(shí),該發(fā)送器正在處理上一幀,那么則有兩種方法處理。
① 立即方式:立即返回一個(gè)錯誤,當前設備忙,不能發(fā)送。
②阻塞方式:I/O管理器程序會(huì )調度相應的異步處理例程,將當前的發(fā)送任務(wù)放進(jìn)任務(wù)隊列中,返回一個(gè)標志:I/O掛起,當前設備忙,發(fā)送任務(wù)提交任務(wù)隊列。驅動(dòng)程序會(huì )在發(fā)送器空閑時(shí),提交任務(wù)隊列中的發(fā)送任務(wù)給發(fā)送器。完成發(fā)送任務(wù)后,將相關(guān)文件句柄設為有信號狀態(tài),通知本次發(fā)送任務(wù)完成。
3接收數據I/O例程
接收數據例程采用客戶(hù)/服務(wù)器的模式設計。由于用戶(hù)的接收請求和硬件的接收并不是同步的,所以在設計中,為避免丟失數據,考慮創(chuàng )造一個(gè)專(zhuān)門(mén)的接收線(xiàn)程。這樣,同步用戶(hù)請求、接收線(xiàn)程、硬件層之間的通信就必須仔細地設計。圖2示意了用戶(hù)態(tài)接收請求、接收線(xiàn)程以及硬件層之間的通信同步。

圖2 用戶(hù)態(tài)接收請求、接收線(xiàn)程與硬件層之間的通信同步

① 硬件層與接收線(xiàn)程之間通信
硬件層與接收線(xiàn)程之間通信的同步是通過(guò)同步事件對象來(lái)實(shí)現的。同步事件對象通常處于無(wú)信號狀態(tài),只有當成功地接收到一幀時(shí),才將該事件置為有信號狀態(tài)。接收線(xiàn)長(cháng)久等待同步事件對象,在沒(méi)有收到數據時(shí),因同步事件對象處于無(wú)信號狀態(tài)而阻塞。當硬件檢測到數據時(shí),實(shí)時(shí)中斷服務(wù)程序負責將同步事件對象置為有信號狀態(tài),接收線(xiàn)程就會(huì )釋放阻塞。將通信卡SRAM上的接收數據讀進(jìn)接收線(xiàn)程緩沖區隊列,然后將同步事件對象置為無(wú)信號狀態(tài),接收線(xiàn)程再次阻塞,等待接收下一幀數據。
② 用戶(hù)層和接收線(xiàn)程之間的通信
當用戶(hù)提交接收任務(wù)時(shí),由驅動(dòng)程序的調度程序讀取接收線(xiàn)程的緩沖區隊列,并將標志置為“空”,同時(shí)將緩沖隊列事件置為無(wú)信號狀態(tài),并返回,如果緩沖區是空,則
● 立即方式:立即返回無(wú)數據。
● 阻塞方式:阻塞直到有數據隊列進(jìn)入。接收隊列的每個(gè)緩沖區都對應一個(gè)通知事件,如果接收線(xiàn)程將SRAM中的數據讀進(jìn)隊列,就將相應的通知事件置為有信號狀態(tài),用戶(hù)請求就等待該通知事件,只要有數據在隊列中,就讀取返回,否則被阻塞。
4 硬中斷服務(wù)程序設計
通信卡在全雙工的通信中具有實(shí)時(shí)性,而且在較高的波特率,硬中斷非常多。為了防止高優(yōu)先級中斷過(guò)多地搶占CPU時(shí)間,設計中采用了實(shí)時(shí)中斷服務(wù)程序和延遲過(guò)程調用的方法。
在WindowsXP系統中,每個(gè)內核函數和過(guò)程都運行于特定的優(yōu)先級。較高優(yōu)先級的函數或事件可以搶占較低優(yōu)先級,反之則不然。實(shí)時(shí)中斷服務(wù)程序ISR運行于DIRQL級,具有較高的優(yōu)先級,它只能被更高級的硬中斷所搶占,不會(huì )對同級或較低優(yōu)先級的硬中斷的響應。所以,在實(shí)時(shí)中斷服務(wù)程序中,只做盡量少的必須工作,即讀出中斷向量,而將大量的數據傳送及處理等工作交給延遲過(guò)程DPC去完成。因為DPC過(guò)程運行于DISPATCH_LEVEL級,是相對較低的優(yōu)先級,它可以被任何級的硬中斷所搶占。這樣,既保證了硬中斷的及時(shí)響應,又提高了程序的性能。
5 驅動(dòng)程序入口例程
WindowsXP為每個(gè)核心態(tài)的驅動(dòng)程序提供了一個(gè)默認的標準入口點(diǎn)DriverEntry()。設計中,考慮到該例程運行于PASSIVE_LEVE級,系統只運行該例程一次就拋棄了,所以在驅動(dòng)程序中用到的重要數據、對象等都不能保存在DriverEntry()例程中,必須在初始化過(guò)程中分配一塊NoPaged內存來(lái)保存。通信卡的驅動(dòng)程序的DriverEntry()例程主要完成如下功能。
讀取Registry的硬件配置信息;聲明I/O地址、中斷等資源;創(chuàng )建代表通信卡的設備名MPSC,該名字對WIN32子系統是可見(jiàn)的;設置調度例程入口點(diǎn);分配一塊NoPaged的內存,存儲重要信息;連接硬中斷,設置中斷服務(wù)程序;初始化線(xiàn)程、事件、信號燈、DPC等內核對象;返回狀態(tài)STATUS_SUCCESS。
如果在以上過(guò)程中遇到錯誤,則需要做以下工作:斷開(kāi)硬中斷;釋放硬件資源;將相關(guān)的錯誤信息打包,并記錄;返回錯誤信息。
6 設計驅動(dòng)程序中需要注意的問(wèn)題
于通信卡在應用中具有一定的實(shí)時(shí)性,為了克服中斷的不確定性,提高系統的性能,開(kāi)發(fā)了WindowsXP系統所有驅動(dòng)程序中最難的異步驅動(dòng)程序。在系統的內核開(kāi)發(fā),異步模型I/O操作中,內核對象的同步十分復雜,細微的差錯都會(huì )導致系統徹底崩潰。在設計驅動(dòng)程序中需要注意以下問(wèn)題。
● 在程序中用到的內核對象:事件、信號燈、線(xiàn)程以及轉鎖等,都必須將其存儲在Nopaged內存中,否則,會(huì )造成系統崩潰。
● 在DPC例程中,如果要訪(fǎng)問(wèn)中斷服務(wù)程序ISR程序中用到端口地址,一定要將訪(fǎng)問(wèn)語(yǔ)句放在系統提供的同步例程中,這是因為當DPC例程訪(fǎng)問(wèn)該端口時(shí),有可能被優(yōu)先級高的ISR例程所搶占,而造成數據錯誤。
● 驅動(dòng)程序一定不要訪(fǎng)問(wèn)WIN32子系統的運行庫函數。
本文地址:http://selenalain.com/thread-2640-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页