日日夜夜撸啊撸,欧美韩国日本,日本人配种xxxx视频,在线免播放器高清观看

驅(qū)動程序設(shè)計(jì)大全11篇

時間:2022-07-09 12:32:29

緒論:寫作既是個人情感的抒發(fā),也是對學(xué)術(shù)真理的探索,歡迎閱讀由發(fā)表云整理的11篇驅(qū)動程序設(shè)計(jì)范文,希望它們能為您的寫作提供參考和啟發(fā)。

篇(1)

中圖分類號:TP316文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2011)22-5418-02

Design of USB Device Drver Program on linux

SUN Yong-gang, JIAO Li-fei

(College of Science, GuiZhou University, Guiyang 550025, China)

Abstract:USB interface, with its efficient, reliable and widely is used in various embedded products. However, existing data on linux operating system, more studies USB Host, USB Device driver rarely is done. Therefore this paperthrough a simpleintroduction of USB protocol, as well as analysis of USB driver architecture about linux, is about an design of USB Device driver of linux systemfor embedded microprocessor S3C2440 .

Key words: USB agreement; linux driver;USB device driver

嵌入式產(chǎn)品通過的USB接口品可以很方便與PC的USB進(jìn)行通信以完成數(shù)據(jù)的傳輸與交互。ARM嵌入式處理器性以其性能高、功耗低而被廣泛地應(yīng)用于消費(fèi)電子、工業(yè)控制等眾多領(lǐng)域。以ARM內(nèi)核為核心集成了USB功能的處理器使得產(chǎn)品更簡潔、更靈活、更方便。S3C2440集成了ARM920T內(nèi)核,帶MMU功能,可運(yùn)行l(wèi)inux操作系統(tǒng),同時帶有兩個USB Host一個USB Device控制器,因此在此基礎(chǔ)上完成Linux 下的USB Device驅(qū)動程序有著重要的意義。本文是以此處理器為核心的嵌入式智能終端的Linux下的USB Device驅(qū)動程序設(shè)計(jì)

1 USB體系結(jié)構(gòu)及協(xié)議

1.1 USB硬件系統(tǒng)結(jié)構(gòu)

USB接口是由+5V電源線、電源地線、信號線D+、信號線D-四根電纜線組成接口。其中+5V電源是向設(shè)備提供電源,信號線作用是傳輸數(shù)據(jù), 為了提高信號傳輸?shù)目垢蓴_能力這兩根數(shù)據(jù)線采用差分傳輸。主機(jī)可以通過D+和D-線的電平高低來確設(shè)備是高速設(shè)備還是全速設(shè)備。

1.2 USB數(shù)據(jù)傳輸通道

USB主機(jī)與USB設(shè)備由很多端點(diǎn)構(gòu)成,它們之間通過端點(diǎn)進(jìn)行通訊。通過設(shè)置與些端點(diǎn)相對應(yīng)的寄存器,可以為這些端點(diǎn)分配唯一的地址(由端點(diǎn)號和傳輸方向組成)。USB總線支持四種傳輸類型,他們分別是控制傳輸、同步傳輸、中斷傳輸、批量傳輸。端點(diǎn)O只支持控制傳輸。

1.3 USB總線枚舉

USB總線枚舉就是當(dāng)USB設(shè)備連接到USB主機(jī)時,主機(jī)通過缺省管道以控制傳輸方式來獲取USB設(shè)備發(fā)來的設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符信息,并根據(jù)這些描述相關(guān)內(nèi)容對USB設(shè)備進(jìn)行相應(yīng)的配置。

2 Linux USB 驅(qū)動程序

在Linux系統(tǒng)中,USB驅(qū)動程序可以分為USB Host驅(qū)動程序和USB Device驅(qū)動程序。Linux USB Host驅(qū)動程序和USB Device驅(qū)動程序總體架構(gòu)如圖1所示。

從圖1可以知,在Linux USB Host中,USB控制器驅(qū)動是運(yùn)行在USB 控制器硬件上面的的驅(qū)動動程序。該驅(qū)動實(shí)現(xiàn)了對USB 控制器硬件進(jìn)行控制,一般稱為USB固件驅(qū)動程序。USB設(shè)備驅(qū)動處于USB驅(qū)動的最頂層,它主要實(shí)現(xiàn)USB設(shè)備如何與主機(jī)進(jìn)行通信。處在USB主機(jī)控制器驅(qū)動與USB設(shè)備驅(qū)動之間的是USB核心層,起到驅(qū)動程序橋梁的作用,該核心層為USB主機(jī)USB主機(jī)控制器驅(qū)動提供編程接口。

Linux系統(tǒng)中, USB Device驅(qū)動分為UDC驅(qū)動、Gadget API、Gadget驅(qū)動三個層次結(jié)構(gòu)。UDC驅(qū)動處USB Device控制器硬件之上,該驅(qū)動程序控制USB控制器硬件工作,同時向上層提供操作USB控制器硬件的回調(diào)函數(shù)。處在中間層的是Gadget API層,該API向下層和上層提供統(tǒng)一的編程接函數(shù)的封裝。Gadget驅(qū)動程序完成設(shè)備功能的實(shí)現(xiàn)。通過編寫不同Gadget驅(qū)動程序可以使設(shè)備具有不同的功能。

3 S3C2440 USB Device驅(qū)動

3.1 S3C2440 USB接口特性

S3C2440嵌入式微處理器集成了一個設(shè)備控制器。該設(shè)備控制器具有以下特征:

1) 完全兼容USB1.1的協(xié)議。設(shè)備全速運(yùn)行時可達(dá)到了12Mb/s。

2) 支持控制、中斷和批量傳輸,批量傳輸支持DMA接口。

3) 自帶5個的端點(diǎn)。端點(diǎn)EP0帶有16byte的FIFO,該端點(diǎn)為雙向的控制端點(diǎn),其余4個端點(diǎn)都帶有128字節(jié)輸入/輸出的FIFO(異步雙端口RAM)的,支持中斷或DMA批量傳輸。

3.2 S3C2440 USB Device驅(qū)動程序設(shè)計(jì)

一個完整的S3C2440 USB Device驅(qū)動程序由S3C2440_UDA驅(qū)動和gadget驅(qū)動兩部分構(gòu)成。S3C2440_UDA驅(qū)動是用來控制S3C2440的USB Device硬件控制器器,并把對硬件控制操作抽象為函數(shù)接口供上層調(diào)用。USB gedget驅(qū)動程序運(yùn)行在S3C2440_UDA驅(qū)動程序之上的,不同的gedget驅(qū)動程序使該設(shè)備具有不同的功能。

Linux gadget驅(qū)動程序主要涉及到2個重要的結(jié)構(gòu)體usb_gadget_driver和struct file_operations結(jié)構(gòu)。其中usb_gadget_driver結(jié)構(gòu)體包括bind、setup、disconnect等一些函數(shù)。Linux Gadget提供usb_gadget_register_driver函數(shù)對Gaget驅(qū)動進(jìn)行注冊。當(dāng)Gadget驅(qū)動被注冊后,Linux內(nèi)核就會調(diào)用結(jié)構(gòu)體usb_gadget_driver中的bind函數(shù)把Gadget驅(qū)動與UDA驅(qū)動進(jìn)行綁定,這樣就可以在Gadget驅(qū)動中使用UDA提供的統(tǒng)一接口函數(shù)。

bind函數(shù)中需要完成以下工作:

1) 使用usb_ep_autoconfig函數(shù)申請以后用到的傳輸端點(diǎn)。

2) 通過usb_ep_alloc_request函數(shù)為Gadget驅(qū)動分配一個請求。

3) 通過調(diào)用register_chrdev_region注冊設(shè)備驅(qū)動程序。

Bind函數(shù)完成這后當(dāng)有USB Host 向USB設(shè)備發(fā)出請求時,Linux系統(tǒng)將調(diào)用setup函數(shù)來響應(yīng)請求。Setup函數(shù)把設(shè)備的設(shè)備描述符、配置描述符、接口描述符以及以后需要使用的幾個端點(diǎn)描述符發(fā)送給USB Host,這些配置信息的發(fā)送都是通過usb_ep_queue函數(shù)來完的。

struct file_operations結(jié)構(gòu)包含有open、read、write等函數(shù)。通過該結(jié)構(gòu)體定義的變量被register_chrdev_region函數(shù)注冊后該設(shè)備就可以像字符設(shè)備那樣使有了。該結(jié)構(gòu)中的一些函數(shù)完成的功能如下:

1) open函數(shù)通過init_waitqueue_head完成等待隊(duì)列初始化。

2) read函數(shù)通過alloc_ep_req函數(shù)分配一個讀請求變量,并為該變量中的complete設(shè)置一個請求完成函數(shù),調(diào)用usb_ep_queue函數(shù)向端點(diǎn)提交I/O讀請求。當(dāng)內(nèi)核從USB Device讀到數(shù)據(jù)時就會調(diào)有剛才的完成函數(shù)。在完成讀數(shù)據(jù)之前可以通過add_wait_queue和schedule()函數(shù)讓進(jìn)程掛起,在完成函數(shù)中喚醒掛起的進(jìn)程。

3) write函數(shù)通過alloc_ep_req函數(shù)分配一個寫請求變量,并為該變量中的complete設(shè)置一個請求,調(diào)用usb_ep_queue函數(shù)向端點(diǎn)提交I/O寫請求。當(dāng)內(nèi)核向USB Device寫完數(shù)據(jù)時就會調(diào)有剛才的完成函數(shù)。在完成寫數(shù)據(jù)之前可以通過add_wait_queue和chedule()函數(shù)讓進(jìn)程掛起,在完成函數(shù)中喚醒掛起的進(jìn)程。

至此整個驅(qū)動程序就設(shè)計(jì)完成了,圖2為USB Host 與 USB Device 通信測試效果。

4 結(jié)束語

USB Device 為眾多電子產(chǎn)品提供了一個與PC信息交互的更好的方案。本文通過對USB協(xié)議介紹,以及對Linux下USB驅(qū)動程序進(jìn)行分析,在此基礎(chǔ)上實(shí)現(xiàn)了USB Device驅(qū)動程序進(jìn)行設(shè)計(jì)。實(shí)踐表明該設(shè)計(jì)是可行的。

參考文獻(xiàn):

[1] 馮國進(jìn).嵌入式Linux驅(qū)動程序設(shè)計(jì)從入門到精通[M]北京:清華大學(xué)出版社,2008.

[2] 薛園園.USB應(yīng)用開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2007.

[3] 劉少峰,韋克平.USB軟件系統(tǒng)的開發(fā)[J].計(jì)算機(jī)應(yīng)用研究,2002,19(30).

篇(2)

中圖分類號: TN964?34 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2013)18?0051?04

0 引 言

設(shè)備互聯(lián)(PCI)總線是一種先進(jìn)的高性能局部總線,可同時支持多組設(shè)備[1]。CPCI總線應(yīng)用于工業(yè)和嵌入式領(lǐng)域,其規(guī)范改進(jìn)自PCI規(guī)范,CPCI規(guī)范在電氣方面兼容PCI規(guī)范,只是在封裝結(jié)構(gòu)上進(jìn)行了加強(qiáng),CPCI板的封裝結(jié)構(gòu)基于IEC 60297?3,IEC 60297?4以及IEEE 1101.10定義的歐式板卡外形[2]。既然電氣特性上兼容PCI規(guī)范,因此CPCI驅(qū)動程序的設(shè)計(jì)本質(zhì)就是PCI驅(qū)動程序設(shè)計(jì)。

當(dāng)前Windows環(huán)境下用于PCI設(shè)備驅(qū)動開發(fā)的工具主要是DDK,DriverStudio以及WinDriver。前兩者功能強(qiáng)大,但是開發(fā)者需要熟知操作系統(tǒng)的體系結(jié)構(gòu)、匯編語言和設(shè)備驅(qū)動程序結(jié)構(gòu)體系方法,還需要具備豐富的驅(qū)動程序開發(fā)經(jīng)驗(yàn),否則可能造成軟件不穩(wěn)定甚至系統(tǒng)崩潰,另外前兩者開發(fā)周期長。而Jungo公司開發(fā)的WinDriver改變了傳統(tǒng)的驅(qū)動程序開發(fā)方法,其整個驅(qū)動程序中的所有函數(shù)都是工作在用戶態(tài)下,使開發(fā)者不需要掌握前兩者所需的預(yù)備知識就可以開發(fā)出與之相媲美的程序[3]。

為了實(shí)現(xiàn)在主控計(jì)算機(jī)和信號處理板之間快速通信,采用了CPCI并行總線技術(shù),信號處理板采用內(nèi)嵌PCI模塊的DSP6416芯片。軟件開發(fā)基于Windows平臺和VC++6.0編程環(huán)境,為了便于應(yīng)用程序調(diào)用驅(qū)動程序,按照模塊化的軟件設(shè)計(jì)思想,驅(qū)動程序以DLL動態(tài)鏈接庫的形式封裝。為提高工作效率、縮短開發(fā)周期,開發(fā)工具選用WinDriver。

1 WinDriver簡介

WinDriver是一套設(shè)備驅(qū)動程序開發(fā)組件,它的目的就是方便程序員快速開發(fā)出PCI,ISA,CPCI,PCIE等設(shè)備的Windows驅(qū)動程序[4]。

1.1 WinDriver原理

WinDriver的體系架構(gòu)分為兩種模式:用戶模式和內(nèi)核模式。對硬件進(jìn)行操作時,開發(fā)者應(yīng)用程序調(diào)用WinDriver用戶模式的庫函數(shù),用戶模式的庫函數(shù)再調(diào)用WinDriver內(nèi)核,WinDriver內(nèi)核再調(diào)用操作系統(tǒng)底層函數(shù)實(shí)現(xiàn)對硬件的最終訪問。其與硬件模板、用戶驅(qū)動程序、用戶應(yīng)用程序之間的關(guān)系即體系架構(gòu)見圖1[5?6]。對于某些在用戶模式下不能實(shí)現(xiàn)的高性能硬件驅(qū)動程序,可通過WinDriver的內(nèi)核插件功能實(shí)現(xiàn):在用戶模式下完成編程和調(diào)試,不做任何修改,直接將該高性能要求的程序模塊植入內(nèi)核插件,WinDriver即從內(nèi)核模式下調(diào)用該程序模塊。

1.2 WinDriver特點(diǎn)

作為一款實(shí)用的驅(qū)動程序開發(fā)工具包,WinDriver的主要優(yōu)點(diǎn)和特征如下:

(1)通過內(nèi)核插件功能(Kernel PlugIn)能夠?qū)崿F(xiàn)用戶模式的易用和內(nèi)核模式的高性能;

(2)友好的驅(qū)動向?qū)г试S不寫一行代碼即可實(shí)現(xiàn)硬件診斷;

(3)支持所有PCI/PCMCIA/CardBus/ISA/EISA/CompactPCI/PCIExpress設(shè)備,與制造商無關(guān);

(4)可以利用常見的軟件開發(fā)平臺包括MSDEV/VisualC/C++,Borland Delphi,Visual Basic6.0等;

(5)開發(fā)者不需要知道DDK,ETK,DDI及任何其他系統(tǒng)層面的編程知識;

(6)支持I/O、DMA中斷處理和直接訪問板卡映射的存儲器;

(7)支持多CPU及多PCI總線平臺。

1.3 用WinDriver開發(fā)驅(qū)動程序

利用WinDriver開發(fā)驅(qū)動程序有2種方式:通過驅(qū)動程序向?qū)沈?qū)動程序框架,再對框架程序進(jìn)行修改和調(diào)試;直接編寫驅(qū)動程序。

通過驅(qū)動程序向?qū)ч_發(fā)步驟:板卡檢測、診斷;生成驅(qū)動程序框架;調(diào)試、編譯驅(qū)動程序。

直接編寫代碼方式步驟:

(1)包含WinDriver相關(guān)的頭文件;

(2)WinDriver庫函數(shù)調(diào)用,WinDriver庫函數(shù)典型調(diào)用流程見圖2[7]。

2 CPCI信號處理板卡驅(qū)動程序設(shè)計(jì)

2.1 硬件環(huán)境

實(shí)現(xiàn)PCI總線協(xié)議一般有2種方法:一是用FPGA設(shè)計(jì)實(shí)現(xiàn),由于PCI協(xié)議比較復(fù)雜,實(shí)現(xiàn)較困難;二是采用專業(yè)PCI總線控制芯片,如AMCC公司的S5933、PLX公司的PCI 9080等通用PCI接口芯片[8]。本信號處理板采用第二種方法,選用自帶PCI接口模塊的DSP6416,主控計(jì)算機(jī)上的應(yīng)用程序通過驅(qū)動程序?qū)⒖刂泼钭种鲃訉懭隓SP內(nèi)存,實(shí)現(xiàn)主控計(jì)算機(jī)對信號處理板的控制;信號處理板結(jié)果數(shù)據(jù)處理完畢后,向主控計(jì)算機(jī)發(fā)中斷,驅(qū)動程序響應(yīng)該中斷,并主動讀取指定DSP內(nèi)存獲取結(jié)果數(shù)據(jù)。

結(jié)果數(shù)據(jù)和模塊狀態(tài)信息存入L2緩存單元,主控計(jì)算機(jī)下發(fā)的命令字也寫入L2緩存單元。結(jié)果數(shù)據(jù)緩存劃分為大小各為28 KB的Block1和Block2兩塊區(qū)域;模塊狀態(tài)信息緩存大小為24字節(jié);控制命令緩存大小為1 B。DSP中與PCI操作有關(guān)的緩存定義見表1。

表1 DSP中與PCI操作有關(guān)的緩存定義

當(dāng)Block1緩存填滿后,新的結(jié)果數(shù)據(jù)存入Block2緩存,同時DSP給主控計(jì)算機(jī)發(fā)PCI中斷,主控計(jì)算機(jī)通過PCI接口讀取Block1;同理當(dāng)Block2填滿后,新的結(jié)果數(shù)據(jù)存入Block1緩存,主控計(jì)算機(jī)通過PCI讀取Block2。Block1和Block2緩存交替接收結(jié)果數(shù)據(jù)。

2.2 CPCI驅(qū)動程序DLL接口設(shè)計(jì)

為了便于應(yīng)用程序訪問驅(qū)動程序,按照模塊化的軟件設(shè)計(jì)思想,驅(qū)動程序以DLL動態(tài)鏈接庫的形式進(jìn)行封裝,應(yīng)用程序通過與驅(qū)動程序DLL之間的接口來訪問信號處理模塊的板上資源,下發(fā)控制命令、獲取結(jié)果數(shù)據(jù)。主要接口及其功能描述如下:

(1)DSP6416DLL_Init(CWnd* pMainWnd):打開并注冊WDC庫、打開設(shè)備,初始化中斷;

(2)DSP6416DLL_SendCmd(BYTE BCommand):主控計(jì)算機(jī)中的控制命令數(shù)據(jù)寫入DSP中命令存儲區(qū);

(3)DSP6416DLL_ReadState(BYTE *StateData):從DSP的狀態(tài)存儲區(qū)讀取信號處理板的狀態(tài)數(shù)據(jù);

(4)DSP6416DLL_ReadResult(BYTE *ResultData):從DSP的Block1或Block2數(shù)據(jù)緩存區(qū)讀取結(jié)果數(shù)據(jù);

(5)DSP6416DLL_Exit():關(guān)閉中斷,關(guān)閉設(shè)備,關(guān)閉WDC庫。

2.3 CPCI驅(qū)動程序?qū)崿F(xiàn)

在硬件環(huán)境和接口、驅(qū)動程序封裝形式及其軟件接口確定后,剩下的工作就是CPCI驅(qū)動程序的實(shí)現(xiàn)。該工作主要內(nèi)容為驅(qū)動程序DLL各接口函數(shù)的編碼實(shí)現(xiàn)和WinDriver庫函數(shù)調(diào)用。

2.3.1 文件包含

包含與WinDriver相關(guān)的頭文件:windrvr.h,windrvr_int_thread.h,wdc_lib.h。

2.3.2 驅(qū)動程序初始化

驅(qū)動程序初始化主要工作和步驟包括:打開WinDriver,WinDriver授權(quán)、版本號檢查、板卡檢測、板卡信息獲取、模塊配置、板卡注冊和PCI中斷使能,驅(qū)動程序初始化流程見圖3。

2.3.3 驅(qū)動程序向DSP內(nèi)存寫數(shù)據(jù)

DSP6416的PCI接口支持四種類型的數(shù)據(jù)交換[9?10]:從模式寫,外部PCI主設(shè)備通過PCI接口寫數(shù)據(jù)到DSP;從模式讀,外部PCI主設(shè)備通過PCI接口讀取DSP中的數(shù)據(jù);主模式寫,DSP主設(shè)備通過PCI接口向外部設(shè)備寫數(shù)據(jù);主模式讀,DSP主設(shè)備通過PCI接口向外部設(shè)備讀數(shù)據(jù)。

4 結(jié) 語

通過實(shí)際應(yīng)用,發(fā)現(xiàn)用WinDriver開發(fā)的本驅(qū)動程序運(yùn)行穩(wěn)定可靠,達(dá)到了主控計(jì)算機(jī)對信號處理板實(shí)時控制,特別是信號處理板中大容量數(shù)據(jù)實(shí)時上傳的目的。由于系統(tǒng)方案確定了CPCI并行總線作為通信手段,硬件設(shè)計(jì)時采用了自帶主從式PCI接口模塊的DSP6416芯片,驅(qū)動開發(fā)工具選擇了快速高效的WinDriver工具包,以及對驅(qū)動程序形態(tài)進(jìn)行DLL封裝,本驅(qū)動程序從需求設(shè)計(jì)到完成編碼和調(diào)試不到一個月的時間,在保證軟件質(zhì)量的同時,縮短了研制周期,提高了開發(fā)效率。

參考文獻(xiàn)

[1] 李貴山,戚德虎.PCI局部總線開發(fā)者指南[M].西安:西安電子科技大學(xué)出版社,1997.

[2] PICMG. Compact PCI core specification PICMG 2.0 R3.0 [R]. [S.l.]: PICMG, 1999.

[3] 王磊,魯新平,李吉成.WinDriver在開發(fā)基于PLX9056芯片的PCI設(shè)備驅(qū)動程序中的應(yīng)用[J].現(xiàn)代電子技術(shù),2006,29(18):77?79.

[4] 李靜,趙保軍.基于TMS320C6416內(nèi)嵌PCI設(shè)備驅(qū)動程序開發(fā)[J].微機(jī)發(fā)展,2005,15(10):135?137.

[5] Jungo Ltd. WinDriver PCI/ISA/CardBus v8.02 user’s guide [R]. US: Jungo Ltd, 2005.

[6] 簡育華.基于WinDriver的 PCI驅(qū)動程序開發(fā)[J].火控雷達(dá)技術(shù),2011,40(1):68?70.

[7] Jungo Ltd. WinDriver PCI/PCMCIA/ISA v8.02 Low?Level API Reference[R]. US: Jungo Ltd, 2005.

篇(3)

近年來電力行業(yè)為了快速部署變電站,采用了建造整體變電所的方法:在生產(chǎn)基地將變電站的內(nèi)部設(shè)備安裝、調(diào)試完成,只留下與外界的接口,整體運(yùn)到變電站所在地后進(jìn)行安裝和簡單調(diào)試即可投入運(yùn)行。其內(nèi)部設(shè)備通過CAN總線進(jìn)行通信,系統(tǒng)原有的監(jiān)控軟件基于DOS系統(tǒng),維護(hù)調(diào)試比較困難,因此想要尋求更方便、友好的系統(tǒng)支持。經(jīng)過比較,嵌入式操作系統(tǒng)市場上風(fēng)頭正勁的Windows CE .NET成為最終選擇。微軟的最新產(chǎn)品Windows CE.NET提供了端對端的開發(fā)、調(diào)試手段,可以不拆卸設(shè)備的情況下通過Telnet登錄到WindowsCE上進(jìn)行調(diào)試和維護(hù),其系統(tǒng)本身為嵌入式市場進(jìn)行重新設(shè)計(jì),包括創(chuàng)建一個基于WindowsCE的定制設(shè)備所需的一切。這樣就需要將原來DOS下的程序移植到WindowsCE.NET下,但是各個硬件廠商目前還沒有提供CAN通信卡在Windows CE.NET下的驅(qū)動,所以開發(fā)Windows CE.NET下的CAN卡驅(qū)動成為項(xiàng)目推行中的關(guān)鍵一環(huán)。

本文主要針對研華的雙口CAN卡PCM3680進(jìn)行分析,介紹在WindowsCE.ENT系統(tǒng)下進(jìn)行底層設(shè)備驅(qū)動開發(fā)的方法并提供CAN通信的實(shí)例。

1 CAN總線通信協(xié)議及CAN通信卡介紹

CAN總線是德國Bosch公司20世紀(jì)80年代初為解決現(xiàn)代汽車中眾多的控制與測試儀器之間的數(shù)據(jù)交換而開的一種串行數(shù)據(jù)通信協(xié)議。它是一種多主總線,廢除了傳統(tǒng)的站地址編碼,而代之以對通信數(shù)據(jù)塊進(jìn)行編碼。這種方法使網(wǎng)絡(luò)內(nèi)節(jié)點(diǎn)個數(shù)在理論上不受限制,擴(kuò)展格式中的29位的標(biāo)識碼便可以定義2 29個不同的數(shù)據(jù)塊。

在本項(xiàng)目中使用的是研華的PCM3680,這是一塊嵌入式PC104的雙口CAN總線通信卡;CAN控制器采用Philips的獨(dú)立CAN控制器SJA1000芯片;CAN收發(fā)器采用Philips的P82C250,可以同時操作兩個CAN網(wǎng)絡(luò),提供高達(dá)1Mb/s的傳輸速度。PCM3680支持很寬的中斷范圍:中斷3、4、5、6、7、9、10、11、12、15,同時1000V的光電隔離提供系統(tǒng)高可靠性。在CAN卡通信中,要用到CAN控制器中的很多寄存器,各個寄存器的含義和作用可以參考控制芯片的說明書。圖1列出驅(qū)動程序設(shè)計(jì)中用到最主要的寄存器結(jié)構(gòu)。

2 CAN卡驅(qū)動底層函數(shù)設(shè)計(jì)

本方案設(shè)計(jì)CAN驅(qū)動是放在Windows CE操作系統(tǒng)的內(nèi)核下層,位于OEM adaptation layer(OAL)層的一個真正的驅(qū)動,而不是在主程序中的串口操作。在Windows CE的設(shè)備管理器可以看到CAN1和CAN2兩個端口,并且可以查看其工作的正常與否和對其進(jìn)行配置。如:中斷號和I/O地址。

2.1 CAN卡寄存器讀寫函數(shù)

CAN卡的通信是通過操作CAN卡上的CAN控制器進(jìn)行的。在CAN控制器中有很多寄存器,如控制寄存器、命令寄存器、狀態(tài)寄存器、中斷寄存器等,通過讀寫這些寄存器中的命令狀態(tài)字可以檢測和控制CAN卡的行為。在Windows CE.NET下,通過調(diào)用DOK中的API函數(shù)HalTranslateBusAddress,將CAN卡分配的物理地址映射為邏輯地址。這樣各個寄存器對應(yīng)的就是CAN卡基地址的偏移地址,因此,對寄存器的讀寫就轉(zhuǎn)化為對內(nèi)存地址的讀寫。下面是CAN卡寄存器的讀寫函數(shù):

*在偏移量為off的地址讀取一個字節(jié)的數(shù)據(jù)inline BYTE CANR(LPCAN_HW_OPEN_INFO hCan,DWORD off)

{

return hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off];

*將一個字節(jié)數(shù)據(jù)寫到偏移量為off的地址中inline VOID CANW(LPCAN_HW_OPEN_INFO hCan,DWORD off,BYTE val)

{

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off]=val;

}

參數(shù)LPCAN_HW_OPEN_INFO定義的是CAN卡的數(shù)據(jù)結(jié)構(gòu),其中成員lpMappeBaseAddr[0]表示的是映射后基地址,lpMappedBaseAddr[1]就是基地址+1的地址,對應(yīng)CAN卡的寄存器是命令寄存器。通過上述兩個函數(shù)可操作CAN卡上的所有寄存器。

2.2 CAN卡初始化

CAN卡的控制器比較復(fù)雜,在通信前必須確認(rèn)硬件信息正確性、初始化各寄存器。初始化函數(shù)的基本流程如圖3所示。

第一步,檢查端口號和硬件信息的正確性,主要是CAN卡中斷號是否有效。

第二卡,設(shè)置CAN卡默認(rèn)參數(shù):

CanCardConfigInfo CAN_DEFAULT_SETTING=

{0X00,0XFF,0X03,0X1C};/*設(shè)置默認(rèn)波特率為125Kbps*/

DWORD dwThreadID =0;

PHYSICAL_ADDRESS phyAddr={hwInfo->dwIOBaseAddr *16,0 };

第三卡,用WinCE API函數(shù)LocalAlloc為CAN卡驅(qū)動中用到的數(shù)據(jù)結(jié)構(gòu)分配緩沖區(qū);通過HalTranslateBusAddress和MmMapIoSpace函數(shù)映射I/O地址,提供直接訪問設(shè)備的虛擬地址:

if(!HalTranslateBusAddress(Isa,0,phyAddr,0,&phyAddr))

goto _ExitInit;

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr=

(LPBYTE)MmMapIoSpace(phyAddr,CANCARDADDRLEN,FALSE);

if(!hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr)

goto _ExitInit;

如果分配內(nèi)存或映射邏輯地址失敗,則退出初始化程序,CAN卡初始化失敗。

第四步,初始化讀寫屬性、共享模式、讀超時時間和第二個CAN口的基地址。

第五步,創(chuàng)建CAN卡事件和數(shù)據(jù)接收事件:hCan->lpCanHWInfo->hCanEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

hCan->lpCanHWInfo->hRecvMsgEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

第六步,初始化中斷,如果CAN卡有復(fù)位請求就退出初始化程序。設(shè)置好中斷后啟動數(shù)據(jù)接收線程,設(shè)置線程優(yōu)先級繼續(xù)線程處理;最后配置CAN卡參數(shù),進(jìn)入正常運(yùn)行狀態(tài)。

2.3 CAN卡信息發(fā)送

CAN卡的信息發(fā)送分為兩個步驟。在對CAN卡基本信息進(jìn)行檢查后,首先設(shè)置發(fā)送緩沖的ID號。CAN標(biāo)準(zhǔn)模式的ID號為11位,偏移地址10中存放的是ID號的高8位,偏移地址11的高3位存放的是ID號的低3位,剩下5位分別是RTR位(遠(yuǎn)程傳送請求位)和數(shù)據(jù)長度。通過CANW函數(shù)將處理后的數(shù)據(jù)寫入到相應(yīng)的偏移地址,設(shè)置完相應(yīng)的地址數(shù)據(jù)后,通過循環(huán)將偏移地址12~19的數(shù)據(jù)采集回來存到數(shù)組中。然后,設(shè)置CAN卡的傳輸請求為允許并不斷偵測狀態(tài)寄存器的變化,當(dāng)傳輸緩沖滿標(biāo)志或傳輸結(jié)束標(biāo)志為1時通出程序,完成一次數(shù)據(jù)采集。傳輸緩沖區(qū)的寄存器如表1所列。

表1

ID號10ID.10ID.9ID.8ID.7ID.6ID.5ID.4ID.3RTR,數(shù)據(jù)長度碼11ID.2ID.1ID.0RTRDLC.3DLC.2DLC.1DLC.0數(shù)據(jù)1~812~19數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)表2

ID號20ID.10ID.9ID.8ID.7ID.6ID.5ID.4ID.3RTR,數(shù)據(jù)長度碼21ID.2ID.1ID.0RTRDLC.3DLC.2DLC.1DLC.0數(shù)據(jù)1~822~29數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)CAN消息發(fā)送函數(shù)的實(shí)現(xiàn)如下:

BOOL CAN_SendMessage(LPCAN_HW_OPEN_INFO hCan,LPCanCardMessageBuflpMsg)

{

BOOL bSuc=FALSE;

ASSERT(hCan && lpMsg && lpMsg->dwMessageLen <=8); /*防錯處理*/

if(0= =(hCan->dwAccessCode & GENERIC_WRITE))

return FALSE;

:: EnterCriticalSection(&hCan->lpCanHWInfo->

TransmitCritSec); /*進(jìn)入臨界區(qū)*/

BYTE byV=static_cast<BYTE>(1pMsg->dwMsgID>>3);

CANW(hCan,10,byV); /*設(shè)置ID值高8位*/

byV=static_cast<BYTE>=((lpMsg->dwMsgID & 7)<<5);

if(lpMsg->bRTR) byV|=0x10;

byV+=static_cast<BYTE>(lpMsg->dwMessageLen);

CANW(hCan,11,byV);/*設(shè)置ID值低3位、RTR及數(shù)據(jù)長度*/

for(UINT i=0;<lpMsg->dwMessageLen;++i)

{

CANW(hCan,12+i,lpMsg->byMsg[i]);

} /*采集數(shù)據(jù)*/

CANW(hCan,1,1);/*重置傳輸請求*/

while(TRUE)

{byV=CANR(hCan,2);

if(byV & 0X40) /*傳輸緩沖區(qū)滿,退出*/

{break;}

if(byV & 0X8){ /*傳輸結(jié)束,正確返回退出*/

bSuc = TRUE;

break;}

}

::LeaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*離開臨界區(qū)*/

return bSuc;

}

2.4 CAN卡信息接收

CAN卡的信息接收是發(fā)送的逆過程,當(dāng)接收緩沖區(qū)標(biāo)志為1時,表示緩沖區(qū)已滿可以接收數(shù)據(jù),將數(shù)據(jù)接收到數(shù)組后釋放接收緩沖區(qū),然后對接收到的數(shù)據(jù)進(jìn)行分解并存儲到CAN卡信息緩沖區(qū)的結(jié)構(gòu)體。接收緩沖區(qū)的寄存器結(jié)構(gòu)如表2所列。

CAN消息接收函數(shù)的實(shí)現(xiàn)如下:

BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO

HCan,OUT LPCanCardMessageBuflpMsg)

{……

if(CANR(hCan,2)&1){ /*判斷接收緩沖區(qū)是否已滿*/

for(UINT i=0;i<10;++i)

recvBuf[i]=CANR(hCan,20+i);/*將數(shù)據(jù)暫存到臨時緩沖區(qū)*/

CANW(hCan,1,4); /*釋放接收緩沖區(qū)*/

LpMsg->dwMsgID=recvBuf[0]<<3; /*取出ID的高8位*/

BYTE byV =recvBuf[1];

LpMsg->dwMsgID+=byV >>5;/*取出ID低3位,然后和高8位合并*/

LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR狀態(tài)*/

LpMsg->dwMessageLen = byV &0XF; /*返回?cái)?shù)據(jù)長度*/

……

}

else

{++hCan->lpCanHWInfo->dwErrorMsgCount;}/*沒有收到數(shù)據(jù),錯誤計(jì)數(shù)加1*/

::LeaveCriticalSection(&hCan->lpCanHWInfo->

ReceiveCritSec); /*離開臨界區(qū)*/

Return bSuc;

}

2.5 CAN卡事件處理

CAN卡事件處理函數(shù)是CAN卡驅(qū)動程序中很重要的部分。驅(qū)動設(shè)計(jì)要求具有消息通知的功能,當(dāng)事件發(fā)生時及時捕獲事件并進(jìn)行消息處理。

下面是事件處理函數(shù)的實(shí)現(xiàn):

staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)

{

ASSERT(lpParam);

LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;

CanCardMessageBuf bufMsg;

while(TEUE)

{ /*循環(huán)等待CAN卡消息產(chǎn)生,然后進(jìn)行處理*/

::WaitForSingleObject(hCan->lpCanHWInfo->hCanEvent,0XFFFFFFFF);

if(hCan->lpCanHWInfo->bKillCanThread) break; /*若CAN線程已關(guān)閉則中斷*/

if(CAN_RecvMessage(hCan,&hufMsg)){ /*正確接收數(shù)據(jù)后*/

CAN_RecvBufPush(hCan,&bufMsg);} /*將數(shù)據(jù)壓入緩沖*/

BYTE byV=CANR(hCan,3); /*將3號寄存器讀出然后立即寫入*/

CANW(hCan,3,byV);/*能夠獲取每次中斷*/

InterruptDone(hCan->lpCanHWInfo->lpCanObj->dwSysIrqt);

} /*本次中斷結(jié)束,等待下次中斷*/

return 0;

}

2.6 其它函數(shù)

為了提供更多的功能和更方便地使用CAN卡進(jìn)行通信,在CAN卡驅(qū)動程序中還設(shè)計(jì)了一些函數(shù)如CAN_Config用CAN卡信息配置、CAN_RecvBufPop用于處理接收緩沖區(qū)、CAN_Reset用于復(fù)位CAN卡、CheckHWInfo用于硬件信息檢查等。這些函數(shù)提供了對CAN通信卡的設(shè)置、檢查等功能,在這里不再詳述了。

3 CAN卡驅(qū)動封裝設(shè)計(jì)

CAN卡底層驅(qū)動函數(shù)雖然功能完整,但是對于用戶使用比較復(fù)雜并且一般用戶不需要了解底層實(shí)現(xiàn)的機(jī)制。為了便于使用,最后對CAN卡的驅(qū)動進(jìn)行了封裝,提供CanOpenFile、CanSendMsg等五個函數(shù)用于CAN總線的通信,以動態(tài)連接庫(DLL)的形式提供給用戶調(diào)用。封裝函數(shù)及功能如下:

*CanOpenFile;初始化并打開CAN卡的一個端口。

*CanCloseFile;關(guān)閉由CanOpenFile打開的CAN卡端口。

*CanRecvMsg;接收CAN卡數(shù)據(jù),打開CAN卡時必須具有GENERIC_READ權(quán)限。

*CanSendMsg;通過CAN卡發(fā)送數(shù)據(jù)。打開CAN卡時必須具有GENERIC_WRITE權(quán)限。

*CanIOControl;設(shè)置或獲取CAN卡I/O參數(shù)支持的I/O控制包括:IOCTL_CAN_CONFIG,IOCTL_CAN_RESET,IOCTL_CAN_TIMEOUT,IOCTL_CAN_SENDREADY,IOCTL_CAN_RECVREADY。

下面是CanSendMsg函數(shù)實(shí)現(xiàn)的代碼:

BOOL CanSendMSg(

HANDLE hCan,

LPCanCardMessageBuflpMsg)

{

if(!hCan||INVALID_HANDLE_VALUE= =hCan||

!lpMsg||lpMsg->dwMessageLen>8)return FALSE;

return CAN_SendMessage(LPCAN_HW_OPEN_INFO)

hCan,lpMsg);

該函數(shù)就是通過封裝CAN卡的底層驅(qū)動函數(shù)SendMessage來實(shí)現(xiàn)的,這樣將功能集中的五個函數(shù)更方便了用戶使用。

篇(4)

中圖分類號:TP311.52

文獻(xiàn)標(biāo)識碼:B

文章編號:1004―373X(2008)04―063―03

開發(fā)驅(qū)動程序的軟件主要有:MicroSoft公司的DDK,Jungo公司的Windriver和Compuware NuMega公司的Driver Studio三種。DDK是最基本的驅(qū)動程序開發(fā)工具,比較復(fù)雜,適于專業(yè)的驅(qū)動程序開發(fā)人員,不適于硬件開發(fā)人員開發(fā)驅(qū)動程序。Windriver開發(fā)驅(qū)動程序不需要熟悉操作系統(tǒng)內(nèi)核知識,針對硬件PCI/ISA/PCM―CIA/USB開發(fā)驅(qū)動程序比較方便,但驅(qū)動程序的效率不高、缺乏靈活性。Driver Studio把DDK用類的形式進(jìn)行封裝,簡化設(shè)備驅(qū)動程序的開發(fā),方便又不失靈活性。所以這里選擇Driver Studio作為驅(qū)動程序的開發(fā)工具。

在結(jié)合PCM高速遙測數(shù)據(jù)發(fā)送卡的基礎(chǔ)上,本文介紹WDM驅(qū)動程序的結(jié)構(gòu)特點(diǎn)和PCM高速遙測數(shù)據(jù)發(fā)送卡的硬件結(jié)構(gòu),并闡述針對數(shù)據(jù)發(fā)送卡的特點(diǎn),詳細(xì)地討論驅(qū)動程序關(guān)鍵部分的設(shè)計(jì)。

1 PCM遙測數(shù)據(jù)發(fā)送卡的硬件結(jié)構(gòu)

圖1為遙測數(shù)據(jù)發(fā)送卡的原理框圖。碼型變換器的功能是根據(jù)原始PCM數(shù)據(jù)產(chǎn)生3種輸出碼型:NRZ―L,NRZ―M及NRZ―S之一,以適應(yīng)更加廣泛的測試目的。多電平驅(qū)動器將來自FPGA的LV TTL電平的PCM數(shù)據(jù)和時鐘信號轉(zhuǎn)換為3種電平接口輸出,分別是TTL,EIA422及MLVDS。同步FIFO作為硬件數(shù)據(jù)幀緩存存儲由PCI總線寫入的數(shù)據(jù)幀,然后由序列生成器讀出。序列生成器根據(jù)PCM時鐘速率產(chǎn)生串行移出的PCM原始數(shù)據(jù)將來自FIFO的32位并行數(shù)據(jù)轉(zhuǎn)換為串行輸出,同時根據(jù)移位寄存器的狀態(tài)產(chǎn)生發(fā)向FIFO的讀數(shù)請求:

2 WDM驅(qū)動程序的結(jié)構(gòu)及特點(diǎn)

WDM(Windows Driver Model)是在原有的NT內(nèi)核模式驅(qū)動程序的基礎(chǔ)上發(fā)展來的,他增加了PnP(Plugand Play)、電源管理、WMI(Windows Management Instru―mentation)等功能。WDM模型的層次結(jié)構(gòu)如圖2所示。

層次結(jié)構(gòu)可以使I/O請求過程更加清晰。影響設(shè)備的每一個操作都使用I/O請求包(IRP),通常IRP被送到設(shè)備堆棧的最上層,然后逐漸過濾到下層驅(qū)動程序。每處理1個IRP,I/O管理器就調(diào)用1次StartIO例程,從而著手IRP處理工作;如何處理完全取決于具體的設(shè)備,調(diào)用驅(qū)動程序中相應(yīng)的例程。驅(qū)動程序處理完IRP后,會將結(jié)果返回給I/O管理器,再由I/O管理器返回給用戶應(yīng)用程序。

3 PCM遙測數(shù)據(jù)發(fā)送卡WDM驅(qū)動程序的設(shè)計(jì)

在設(shè)備的驅(qū)動程序設(shè)計(jì)中,需要處理PCI設(shè)備的硬件讀寫、中斷處理、DMA等功能。可以把驅(qū)動程序視為一個框架和若干例程的結(jié)合體,各個例程處理不同的IRP,而框架負(fù)責(zé)在IRP到來時調(diào)用相應(yīng)的例程。利用Driver―Works的驅(qū)動程序向?qū)?Driver Wizard)新建一個PCI設(shè)備驅(qū)動程序框架,然后在這個框架基礎(chǔ)上添加必要的實(shí)現(xiàn)功能的處理代碼,就可以完成整個驅(qū)動程序的設(shè)計(jì)。下面以PCM遙測數(shù)據(jù)發(fā)送卡為例討論其主要的功能驅(qū)動程序例程的實(shí)現(xiàn)。

3.1硬件初始化例程

OnStartDevice(KIrp I)參數(shù)例程中包含2種系統(tǒng)分配的資源配置信息:原始的資源配置信息(AllocatedRe―sources);轉(zhuǎn)換后的資源配置信息(AllocatedResourcesTranslated)。因?yàn)镮/O總線和CPU在尋址物理硬件的方式不同,所以存在2種資源列表。從注冊表、PCI配置空間和其他地方獲取原始的資源值和轉(zhuǎn)換這些值的操作全部由PnP管理器完成,WDM驅(qū)動程序需要做的僅是從設(shè)備啟動IRP中獲取這些資源。

3.2 中斷服務(wù)例程

中斷服務(wù)例程運(yùn)行在DIRQL級別上,需要盡可能快地運(yùn)行。本設(shè)計(jì)在中斷服務(wù)例程中,首先判斷中斷是否自己設(shè)備產(chǎn)生的,如果是,則調(diào)用一個在DISPATCH_LEV―EL級別上運(yùn)行的延遲過程調(diào)用(DPC)。當(dāng)中斷服務(wù)例程完成后,一旦處理器獲得DISPATH_LEVEI。運(yùn)行權(quán),就會運(yùn)行DPC。中斷服務(wù)例程流程圖如3所示。

3.3 中斷延遲調(diào)用例程

在延遲調(diào)用例程中,判斷中斷原因如果是DMA中斷就啟動DMA繼續(xù)發(fā)送。如果是發(fā)送通道中斷,則判斷通道號,并把相應(yīng)軟件FIFO里面的待發(fā)送數(shù)據(jù)傳送到硬件FIFO里。在此過程中需要檢查在將軟件FIFO中的數(shù)據(jù)寫入硬件FIFO中后,如果軟件FIFO已被讀空,則應(yīng)禁止通道中斷,否則通道中斷因?yàn)閮?yōu)先級高,會一直于有效狀態(tài),導(dǎo)致系統(tǒng)死鎖。而在用戶程序?qū)戃浖﨔IFO的處理函數(shù)中,檢查通道中斷,如果被禁止,則應(yīng)將新寫入軟件FIFO的數(shù)據(jù)讀取一部分寫入硬件FIFO中,然后開啟通道中斷。

3.4應(yīng)用程序與驅(qū)動程序的通信例程

DeviceControl(KIrp I)主要用于應(yīng)用程序與驅(qū)動程序之間的通信,如向硬件讀寫數(shù)據(jù)以及軟件FIFO的操作等。DevcieControl響應(yīng)用戶應(yīng)用程序DeviceloControl()發(fā)送的IRP,根據(jù)IOCTL代碼來判斷調(diào)用子處理函數(shù)PCI_9054_IOCTL_READ_Handler(I),PCI_9054_IOCTL_WRITE_Handler(I).DEV_IOCTL_TXI_FIFO_WRITE_Handler(I)分別完成對硬件的讀寫和軟件FIFO的寫操作。

3.5 DMA傳輸操作

硬件FIFO半滿時產(chǎn)生通道中斷,在DPC里,判斷是通道中斷,則初始化KDmaTransfer,然后調(diào)用OnD-maReady();在OnDmaReady()中啟動首次DMA傳輸,傳輸時發(fā)生中斷,在DPC中判斷是否DMA中斷,如果是,則調(diào)用Continue()再次啟動下次傳輸,至此全總數(shù)據(jù)傳輸完成。其流程圖如圖4所示。

4 驅(qū)動程序編譯、調(diào)試和安裝

當(dāng)驅(qū)動程序編寫完成后,必須在DDK環(huán)境下進(jìn)行編譯,執(zhí)行Rebuild aIl命令,編譯完成后生成*.sys文件和*.inf文件。調(diào)試工具使用Softlce,基本過程如下:

(1)使用Symbol Loader加載驅(qū)動程序*.nms文件,然后激活Softlee,設(shè)置斷點(diǎn)跟蹤調(diào)試;

(2)用Genint命令產(chǎn)生虛擬中斷測試,中斷服務(wù)例程;

篇(5)

1 WDM模式驅(qū)動程序

1.1 WDM模式(Windows Driver Model)

Windows2000對驅(qū)動程序的編寫不再基于以往的Win3.x和Win9x下的VxD(虛擬設(shè)備驅(qū)動程序)結(jié)構(gòu),而是基于一種新的驅(qū)動模型——WDM(Windows Driver Model)。

WDM為Windows98/2000/XP操作系統(tǒng)的設(shè)備驅(qū)動程序的設(shè)計(jì)提供了統(tǒng)一的框架。WDM來源于Windows NT的分層32位設(shè)備驅(qū)動程序模型(layered 32-bit device driver model)。它支持更多的特性,如即插即用(PnP)、電源管理、WMI和NT事件。

1.2 設(shè)備驅(qū)動程序

設(shè)備驅(qū)動程序是操作系統(tǒng)的一個組成部分,它由I/O管理器(I/O Manager)管理和調(diào)動。Windows2000操作系統(tǒng)下的I/O管理器功能描述如圖1所示。

I/O管理器每收到一個來自用戶應(yīng)用程序的請求就創(chuàng)建一個I/O請求包(IRP)的數(shù)據(jù)結(jié)構(gòu),并將其作為參數(shù)傳遞給驅(qū)動程序。驅(qū)動程序通過識別IRP中的物理設(shè)備對象(PDO)來區(qū)別是發(fā)送給哪一個設(shè)備。IRP結(jié)構(gòu)中存放請求的類型、用戶緩沖區(qū)的首地址、用戶請求數(shù)據(jù)的長度等信息。驅(qū)動程序處理完這個請求后,在該結(jié)構(gòu)中填入處理結(jié)果的有關(guān)信息,調(diào)用IoCompleteRequest將其返回給 I/O管理器,用戶應(yīng)用程序的請求隨即返回。訪問硬件時,驅(qū)動程序通過調(diào)用硬件抽象層的函數(shù)實(shí)現(xiàn)。

    1.3 DriverStudio工具簡介

NuMega Lab公司開發(fā)的DriverStudio是一整套開發(fā)、調(diào)試和檢測Windows平臺下設(shè)備驅(qū)動程序的工具軟件包。它把DDK(Device Development Kit)封裝成完整的C++函數(shù)庫,根據(jù)具體硬件通過向?qū)煽蚣艽a,并且提供了一套完整的調(diào)試和性能測試工具SoftICE、DriverMonitor等。

2 應(yīng)用實(shí)例

本文利用PCI專用接口芯片PCI9052設(shè)計(jì)了一個數(shù)據(jù)傳輸控制卡。卡上主要的芯片有PCI9052、FIFO(CY7C4221)、CPLD(MAX7064S)和A/D轉(zhuǎn)換器(MAX1197)。傳輸卡硬件框圖如圖2所示。面陣CCD得到的視頻信號經(jīng)過調(diào)理電路,生成的視頻調(diào)理信號通過A/D轉(zhuǎn)換器進(jìn)行數(shù)字化處理,送入FIFO中。在CPLD的控制下,數(shù)據(jù)經(jīng)過PCI9052送入PCI總線,再傳送到計(jì)算機(jī)內(nèi)存中,并顯示在監(jiān)視器上。驅(qū)動程序必須實(shí)現(xiàn)如下幾個基本功能:(1)硬件中斷;(2)能支持應(yīng)用程序獲取數(shù)據(jù);(3)能根據(jù)外部FIFO(CY7C4221)的狀態(tài)啟動或停止突發(fā)傳輸。

在數(shù)據(jù)輸入過程中,最重要的是對數(shù)據(jù)進(jìn)行實(shí)時控制,因此需要硬件中斷。在中斷程序中,根據(jù)外部FIFO狀態(tài)完成數(shù)據(jù)的讀入。

2.1 用DriverWizard生成驅(qū)動程序框架

DriverStudio中的DriverWorks軟件為開發(fā)WDM程序提供了一個完整的框架。它包含一個可快速生成WDM驅(qū)動程序框架的代碼生成向?qū)Чぞ逥riverWizard,而且還帶有許多類庫。在用DriverWizard生成的程序框架中寫入相對于設(shè)備的特定代碼,編譯后即可得到所需的驅(qū)動程序。

在利用DriverWorks V2.7的向?qū)river Wizard完成驅(qū)動程序的框架時共有11個步驟,其中關(guān)鍵步驟有:

(1)在第四步中選中PCI,并在VendorID和DeviceID中分別輸入廠商號和設(shè)備號,還需填入PCI Subsystem ID和PCI Revision ID。這四項(xiàng)可以用網(wǎng)上的免費(fèi)軟件PCITree或PCIView瀏覽PCI設(shè)備,用這兩個軟件也可以得到BAR0~BAR5的資源分配情況和中斷號。

    (2)第七步IRP隊(duì)列排隊(duì)方法,它決定了驅(qū)動程序檢查設(shè)備的方式。本設(shè)計(jì)選SystemManaged,則所有的IRP排隊(duì)都由系統(tǒng)(即I/O管理器)完成。

(3)第九步是最關(guān)鍵的一步。首先在Resources中添加資源,在name中輸入變量名,在PCI Base Address中輸入0~5的序列號。0~5和BAR0~BAR5一一對應(yīng)。在設(shè)置中斷對話框中,在name欄寫入中斷服務(wù)程序的名稱,選中創(chuàng)建中斷服務(wù)程序ISR?穴Create ISR?雪,不選創(chuàng)建延遲程序調(diào)用DPC(Create DPC),選中Make ISR/DPC class functions,使ISR/DPC成為設(shè)備類的成員函數(shù)。

其次選中Buffer以選取讀寫方式,用于描述與I/O操作相關(guān)的數(shù)據(jù)緩沖區(qū)。本設(shè)計(jì)需要快速傳送大量數(shù)據(jù),因此采用Direct I/O方式。

(4)在第十步中,需要加入與應(yīng)用程序或者其他驅(qū)動程序通信的I/O控制代碼參量。

2.2 驅(qū)動程序模塊框圖和代碼分布

PCI設(shè)備驅(qū)動程序模塊包括配置空間的訪問模塊、IO端口模塊、內(nèi)存讀寫模塊和終端模塊等。各模塊之間是對等的。驅(qū)動程序模塊框圖如圖3所示。

驅(qū)動程序初始化模塊代碼段放在#pragma code_seg(″INT″)和#pragma code_seg()之間。在系統(tǒng)初始化完成后,這部分代碼從內(nèi)存中釋放,防止占用系統(tǒng)寶貴的內(nèi)存資源。#pragma code_seg()之后是驅(qū)動程序和系統(tǒng)的許多模塊的實(shí)現(xiàn)部分。這部分在驅(qū)動程序運(yùn)行后不會從內(nèi)存中釋放。

2.3 驅(qū)動程序主要模塊的實(shí)現(xiàn)

(1)配置空間的訪問模塊

DriverWorks的KPciConfiguration類封裝了訪問PCI設(shè)備配置空間的所有操作。首先初始化這個類的實(shí)例:

KpciConfiguration PciConfig()m_Lower.TopOfStack());

/?觹m_Lower是 KpnpLowerDevice類的對象。m_LowerTopOfStack()返回當(dāng)前設(shè)備堆棧頂部的設(shè)備對象。*/

初始化完后可以直接利用成員函數(shù) ReadHeader/ WriteHeader函數(shù)訪問所有的配置寄存器。

為了確定映射空間的類型和大小,先向目標(biāo)基地址寄存器寫入0Xffffffffh,然后回讀該寄存器的值。如果最低位為1,表示映射于I/O空間,反之為存儲空間;如果映射于存儲空間,從第四位開始計(jì)算0的個數(shù)可以確定內(nèi)存空間的大小;如果是I/O方式,從第二位開始計(jì)算0的個數(shù)可確定I/O空間的大小,最大為256字節(jié)。如果設(shè)備的存儲空間超過256字節(jié),要實(shí)現(xiàn)設(shè)備的整個存儲部分的訪問,就必須采用內(nèi)存映射。

(2)I/O操作模塊

Driverworks的KIoRange類封裝了I/O端口訪問的操作。部分代碼如下:

{……

KIORange DevIoPort () ;//創(chuàng)建實(shí)例

NTSTATUS status= DevIoPort ().Initialize ( pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0));

/* 第一個參數(shù)為轉(zhuǎn)換后的資源列表指針;第二個參數(shù)為原始資源列表指針;第三個參數(shù)中的0為 I/O口對應(yīng)的基地址,用來轉(zhuǎn)換成特定端口資源的序數(shù)?*/

If(NT _SUCCESS(status))

{……

DevIoPort.inb(0,LineBuf1,10);

/*成功初始化后可分別用KIoRange類的成員函數(shù)inb(/outb)從端口中讀/寫字節(jié) */

}

else{Invalidate();return status;

/*未能初始化成功,錯誤信息在status中*/

{

……}

(3)內(nèi)存讀寫模塊

DriverWorks的 KMemoryRange類封裝了端口訪問的操作。

status=m_M(jìn)emoryRange().Initialize(pResListTranslated,pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0));

此函數(shù)的參數(shù)、意義及具體用法與I/O端口的操作基本相同。

內(nèi)存對象也用來發(fā)送控制字,以控制CPLD的開始和停止等。實(shí)際上控制字是通過PCI9052發(fā)送的。該控制字地址已被映射成PCI的內(nèi)存空間。所以定義一個指向內(nèi)存空間的內(nèi)存對象,通過該對象即可發(fā)送控制字。

(4)中斷模塊

在中斷模塊,首先要激活PCI9052中斷使能位,然后判斷硬件中斷響應(yīng)是否產(chǎn)生,如果有,則進(jìn)行突發(fā)傳輸,讀入FIFO中的數(shù)據(jù)。

BOOLEAN TranCard::Isr_M(jìn)yIrq(void)

{ if (// 中斷未產(chǎn)生)

{……

return FALSE;}

else

{/* 如果產(chǎn)生硬件中斷,設(shè)置命令寄存器,進(jìn)行突發(fā)數(shù)據(jù)傳輸 */

return TRUE;}

}

為了將硬件中斷與編寫的中斷服務(wù)程序連接在一起,采用InitializeAndConnect方法,部分代碼如下:

NTSTATUS TranCardDevice?押?押OnStartDevice(KIrp I )

{……

status=m_M(jìn)yIrq. InitializeAndConnect(

pResListTranlated,

LinkTo(Isr_M(jìn)yIrq),

This;)

……}

2.4 驅(qū)動程序的調(diào)用

編寫驅(qū)動程序本身不是最終目的,最終目的是調(diào)用驅(qū)動程序管理資源,并為用戶應(yīng)用程序使用。驅(qū)動程序加載以后,它的許多進(jìn)程處于Idle狀態(tài),實(shí)際上需要用戶應(yīng)用程序去調(diào)用激活。應(yīng)用程序利用Win32 API直接調(diào)用驅(qū)動程序,實(shí)現(xiàn)驅(qū)動程序和應(yīng)用程序的信息交互。

    首先用CreateFile()打開設(shè)備,獲得一個指向設(shè)備對象的句柄。使用CreateFile函數(shù)時應(yīng)注意:由于驅(qū)動程序是*.sys,所以第一個參數(shù)應(yīng)該是這個設(shè)備對象的標(biāo)志連接(symbolic link)。該標(biāo)志連接名有一個設(shè)置數(shù)據(jù)文件搜索路徑的數(shù)字號,而這個數(shù)字號通常是零。如果這個連接名是″TranCard″,則傳遞給CreateFile的宇符串就是:″\\\\.\\ TranCard0″。例如:

HANDLE hDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, NULL?, OPEN_EXISTING,0,NULL);

然后用 DeviceIoControl()進(jìn)行數(shù)據(jù)的傳送。最后用CloseHandle( )關(guān)閉設(shè)備句柄。

下面是應(yīng)用DeviceIoControl()程序片段。

{……

m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_

RECEIVE(buffer, sizeof,buffer, NULL,0,&buffersize,NULL);

……}

2.5 驅(qū)動程序的調(diào)試

篇(6)

中圖分類號:TP305文獻(xiàn)標(biāo)識碼:B 文章編號:1009-3044(2011)16-3952-03

CAN_NODE Bus Drivers Design Based on Atmega128

LIU Bin, LIU Jun-liang, MA Jin-bo, WANG Jun-qing

(2332 Laboratory, College of Engineering, Ocean University of China, Qingdao 266100, China)

Abstract: CAN_NODE is a powerful 8-bit AVR microcontroller experiment board, it is based on AVR RISC structure 8-bit low-power CMOS microprocessor ATmega128. This paper briefly expounds the profile of the fieldbus technology, hardware structure of CAN_NODE experimental board and characteristic of ATmega128, then the CAN bus drivers based on the experimental board is focused on.

Key words: CAN_NODE experiment board; ATmega128; CAN bus drivers

1 概述

現(xiàn)場總線(Fieldbus)技術(shù)是當(dāng)前自動化技術(shù)的熱點(diǎn)之一。現(xiàn)場總線技術(shù)集先進(jìn)的嵌入式系統(tǒng)、現(xiàn)代通信、自控理論、網(wǎng)絡(luò)技術(shù)于一身,充分體現(xiàn)出先進(jìn)技術(shù)的進(jìn)步能夠?yàn)槿祟悗淼谋憷?/p>

CAN:全稱為“Controller Area Network”,即控制器局域網(wǎng),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通訊,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò),比如,發(fā)動機(jī)管理系統(tǒng)、變速箱控制器、儀表裝備、電子主干系統(tǒng)中,均嵌入CAN控制裝置。

AVR單片機(jī)是1997年由ATMEL公司研發(fā)出的增強(qiáng)型內(nèi)置Flash的RISC(Reduced Instruction Set CPU) 精簡指令集高速8位單片機(jī)。AVR的單片機(jī)可以廣泛應(yīng)用于計(jì)算機(jī)外部設(shè)備、工業(yè)實(shí)時控制、儀器儀表、通訊設(shè)備、家用電器等各個領(lǐng)域。

2 CAN_NODE實(shí)驗(yàn)板硬件結(jié)構(gòu)

CAN_NODE實(shí)驗(yàn)板上提供了CAN總線通訊所需要的硬件,和一些按鍵,LED,USB接口等常用的功能部件,還提供了為系統(tǒng)擴(kuò)展而預(yù)留的擴(kuò)展功能接口,也提供了SPI接口和JTAG接口以方便下載和調(diào)試。

2.1 CAN_NODE實(shí)驗(yàn)板功能框圖

圖1為系統(tǒng)結(jié)構(gòu)框圖。

2.2 ATmega128的特點(diǎn)

其先進(jìn)的指令集以及單周期指令執(zhí)行時間, 使得ATmega128 的數(shù)據(jù)吞吐率高達(dá)1 MIPS/MHz。同時ATmega128具有:128K 節(jié)的系統(tǒng)內(nèi)可編程Flash(具有在寫的過程中還可以讀的能力,即RWW)、4K 字節(jié)的EEPROM、4K 字節(jié)的SRAM、53 個通用I/O 口線、32個通用工作寄存器、實(shí)時時鐘RTC、4 個靈活的具有比較模式和PWM 功能的定時器/ 計(jì)數(shù)器(T/C)、兩個USART、面向字節(jié)的兩線接口TWI、8 通道10 位ADC(具有可選的可編程增益)、具有片內(nèi)振蕩器的可編程看門狗定時器、SPI 串行端口、與IEEE 1149.1 規(guī)范兼容的JTAG 測試接口(此接口同時還可以用于片上調(diào)試)。

3CAN總線驅(qū)動程序設(shè)計(jì)

軟件開發(fā)采用的是ImageCraft公司開發(fā)的ICCAVR,軟件的下載采用雙龍ATMEL_ISP下載軟件。ICCAVR是一種使用符合ANSI 標(biāo)準(zhǔn)的 C 語言來開發(fā)ATMEL公司生產(chǎn)的微控制器(MCU)程序的一個工具,它有以下幾個主要特點(diǎn):

1)ICCAVR 是一個綜合了編輯器和工程管理器的集成工作環(huán)境(IDE),其可在Windows9X/NT下工作,源文件可被組織到工程中,文件的編譯和工程的構(gòu)筑也是在這個環(huán)境中完成。

2)編譯錯誤顯示在狀態(tài)窗口中,并且當(dāng)你用鼠標(biāo)單擊編譯錯誤時,光標(biāo)會自動跳轉(zhuǎn)到編輯窗口中引起錯誤的那一行。這個工程管理器還能直接產(chǎn)生您希望得到的可以直接使用的INTELHEX 格式文件,INTEL HEX 格式文件可被大多數(shù)的編程器所支持,用于下載程序到芯片中去。

集成開發(fā)環(huán)境如圖2所示。

CAN總線驅(qū)動程序主要包括四個部分:CAN控制器初始化、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)和總線異常處理。

圖3為主程序流程圖。

主要程序設(shè)計(jì)如下所示:

3.1 初始化

Can控制器初始化的操作包括:中斷控制,硬件使能,軟件復(fù)位,工作模式等。

初始化程序如下

unsigned char can_state;

IOWR(CAN_IP_0_BASE,CAN_IER,0x00);//禁止中斷

IOWR(CAN_IP_0_BASE,CAN_MOD,0x09);//進(jìn)入復(fù)位模式,單驗(yàn)收濾波器

can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);

while((can_state&0x01)==0x00)//檢測是否進(jìn)入復(fù)位模式

{

IOWR(CAN_IP_0_BASE,CAN_MOD,0x09);//進(jìn)入復(fù)位模式,單驗(yàn)收濾波器

can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);

}

IOWR(CAN_IP_0_BASE,CAN_CDR,0xC1);//peliCAN,禁止時鐘輸出,禁止TX1,RX1c8

IOWR(CAN_IP_0_BASE,CAN_ACR0,local_code1);//驗(yàn)收碼1

IOWR(CAN_IP_0_BASE,CAN_ACR1,local_code2);//驗(yàn)收碼2

IOWR(CAN_IP_0_BASE,CAN_ACR2,local_code3);//驗(yàn)收碼3

IOWR(CAN_IP_0_BASE,CAN_ACR3,local_code4);//驗(yàn)收碼4

IOWR(CAN_IP_0_BASE,CAN_AMR0,0xff);//屏蔽碼1

IOWR(CAN_IP_0_BASE,CAN_AMR1,0xff);//屏蔽碼2

IOWR(CAN_IP_0_BASE,CAN_AMR2,0xff);//屏蔽碼3

IOWR(CAN_IP_0_BASE,CAN_AMR3,0xff);//屏蔽碼4

IOWR(CAN_IP_0_BASE,CAN_BTR0,0x01);//同步跳轉(zhuǎn)3個周期,系統(tǒng)時鐘4倍周期

IOWR(CAN_IP_0_BASE,CAN_BTR1,0x1C);//采樣點(diǎn)3,段一6,段二3

IOWR(CAN_IP_0_BASE,CAN_OCR,0x1A);//控制寄存器

IOWR(CAN_IP_0_BASE,CAN_MOD,0x08);//進(jìn)入工作模式,單驗(yàn)收濾波器

can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);

while((can_state&0x01)==0x01)//檢測是否進(jìn)入復(fù)位模式

{

IOWR(CAN_IP_0_BASE,CAN_MOD,0x08);//進(jìn)入工作模式,單驗(yàn)收濾波器

can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);

}

IOWR(CAN_IP_0_BASE,CAN_IER,0x01);//開接收中斷

}

CAN是一種基于廣播的通訊機(jī)制,廣播通訊依靠報文(Message)的傳送機(jī)制來實(shí)現(xiàn),因此CAN并未定義站及站地址,而僅僅定義了報文,這些報文依靠報文確認(rèn)區(qū)(Identifier)來進(jìn)行識別,一個消息報文確認(rèn)區(qū)在一個網(wǎng)絡(luò)中必須是唯一的,它不但描述了某一報文的意義,而且還定義了報文的優(yōu)先級,當(dāng)很多站都在訪問總線時,優(yōu)先級是很重要的,因此,CAN是通過報文的確認(rèn)區(qū)來決定報文的優(yōu)先級的。

CAN節(jié)點(diǎn)之間的數(shù)據(jù)傳輸采用的協(xié)議是報文格式,其29位的幀標(biāo)識符和報文數(shù)據(jù)部分的規(guī)定如圖4所示。

3.2 數(shù)據(jù)接收

接收數(shù)據(jù)可以采用查詢方式或中斷方式。在某一段時間內(nèi)CAN總線并不是總在活動,為了提高效率,可采用中斷方式。

程序如下:

alt_u8 can_irq_reg;

//can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);

//if ((can_irq_reg & 0x01)==1)

{

can_rx_reg[0]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_H);//發(fā)送幀

can_rx_reg[1]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C1);//驗(yàn)收碼1

can_rx_reg[2]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C2);//驗(yàn)收碼2

can_rx_reg[3]=IORD(CAN_IP_0_BASE,CAN_TX_EFF_C3);//驗(yàn)收碼3

can_rx_reg[4]=IORD(CAN_IP_0_BASE,CAN_TX_EFF_C4);//驗(yàn)收碼4

can_rx_reg[5]=IORD(CAN_IP_0_BASE,21);

can_rx_reg[6]=IORD(CAN_IP_0_BASE,22);

can_rx_reg[7]=IORD(CAN_IP_0_BASE,23);

can_rx_reg[8]=IORD(CAN_IP_0_BASE,24);

can_rx_reg[9]=IORD(CAN_IP_0_BASE,25);

can_rx_reg[10]=IORD(CAN_IP_0_BASE,26);

can_rx_reg[11]=IORD(CAN_IP_0_BASE,27);

can_rx_reg[12]=IORD(CAN_IP_0_BASE,28);

}

can_rx_flag=1;

IOWR(CAN_IP_0_BASE,CAN_CMR,0X04);//釋放接收緩沖區(qū)

can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);

while ((can_irq_reg & 0x01 )==0x01)

{

IOWR(CAN_IP_0_BASE,CAN_CMR,0X04);

can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);

}

3.3 數(shù)據(jù)發(fā)送

將待發(fā)送的數(shù)據(jù)打包成符合CAN協(xié)議的幀格式后,寫入發(fā)送緩沖區(qū),然后發(fā)送。

程序如下所示:

if(can_rx_flag==1)

{

can_tx_count=0;

can_rx_flag=0;

//IOWR(CAN_IP_0_BASE,21,0x55);

//IOWR(CAN_IP_0_BASE,21,0xaa);

//data_reg=IORD(CAN_IP_0_BASE,21);

IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_H,0x88);//發(fā)送幀

IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C1,local_code1);//驗(yàn)收碼1

IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C2,local_code2);//驗(yàn)收碼2

IOWR(CAN_IP_0_BASE,CAN_TX_EFF_C3,local_code3);//驗(yàn)收碼3

IOWR(CAN_IP_0_BASE,CAN_TX_EFF_C4,local_code4);//驗(yàn)收碼4

IOWR(CAN_IP_0_BASE,21,can_rx_reg[5]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,22,can_rx_reg[6]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,23,can_rx_reg[7]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,24,can_rx_reg[8]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,25,can_rx_reg[9]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,26,can_rx_reg[10]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,27,can_rx_reg[11]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,28,can_rx_reg[12]);//數(shù)據(jù)

IOWR(CAN_IP_0_BASE,CAN_CMR,0x01);//發(fā)送

}

3.4 異常情況處理

總線發(fā)生故障時,下行的CAN節(jié)點(diǎn)可能脫離總線。可通過讀取錯誤計(jì)數(shù)器對計(jì)數(shù)器遞減計(jì)數(shù)的情況進(jìn)行監(jiān)測并作相應(yīng)處理。若前面?zhèn)鬏數(shù)紺AN控制器的數(shù)據(jù)未被讀出,而接收緩沖區(qū)又沒有及時釋放,就有可能引起后面信息的丟失。這時必須通過寫命令寄存器來清除CANSR的數(shù)據(jù)溢出位。這兩種異常可通過異常中斷來處理,只要在中斷子程序中加入處理代碼即可。其他的總線異常處理可根據(jù)使用情況決定是否在軟件中處理。

4 結(jié)束語

本設(shè)計(jì)對CAN模塊軟硬件結(jié)構(gòu)及ATmega128的特點(diǎn)進(jìn)行簡要的描述,主要對基于ATmega128單片機(jī)的CAN_NODE總線驅(qū)動程序的進(jìn)行設(shè)計(jì)。現(xiàn)場總線技術(shù)以其獨(dú)有的技術(shù)優(yōu)勢和特點(diǎn),在現(xiàn)代分布式測量與控制技術(shù)領(lǐng)域中應(yīng)用已愈來愈廣泛。各種現(xiàn)場總線的主控制器一般都內(nèi)嵌有相當(dāng)完善的、開放式的互聯(lián)通信協(xié)議,它具有通信速度快、誤碼率低、開發(fā)設(shè)計(jì)簡單及網(wǎng)絡(luò)使用維護(hù)方便等諸多特點(diǎn),是實(shí)現(xiàn)網(wǎng)絡(luò)化現(xiàn)場測量與控制技術(shù)的一個發(fā)展方向。

參考文獻(xiàn):

[1] 周立功.iCAN現(xiàn)場總線原理與應(yīng)用[M].北京:北京航空航天大學(xué),2007.

[2] 范偉成.基于ATmegal28單片機(jī)的CAN總線接口設(shè)計(jì)及應(yīng)用[M].上海:上海齊耀動力技術(shù)有限公司,2008.

篇(7)

1 PC/104-CAN適配卡的硬件結(jié)構(gòu)

PC/104-CAN適配卡主要由CAN控制器(SJA1000)、光電隔離(6N137),收發(fā)驅(qū)動器(82C250)及譯碼電路組成。編程主要了解的是控制器SJA1000。CAN適配卡原理如圖1所示。

2 CAN地址譯碼和中斷選擇

系統(tǒng)104主板的CPU為486DX,其對接口板訪問有兩種方式:內(nèi)存映射和I/O訪問。I/O尋址采用專門的指令,每次只能傳送單個字節(jié)。內(nèi)存映射方式可以訪問較大的地址空間并且指令豐富,便于實(shí)現(xiàn)快速交換數(shù)據(jù)。本文討論的CAN卡采用存映射模式工作,與486DX接口是104總線,它與ISA總線兼容。對于Intel X86體系的CPU,ISA可以映射的空間為0xC8000~0xEFFFF。使用比較器和地址選擇開關(guān)組成可選端口地址譯碼電路,通過開關(guān)選通內(nèi)存映射基地址(C8000H、C9000H、CA000H、…、EF000H),以避免與其它器件沖突。CAN偏移地址分配如下:

00~FFH SJA1000的寄存器;

100H~1FFH 對該范圍內(nèi)的任意地址進(jìn)行寫操作,均可導(dǎo)致CAN硬件復(fù)位。

SJA1000的INT引腳通過跳線選擇IRQ3~7、IRQ9~12或IRQ15中的一個,避免與其它的適配卡沖突。

3 PC/104-CAN適配卡驅(qū)動實(shí)現(xiàn)

3.1 VxWorks驅(qū)動概述

VxWorks操作系統(tǒng)有兩種方式實(shí)現(xiàn)驅(qū)動。第一種方式是,把設(shè)備驅(qū)動程序作為獨(dú)立任務(wù)實(shí)現(xiàn),直接在頂層任務(wù)中實(shí)現(xiàn)硬件操作,完成特有專用的驅(qū)動程序。第二種方式是,VxWorks的I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過程實(shí)現(xiàn)。這種方式便于實(shí)現(xiàn)I/O子系統(tǒng)的層次模型,便于文件系統(tǒng)一起把設(shè)備作為特殊文件處理,提供統(tǒng)一的管理、統(tǒng)一的界面和統(tǒng)一的使用方法,并把設(shè)備、文件及網(wǎng)絡(luò)通信組織成為一致的更高層次的抽象,為用戶提供統(tǒng)一的系統(tǒng)服務(wù)和用戶接口。我們和這種驅(qū)動方式。

    作為I/O系統(tǒng)和硬件設(shè)備之間的連接層,VxWorks驅(qū)動就是屏蔽硬件操作,為I/O系統(tǒng)提供服務(wù)。實(shí)現(xiàn)一個完整的驅(qū)動,必須了解VxWorks下I/O的三個基本元素:File、Driver和Dervice。File是為用戶提供訪問設(shè)備的統(tǒng)一接口;Driver是實(shí)現(xiàn)具體的基本控制函數(shù),也就是實(shí)現(xiàn)I/O系統(tǒng)所需要的接口;而Device則是一個抽象的硬件設(shè)備,是一系列的結(jié)構(gòu)體、變量和宏定義對實(shí)際物理設(shè)備的定義。一般而言,實(shí)現(xiàn)一個驅(qū)動應(yīng)該有三個基本的步驟:①用編程語言完成對實(shí)際物理設(shè)備的抽象;②完成系統(tǒng)所需要的各類接口及自身的特殊接口;③將驅(qū)動集成到操作系統(tǒng)中。之后還有一些調(diào)試工作。

3.2 VxWorks I/O系統(tǒng)驅(qū)動程序框架

VxWorks為各種設(shè)備(包括字符設(shè)備、塊設(shè)備、虛擬設(shè)備及網(wǎng)絡(luò)設(shè)備)提供統(tǒng)一的訪問接口,包括七種基本的I/O函數(shù):open(filename、flags、mode),create(filename、flags),read(fd、&buf、nBytes),write(fd、&buf、nBytes),ioctl(fd、command、arg),close(fd)及remove(filename)。I/O系統(tǒng)所起的作用就是,把用戶請求分配到與設(shè)備對應(yīng)的驅(qū)動例程中去。VxWorks系統(tǒng)中有一個驅(qū)動程序列表,其形式如表1所列。

表1 設(shè)備驅(qū)動列表(調(diào)試時可利用iosDrvShow()查看)

驅(qū)動號碼createremoveopenclosereadwriteioctl1

2ca OpenNULLca Openca Closeca Readca Writeca IoctlI/O系統(tǒng)的可動態(tài)調(diào)用iosDrvInstall()函數(shù)將設(shè)備的驅(qū)動例程(即XXOpen()、XXClose()、XXRead()等)加入到設(shè)備驅(qū)動列表中,如圖2所示。

同樣,系統(tǒng)中有一個設(shè)備列表,每個設(shè)備對應(yīng)于設(shè)備列表中的一項(xiàng),每一項(xiàng)包括設(shè)備名稱和設(shè)備驅(qū)動號,同時包括一個設(shè)備描述的結(jié)構(gòu)。該結(jié)構(gòu)第一個變量是DEV_HDR類型的變量DEV_HDR。

DEV_HDR的定義如下:

Typedef struct

{

DL_NODE node; /*設(shè)備列表節(jié)點(diǎn)*/

short drvNum; /*驅(qū)動號碼*/

char *name; /*設(shè)備名*/

}DEV_HDR;

系統(tǒng)調(diào)用iosDevAdd(),可以將設(shè)備加入到設(shè)備列表中。系統(tǒng)中將驅(qū)動和設(shè)備聯(lián)系起來的就是文件描述符列表,每個文件描述符列表除了包括驅(qū)動號、設(shè)備ID外,還包括文件名、可用標(biāo)志和指向DEV_HDR的指針。系統(tǒng)每次成功執(zhí)行open(),返回一個文件描述符,這樣對于設(shè)備的read()、write()及ioctl()就可以通過文件描述符進(jìn)行。

文件描述符表(調(diào)試時調(diào)用iosFdShow()查看)如下:

I/O系統(tǒng)的整體結(jié)構(gòu)如圖3所示。系統(tǒng)啟動時(一般掛接在usrroot()),XXDrv()和XXDevCreade()便將設(shè)備及其驅(qū)動加入相應(yīng)的列表中。

3.3 設(shè)備驅(qū)動程序的訪問過程

下面以CAN驅(qū)動程序?yàn)槔f明驅(qū)動程序的訪問過程。(假定設(shè)備名“/can/1”并且以CAN設(shè)備驅(qū)動程序?yàn)槔鲜鲋械腦X在這里用Can代替。)

①fd=open(“/can/1”,O_RDWR,0644)

②I/O系統(tǒng)在設(shè)備列表中尋找設(shè)備名為/can/1的設(shè)備項(xiàng),找到相應(yīng)的設(shè)備驅(qū)動號。

③I/O系統(tǒng)在文件描述符中保留一個文件描述符空間。

④I/O系統(tǒng)在設(shè)備驅(qū)動列表中找到對應(yīng)的CanOpen(CAN_DEV*PCAN_DEV,UBYTE*remainder,int flags),該驅(qū)動例程返回設(shè)備描述符的指針。

⑤I/O系統(tǒng)將設(shè)備描述符的指針存儲在文件描述符列表的Device ID,同時將對應(yīng)的設(shè)備驅(qū)動號存儲在文件描述符的Driver num項(xiàng)。最后I/O系統(tǒng)返回該描述符項(xiàng)的索引(即為fd)。

⑥這樣應(yīng)用程序中的read()和write()等函數(shù)調(diào)用就可以根據(jù)fd找到相應(yīng)的設(shè)備驅(qū)動號,進(jìn)而找到相應(yīng)的驅(qū)動例程。

4 CAN驅(qū)動程序的實(shí)現(xiàn)

CAN驅(qū)動程序的實(shí)現(xiàn)即是完成下面七個函數(shù)的編寫。下面簡要介紹其完成的功能,并用偽指令進(jìn)行說明。

int drv_num; ;/*驅(qū)動號碼*/

typedef struct {

DEV_HDR pCANHDR; /*這個數(shù)據(jù)結(jié)構(gòu)必須放在設(shè)備描述符的最初部分*/

/*其余與驅(qū)動有關(guān)數(shù)據(jù)*/

}CAN_DEV; /*CAN設(shè)備描述符*/

CAN_DEV can_chan_dev;

STATUS CanDrv(void){

完成驅(qū)動的一些初始化;

intconnect(); /*連接所選的IRQ與中斷處理函數(shù)*/

sysIntEnablePIC(); /*486DX允許中斷*/

drv_num=iosDrvInstall(CanOpen,NULL,CanOpen,CanClose,CanRead,CanWrite,CanIoctl);/*將設(shè)備驅(qū)動例程裝入設(shè)備列表中*/

}

/*iosDrvInstall()將設(shè)備的CAN驅(qū)動例程加入設(shè)備驅(qū)動列表中,7個參數(shù)為7個驅(qū)動例程的進(jìn)入點(diǎn)(entry point),如果沒有某個例程,則傳遞NULL。*/

STATUS CanDevCreate(){

完成一些設(shè)備初始化

iosDevAdd (&Can_chan_dev.pCANHDR,“can0”,drv_num);/*將設(shè)備放入設(shè)備驅(qū)動列表中*/

}

int CanOpen(CAN_DEV *pCan_Dev,UBYTE *remainder,int flags){

CAN卡硬件復(fù)位

CAN卡關(guān)中斷

CAN卡進(jìn)入軟件復(fù)位模式

設(shè)置CAN卡工作寄存器,如接收碼寄存器和屏蔽碼寄存器等

CAN卡開中斷和進(jìn)入操作模式

Return((int)pCan_Dev); /*注意必須返回設(shè)備描述結(jié)構(gòu)指針*/

}

int CanRead(int CAN_DEV_ID,UBYTE * buf,int nBytes){

等待信號量(該信號量由中斷處理例程釋放)

從接收緩沖區(qū)讀取數(shù)據(jù)

釋放接收緩沖

返回接收數(shù)據(jù)數(shù)量

}

int CanWrite(int CAN_DEV_ID,UBYTE* buf,int nbyte){

查詢發(fā)送緩沖是否可用

向發(fā)送緩沖區(qū)寫數(shù)據(jù)

命令發(fā)送

查詢發(fā)送完成標(biāo)志

返回發(fā)送數(shù)據(jù)數(shù)量

}

void interrupt_handle_routin(int arg){

處理中斷事件

發(fā)送(釋放)信號量

}

限于篇幅,其它函數(shù)略。

圖3 I/O系統(tǒng)整體結(jié)構(gòu)

5 CAN驅(qū)動調(diào)試

硬件驅(qū)動的調(diào)試是件十分麻煩的事,經(jīng)驗(yàn)十分重要。這里簡要介紹幾個幫助調(diào)試的函數(shù)。

①可以調(diào)用iosDrvShow()、iosDevShow()及iosFdShow()查看相關(guān)內(nèi)容,判斷并將驅(qū)動及設(shè)備中入相應(yīng)列表。

②使用logMsg()現(xiàn)實(shí)相關(guān)內(nèi)容,以定位錯誤。

初期調(diào)試,示波器和信號燈是非常有用的,可以確定硬件的工作狀況,從而有助于發(fā)現(xiàn)程序中的錯誤。

篇(8)

PCI總線規(guī)范是為提高微機(jī)總線的數(shù)據(jù)傳輸速度而制定的一種局部總線標(biāo)準(zhǔn)。在設(shè)計(jì)自行開發(fā)的基于PCI總線的數(shù)據(jù)傳輸設(shè)備時,需要開發(fā)相應(yīng)的設(shè)備驅(qū)動程序。通常開發(fā)PCI設(shè)備驅(qū)動程序有多種模式,在Windows2000環(huán)境下,主要采用WDM模式。本文針對自行開發(fā)的基于PCI總線的CCD視頻信號傳輸控制卡,編寫了符合WDM模式的驅(qū)動程序。

1WDM模式驅(qū)動程序

1.1WDM模式(WindowsDriverModel)

Windows2000對驅(qū)動程序的編寫不再基于以往的Win3.x和Win9x下的VxD(虛擬設(shè)備驅(qū)動程序)結(jié)構(gòu),而是基于一種新的驅(qū)動模型——WDM(WindowsDriverModel)。

WDM為Windows98/2000/XP操作系統(tǒng)的設(shè)備驅(qū)動程序的設(shè)計(jì)提供了統(tǒng)一的框架。WDM來源于WindowsNT的分層32位設(shè)備驅(qū)動程序模型(layered32-bitdevicedrivermodel)。它支持更多的特性,如即插即用(PnP)、電源管理、WMI和NT事件。

1.2設(shè)備驅(qū)動程序

設(shè)備驅(qū)動程序是操作系統(tǒng)的一個組成部分,它由I/O管理器(I/OManager)管理和調(diào)動。Windows2000操作系統(tǒng)下的I/O管理器功能描述如圖1所示。

I/O管理器每收到一個來自用戶應(yīng)用程序的請求就創(chuàng)建一個I/O請求包(IRP)的數(shù)據(jù)結(jié)構(gòu),并將其作為參數(shù)傳遞給驅(qū)動程序。驅(qū)動程序通過識別IRP中的物理設(shè)備對象(PDO)來區(qū)別是發(fā)送給哪一個設(shè)備。IRP結(jié)構(gòu)中存放請求的類型、用戶緩沖區(qū)的首地址、用戶請求數(shù)據(jù)的長度等信息。驅(qū)動程序處理完這個請求后,在該結(jié)構(gòu)中填入處理結(jié)果的有關(guān)信息,調(diào)用IoCompleteRequest將其返回給I/O管理器,用戶應(yīng)用程序的請求隨即返回。訪問硬件時,驅(qū)動程序通過調(diào)用硬件抽象層的函數(shù)實(shí)現(xiàn)。

1.3DriverStudio工具簡介

NuMegaLab公司開發(fā)的DriverStudio是一整套開發(fā)、調(diào)試和檢測Windows平臺下設(shè)備驅(qū)動程序的工具軟件包。它把DDK(DeviceDevelopmentKit)封裝成完整的C++函數(shù)庫,根據(jù)具體硬件通過向?qū)煽蚣艽a,并且提供了一套完整的調(diào)試和性能測試工具SoftICE、DriverMonitor等。

2應(yīng)用實(shí)例

本文利用PCI專用接口芯片PCI9052設(shè)計(jì)了一個數(shù)據(jù)傳輸控制卡。卡上主要的芯片有PCI9052、FIFO(CY7C4221)、CPLD(MAX7064S)和A/D轉(zhuǎn)換器(MAX1197)。傳輸卡硬件框圖如圖2所示。面陣CCD得到的視頻信號經(jīng)過調(diào)理電路,生成的視頻調(diào)理信號通過A/D轉(zhuǎn)換器進(jìn)行數(shù)字化處理,送入FIFO中。在CPLD的控制下,數(shù)據(jù)經(jīng)過PCI9052送入PCI總線,再傳送到計(jì)算機(jī)內(nèi)存中,并顯示在監(jiān)視器上。驅(qū)動程序必須實(shí)現(xiàn)如下幾個基本功能:(1)硬件中斷;(2)能支持應(yīng)用程序獲取數(shù)據(jù);(3)能根據(jù)外部FIFO(CY7C4221)的狀態(tài)啟動或停止突發(fā)傳輸。

在數(shù)據(jù)輸入過程中,最重要的是對數(shù)據(jù)進(jìn)行實(shí)時控制,因此需要硬件中斷。在中斷程序中,根據(jù)外部FIFO狀態(tài)完成數(shù)據(jù)的讀入。

2.1用DriverWizard生成驅(qū)動程序框架

DriverStudio中的DriverWorks軟件為開發(fā)WDM程序提供了一個完整的框架。它包含一個可快速生成WDM驅(qū)動程序框架的代碼生成向?qū)Чぞ逥riverWizard,而且還帶有許多類庫。在用DriverWizard生成的程序框架中寫入相對于設(shè)備的特定代碼,編譯后即可得到所需的驅(qū)動程序。

在利用DriverWorksV2.7的向?qū)riverWizard完成驅(qū)動程序的框架時共有11個步驟,其中關(guān)鍵步驟有:

(1)在第四步中選中PCI,并在VendorID和DeviceID中分別輸入廠商號和設(shè)備號,還需填入PCISubsystemID和PCIRevisionID。這四項(xiàng)可以用網(wǎng)上的免費(fèi)軟件PCITree或PCIView瀏覽PCI設(shè)備,用這兩個軟件也可以得到BAR0~BAR5的資源分配情況和中斷號。

(2)第七步IRP隊(duì)列排隊(duì)方法,它決定了驅(qū)動程序檢查設(shè)備的方式。本設(shè)計(jì)選SystemManaged,則所有的IRP排隊(duì)都由系統(tǒng)(即I/O管理器)完成。

(3)第九步是最關(guān)鍵的一步。首先在Resources中添加資源,在name中輸入變量名,在PCIBaseAddress中輸入0~5的序列號。0~5和BAR0~BAR5一一對應(yīng)。在設(shè)置中斷對話框中,在name欄寫入中斷服務(wù)程序的名稱,選中創(chuàng)建中斷服務(wù)程序ISR?穴CreateISR?雪,不選創(chuàng)建延遲程序調(diào)用DPC(CreateDPC),選中MakeISR/DPCclassfunctions,使ISR/DPC成為設(shè)備類的成員函數(shù)。

其次選中Buffer以選取讀寫方式,用于描述與I/O操作相關(guān)的數(shù)據(jù)緩沖區(qū)。本設(shè)計(jì)需要快速傳送大量數(shù)據(jù),因此采用DirectI/O方式。

(4)在第十步中,需要加入與應(yīng)用程序或者其他驅(qū)動程序通信的I/O控制代碼參量。

2.2驅(qū)動程序模塊框圖和代碼分布

PCI設(shè)備驅(qū)動程序模塊包括配置空間的訪問模塊、IO端口模塊、內(nèi)存讀寫模塊和終端模塊等。各模塊之間是對等的。驅(qū)動程序模塊框圖如圖3所示。

驅(qū)動程序初始化模塊代碼段放在#pragmacode_seg(″INT″)和#pragmacode_seg()之間。在系統(tǒng)初始化完成后,這部分代碼從內(nèi)存中釋放,防止占用系統(tǒng)寶貴的內(nèi)存資源。#pragmacode_seg()之后是驅(qū)動程序和系統(tǒng)的許多模塊的實(shí)現(xiàn)部分。這部分在驅(qū)動程序運(yùn)行后不會從內(nèi)存中釋放。

2.3驅(qū)動程序主要模塊的實(shí)現(xiàn)

(1)配置空間的訪問模塊

DriverWorks的KPciConfiguration類封裝了訪問PCI設(shè)備配置空間的所有操作。首先初始化這個類的實(shí)例:

KpciConfigurationPciConfig()m_Lower.TopOfStack());

/?觹m_Lower是KpnpLowerDevice類的對象。m_LowerTopOfStack()返回當(dāng)前設(shè)備堆棧頂部的設(shè)備對象。*/

初始化完后可以直接利用成員函數(shù)ReadHeader/WriteHeader函數(shù)訪問所有的配置寄存器。

為了確定映射空間的類型和大小,先向目標(biāo)基地址寄存器寫入0Xffffffffh,然后回讀該寄存器的值。如果最低位為1,表示映射于I/O空間,反之為存儲空間;如果映射于存儲空間,從第四位開始計(jì)算0的個數(shù)可以確定內(nèi)存空間的大小;如果是I/O方式,從第二位開始計(jì)算0的個數(shù)可確定I/O空間的大小,最大為256字節(jié)。如果設(shè)備的存儲空間超過256字節(jié),要實(shí)現(xiàn)設(shè)備的整個存儲部分的訪問,就必須采用內(nèi)存映射。

(2)I/O操作模塊

Driverworks的KIoRange類封裝了I/O端口訪問的操作。部分代碼如下:

{……

KIORangeDevIoPort();//創(chuàng)建實(shí)例

NTSTATUSstatus=DevIoPort().Initialize(pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0));

/*第一個參數(shù)為轉(zhuǎn)換后的資源列表指針;第二個參數(shù)為原始資源列表指針;第三個參數(shù)中的0為I/O口對應(yīng)的基地址,用來轉(zhuǎn)換成特定端口資源的序數(shù)?*/

If(NT_SUCCESS(status))

{……

DevIoPort.inb(0,LineBuf1,10);

/*成功初始化后可分別用KIoRange類的成員函數(shù)inb(/outb)從端口中讀/寫字節(jié)*/

}

else{Invalidate();returnstatus;

/*未能初始化成功,錯誤信息在status中*/

{

……}

(3)內(nèi)存讀寫模塊

DriverWorks的KMemoryRange類封裝了端口訪問的操作。

status=m_M(jìn)emoryRange().Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddressIndexToOrdinal(0));

此函數(shù)的參數(shù)、意義及具體用法與I/O端口的操作基本相同。

內(nèi)存對象也用來發(fā)送控制字,以控制CPLD的開始和停止等。實(shí)際上控制字是通過PCI9052發(fā)送的。該控制字地址已被映射成PCI的內(nèi)存空間。所以定義一個指向內(nèi)存空間的內(nèi)存對象,通過該對象即可發(fā)送控制字。

(4)中斷模塊

在中斷模塊,首先要激活PCI9052中斷使能位,然后判斷硬件中斷響應(yīng)是否產(chǎn)生,如果有,則進(jìn)行突發(fā)傳輸,讀入FIFO中的數(shù)據(jù)。

BOOLEANTranCard::Isr_M(jìn)yIrq(void)

{if(//中斷未產(chǎn)生)

{……

returnFALSE;}

else

{/*如果產(chǎn)生硬件中斷,設(shè)置命令寄存器,進(jìn)行突發(fā)數(shù)據(jù)傳輸*/

returnTRUE;}

}

為了將硬件中斷與編寫的中斷服務(wù)程序連接在一起,采用InitializeAndConnect方法,部分代碼如下:

NTSTATUSTranCardDevice?押?押OnStartDevice(KIrpI)

{……

status=m_M(jìn)yIrq.InitializeAndConnect(

pResListTranlated,

LinkTo(Isr_M(jìn)yIrq),

This;)

……}

2.4驅(qū)動程序的調(diào)用

編寫驅(qū)動程序本身不是最終目的,最終目的是調(diào)用驅(qū)動程序管理資源,并為用戶應(yīng)用程序使用。驅(qū)動程序加載以后,它的許多進(jìn)程處于Idle狀態(tài),實(shí)際上需要用戶應(yīng)用程序去調(diào)用激活。應(yīng)用程序利用Win32API直接調(diào)用驅(qū)動程序,實(shí)現(xiàn)驅(qū)動程序和應(yīng)用程序的信息交互。

首先用CreateFile()打開設(shè)備,獲得一個指向設(shè)備對象的句柄。使用CreateFile函數(shù)時應(yīng)注意:由于驅(qū)動程序是*.sys,所以第一個參數(shù)應(yīng)該是這個設(shè)備對象的標(biāo)志連接(symboliclink)。該標(biāo)志連接名有一個設(shè)置數(shù)據(jù)文件搜索路徑的數(shù)字號,而這個數(shù)字號通常是零。如果這個連接名是″TranCard″,則傳遞給CreateFile的宇符串就是:″\\\\.\\TranCard0″。例如:

HANDLEhDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL?,OPEN_EXISTING,0,NULL);

然后用DeviceIoControl()進(jìn)行數(shù)據(jù)的傳送。最后用CloseHandle()關(guān)閉設(shè)備句柄。

下面是應(yīng)用DeviceIoControl()程序片段。

{……

m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_

RECEIVE(buffer,sizeof,buffer,NULL,0,&buffersize,NULL);

……}

2.5驅(qū)動程序的調(diào)試

篇(9)

1.1學(xué)生感到程序設(shè)計(jì)較難理解

計(jì)算機(jī)程序設(shè)計(jì)的學(xué)習(xí)困境主要表現(xiàn)在概念難懂,技術(shù)難以掌握,理論與實(shí)踐的脫節(jié)等方面,尤其是在程序語言學(xué)習(xí)中面向?qū)ο蟪绦蛟O(shè)計(jì)語言時,絕大多數(shù)的學(xué)生不理解面向?qū)ο蟪绦蛟O(shè)計(jì)思想,不會使用類的思想進(jìn)行程序設(shè)計(jì)。往往感到困難重重而方式深入學(xué)習(xí),導(dǎo)致學(xué)習(xí)成績節(jié)節(jié)下滑,不利于后來其他計(jì)算機(jī)專業(yè)課的學(xué)習(xí)。

1.2主動學(xué)習(xí)能力差

學(xué)生長期在傳統(tǒng)應(yīng)試教育環(huán)境影響下,形成了被動學(xué)習(xí)的習(xí)慣,缺乏學(xué)習(xí)的積極性與主動性,另外還有一些學(xué)生養(yǎng)成的不良學(xué)習(xí)習(xí)慣,在課堂學(xué)習(xí)中情緒比較懶散,精神比較散漫,對教師所講的內(nèi)容沒有興趣,這樣很難提高學(xué)生學(xué)習(xí)成績,影響教學(xué)效果的提高。

1.3實(shí)踐能力不高

計(jì)算機(jī)是一門實(shí)踐性比較強(qiáng)的學(xué)科,不僅需要學(xué)生掌握基本的理論知識,更重要的是理論應(yīng)用于實(shí)際的能力,因?yàn)閷W(xué)習(xí)計(jì)算機(jī)的目的就是解決實(shí)際中遇到的問題。但是在實(shí)際教學(xué)中,很多教師設(shè)計(jì)的教學(xué)目標(biāo)脫離學(xué)生的應(yīng)用宗旨,教學(xué)過程中理論課比較多,實(shí)踐課程比較少,這樣較難培養(yǎng)學(xué)生的實(shí)際動手操作能力,很難真正提高教學(xué)效果。

1.4教學(xué)方法單一

過去教師一般采用傳統(tǒng)的教學(xué)方法,從程序設(shè)計(jì)的概念出發(fā),圍繞理論知識點(diǎn)加以講解,過多注重理論知識的講解,而教材中的實(shí)力一般與學(xué)生實(shí)際生活相差較遠(yuǎn),學(xué)生在學(xué)習(xí)的過程中感到生澀難懂,只會比葫蘆畫瓢,不會舉一反三,缺乏獨(dú)立思考問題和解決問題的能力。教師在教學(xué)過程中忽略了學(xué)生的主體地位,較難提高學(xué)生學(xué)習(xí)興趣,同時也達(dá)不到較好的學(xué)習(xí)效果。

2項(xiàng)目驅(qū)動教學(xué)模式特點(diǎn)

2.1項(xiàng)目實(shí)踐環(huán)境突出

項(xiàng)目驅(qū)動教學(xué)過程中,導(dǎo)師帶領(lǐng)學(xué)生在學(xué)習(xí)專業(yè)理論知識的同時進(jìn)行實(shí)際應(yīng)用項(xiàng)目的開發(fā)。學(xué)生與老師在學(xué)習(xí)的過程中始終處于一種相互配合、溝通的環(huán)境下,強(qiáng)調(diào)學(xué)生的自主學(xué)習(xí)、積極溝通、勇于實(shí)踐。學(xué)生在項(xiàng)目驅(qū)動下,帶著問題進(jìn)行有效的學(xué)習(xí),這樣能夠培養(yǎng)學(xué)生思維擴(kuò)散能力、動手操作能力與團(tuán)結(jié)合作精神。

2.2強(qiáng)調(diào)教師的引導(dǎo)作用

項(xiàng)目驅(qū)動教學(xué)模式注重把理論知識轉(zhuǎn)化為實(shí)際技術(shù),在教學(xué)過程中教師僅僅起引導(dǎo)學(xué)習(xí)的作用,課堂的主體是學(xué)生。學(xué)生按照項(xiàng)目需求被劃分為若干個小組,導(dǎo)師在課堂中主要監(jiān)督、指導(dǎo)學(xué)生行為,在項(xiàng)目學(xué)習(xí)過程中導(dǎo)師要隨時解答學(xué)生的疑問,為學(xué)生補(bǔ)充技能知識,實(shí)時啟發(fā)學(xué)生在項(xiàng)目學(xué)習(xí)中解決問題的正確思路,開發(fā)學(xué)生思維創(chuàng)造能力,幫助學(xué)生掌握項(xiàng)目技能。

2.3培養(yǎng)學(xué)生計(jì)算機(jī)專業(yè)能力

項(xiàng)目驅(qū)動模式的實(shí)施目的是提高學(xué)生軟件開發(fā)與應(yīng)用能力,事件性知識一般比較隱蔽,而項(xiàng)目驅(qū)動教學(xué)能夠通過教學(xué)過程中各種功能的實(shí)施,使一些隱藏在軟件開發(fā)過程中的核心要素顯現(xiàn)出來,通過這種方式的學(xué)習(xí),學(xué)生將很快的具備軟件應(yīng)用開的基本能力,提高學(xué)生實(shí)踐能力與應(yīng)用能力。

3項(xiàng)目驅(qū)動教學(xué)實(shí)施過程

3.1項(xiàng)目設(shè)計(jì)

項(xiàng)目驅(qū)動模式教學(xué)過程中,首先導(dǎo)師要根據(jù)程序設(shè)計(jì)教學(xué)內(nèi)容,設(shè)定教學(xué)目標(biāo),將教學(xué)計(jì)劃、目標(biāo)融入到教學(xué)項(xiàng)目中,然后將整個教學(xué)項(xiàng)目按照學(xué)習(xí)小組分成若干個獨(dú)立的小項(xiàng)目,再把這些小項(xiàng)目按組分配給學(xué)生,最后導(dǎo)師圍繞項(xiàng)目內(nèi)容設(shè)計(jì)具體教學(xué)內(nèi)容,項(xiàng)目來源一般源自于教師縱橫向教學(xué)項(xiàng)目。

3.2實(shí)施形式

利用項(xiàng)目驅(qū)動模式進(jìn)行教學(xué)的過程中,學(xué)生需要進(jìn)入專門的工作室進(jìn)行軟件程序的學(xué)習(xí)與開發(fā)。在工作室中,主要的學(xué)習(xí)方式是自學(xué),教師在這種模式下主要起引導(dǎo)作用,課程知識除了很少部分較深的理論課由導(dǎo)師專門講授以外,其他的課程都是學(xué)生圍繞項(xiàng)目進(jìn)行自主學(xué)習(xí)、合作學(xué)習(xí),主要學(xué)習(xí)方式包括:小組研討、導(dǎo)師解疑、技術(shù)交流、調(diào)查研究等形式;課程的具體的實(shí)施要根據(jù)教學(xué)內(nèi)容以及學(xué)生的實(shí)際認(rèn)知情況進(jìn)行合理的分配。這種教學(xué)模式的目的在于各種信息技術(shù)及認(rèn)知提高計(jì)算機(jī)教學(xué)質(zhì)量和效率,培養(yǎng)學(xué)生自主學(xué)習(xí)能力、創(chuàng)新能力和勇于探索精神以及實(shí)踐能力。其中自主學(xué)習(xí)是由學(xué)生自己積極主動的去學(xué)習(xí),在學(xué)習(xí)過程中導(dǎo)師的角色是解答疑問,并不是直接幫學(xué)生解決問題,導(dǎo)師可以向?qū)W生傳授解決問題的方法和思路,引導(dǎo)學(xué)生向正確的解答思路上靠,提供給學(xué)生解決問題的資料,引導(dǎo)學(xué)生圍繞疑問積極探索。如果學(xué)生在學(xué)習(xí)過程中遇到難以解決的問題,導(dǎo)師首先要積極引導(dǎo)學(xué)生找到解決問題的方法,同時教會學(xué)生利用移動通信、互聯(lián)網(wǎng)、QQ以及電子郵件等先進(jìn)技術(shù)手段進(jìn)行搜索或者在線討論與交流,尤其要教會學(xué)生怎樣使用互聯(lián)網(wǎng)查詢資料,豐富程序設(shè)計(jì)知識,提高深深學(xué)習(xí)能力。在個人自主學(xué)習(xí)的基礎(chǔ)上進(jìn)行小組討論與交流,在交流中不僅擴(kuò)展知識與視野,而且能培養(yǎng)團(tuán)隊(duì)協(xié)作精神,增進(jìn)同學(xué)之間的感情。導(dǎo)師還要積極引導(dǎo)學(xué)生發(fā)現(xiàn)規(guī)律,找到自己的不足,積極改正,不斷超越自我。

3.3項(xiàng)目驅(qū)動教學(xué)模式中的成績評定

成績評定是項(xiàng)目驅(qū)動模式教學(xué)的重要組成部分,成績評定一般具有激勵、引導(dǎo)和反饋的作用,能夠全面反映學(xué)生的近況。成績評定比較重視學(xué)生在學(xué)習(xí)過程中能否解決實(shí)際問題,旨在培養(yǎng)學(xué)生動手操作的能力和創(chuàng)新能力以及計(jì)算機(jī)素養(yǎng),樹立科學(xué)精神和堅(jiān)韌不拔的性格以及積極向上的人生觀。如果學(xué)生成績提高,教師要給予鼓勵和表揚(yáng),激勵學(xué)生再接再厲。成績評定的方式采用項(xiàng)目答辯的形式進(jìn)行,每個小組派出一個代表作主辯手,其他學(xué)生補(bǔ)充,導(dǎo)師可以隨時提問,最后結(jié)合項(xiàng)目答辯情況給出學(xué)生最終考核成績。

篇(10)

中圖分類號:TP274.2 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2016)04-0000-00

在針對新一代多普勒氣象雷達(dá)實(shí)現(xiàn)多功能、多模式的目標(biāo)實(shí)現(xiàn)上同時獲得更高質(zhì)量的數(shù)據(jù),對獲取雷達(dá)數(shù)據(jù)的速率和容量的要求越來越高。而伴隨軟件無線電技術(shù)的突破,雷達(dá)作業(yè)系統(tǒng)將有可能要直接從射頻采樣中獲得更豐富的數(shù)據(jù)。這些氣象雷達(dá)領(lǐng)域技術(shù)的發(fā)展,都對雷達(dá)高速數(shù)據(jù)采集傳輸提出了新的需求,現(xiàn)有的氣象雷達(dá)數(shù)據(jù)傳輸帶寬已經(jīng)不能滿足需要了。對基于計(jì)算機(jī)平臺的氣象雷達(dá)作業(yè)系統(tǒng),提出了關(guān)鍵部件商品斷檔和已有技術(shù)須適應(yīng)計(jì)算機(jī)硬件環(huán)境的挑戰(zhàn)。鑒于現(xiàn)階段的各個類型的氣象雷達(dá)中,雷達(dá)數(shù)據(jù)還主要基于PCI總線進(jìn)行傳輸,數(shù)據(jù)帶寬已經(jīng)不能適應(yīng)現(xiàn)代氣象雷達(dá)的發(fā)展,為保障已有氣象雷達(dá)設(shè)備能夠得到后續(xù)升級技術(shù)的儲備,研究氣象雷達(dá)數(shù)據(jù)在PCI-Express總線上的技術(shù)[1],將能解決主流計(jì)算機(jī)淘汰的PCI接口對氣象雷達(dá)數(shù)據(jù)處理后續(xù)發(fā)展的問題。

1 氣象雷達(dá)信號處理器介紹

該信號處理器是氣象雷達(dá)視頻I/Q數(shù)據(jù)采集和系統(tǒng)參數(shù)控制的核心板卡,其主要完成了PC機(jī)對中頻I/Q數(shù)據(jù)采集,接收機(jī)、發(fā)射機(jī)控制功能,其性能的好壞直接影響到了整個雷達(dá)系統(tǒng)的正常運(yùn)行。通過接收串行格式的中頻數(shù)據(jù),并將數(shù)據(jù)按照預(yù)先設(shè)定進(jìn)行儲存,經(jīng)由PCI-Express接口定時通知計(jì)算機(jī)獲取數(shù)據(jù)。也能通過它發(fā)送大量參數(shù)到外部串行接口,對硬件進(jìn)行指定的參數(shù)傳遞。該雷達(dá)信號處理器采用美國PERICOM公司的PI7C9X130作為本地總線和PCI-Express總線的接口。PI7C9X130是一款x4的PCI-Express to PCI-X/PCI橋接芯片,本地端總線頻率最高可達(dá)133MHZ,數(shù)據(jù)位寬64bit。PI7C9X130擁有4KB的配置空間,其中前256字節(jié)是和PCI設(shè)備功能上是兼容的,其余是PCI-Express擴(kuò)展配置空間[2]。

2 驅(qū)動程序設(shè)計(jì)

總線驅(qū)動程序由系統(tǒng)提供,本文只設(shè)計(jì)了PI7C9X130的功能驅(qū)動程序,它主要由驅(qū)動程序初始化、雙緩沖數(shù)據(jù)傳輸模塊兩部分組成。基本思想是:驅(qū)動內(nèi)設(shè)置DMA緩存和數(shù)據(jù)緩存(比DMA緩存大),采用中斷方式獲取板卡數(shù)據(jù),當(dāng)驅(qū)動收到一個外部數(shù)據(jù)中斷時,啟動DMA讀取乒乓FIFO中的數(shù)據(jù)到DMA緩存,每次讀完后,都復(fù)制DMA緩存到數(shù)據(jù)緩存區(qū),以匹配DMA傳輸與上層應(yīng)用程序Read數(shù)據(jù)的速度。

2.1 WDF驅(qū)動程序設(shè)計(jì)

DriverEntry是驅(qū)動程序的入口函數(shù),負(fù)責(zé)初始化和構(gòu)造驅(qū)動程序?qū)ο蟆O到y(tǒng)啟動時,如果檢測到PI7C9X130的存在,I/O管理器會創(chuàng)建一個未初始化的驅(qū)動程序?qū)ο蟛⑺鳛橐粋€參數(shù)傳給DriverEntry。DriverEntry根據(jù)這個對象創(chuàng)建WDFDRIVER對象,并注冊DeviceAdd例程并在此例程中進(jìn)行設(shè)備驅(qū)動初始化,包括創(chuàng)建設(shè)備擴(kuò)展對象并分配初始化各個子對象,包括WDFINTERRUPT、WDFQUEUE、WDFDPC、 WDFDMAENABLR等[3]。

2.2 雙緩存數(shù)據(jù)傳輸

功能驅(qū)動正常裝載后,應(yīng)用程序就可以向驅(qū)動發(fā)起打開中斷請求,數(shù)據(jù)卡在中斷開啟的情況下在獲得數(shù)據(jù)后會產(chǎn)生外部中斷,在驅(qū)動中斷處理服務(wù)例程中,排隊(duì)一個DMA傳輸DPC(Delayed Procedure Call)事件,進(jìn)行數(shù)據(jù)傳輸。當(dāng)DMA完成傳輸,產(chǎn)生DMA完成中斷,通過中斷服務(wù)例程排隊(duì)一個數(shù)據(jù)復(fù)制事件,把DMA緩存的數(shù)據(jù)復(fù)制到數(shù)據(jù)緩存中。應(yīng)用程序只要調(diào)用Read,就可以讀取數(shù)據(jù)緩存中的雷達(dá)中頻數(shù)據(jù),而不用擔(dān)心因?yàn)檫M(jìn)程切換等系統(tǒng)因素導(dǎo)致的DMA數(shù)據(jù)傳輸和應(yīng)用層Read速度不匹配問題。

2.3 內(nèi)核驅(qū)動程序調(diào)試

本文采用微軟隨WDK一起的調(diào)試工具WinDbg調(diào)試驅(qū)動程序。WinDbg是一種內(nèi)核模式和用戶模式的調(diào)試器,可以用來分析故障存儲文件和執(zhí)行驅(qū)動程序代碼。采用雙機(jī)調(diào)試:目標(biāo)機(jī)(氣象雷達(dá)信號處理器)和主機(jī)(運(yùn)行WinDbg的機(jī)器),用串口線連接,主機(jī)控制和監(jiān)視目標(biāo)機(jī)上的活動[4]。設(shè)置好主機(jī)和目標(biāo)機(jī)后,通過WinDbg的命令窗口可以設(shè)置斷點(diǎn)、觀察調(diào)試輸出信息或分析目標(biāo)機(jī)藍(lán)屏產(chǎn)生的故障存儲文件。

3 結(jié)語

本文介紹了基于PCI-Express總線的氣象雷達(dá)信號處理器的驅(qū)動程序開發(fā)。經(jīng)實(shí)測,該數(shù)據(jù)處理器穩(wěn)定傳輸速度達(dá)到530Mbyte/s,超越原基于PCI總線的數(shù)據(jù)處理器速度,適應(yīng)氣象雷達(dá)大幅度增長的探測原始信息量,為新一代多普勒氣象雷達(dá)關(guān)鍵技術(shù)的發(fā)展提供了可行的方案。

參考文獻(xiàn)

[1] 何建新.現(xiàn)代天氣雷達(dá)[M].四川:電子科技大學(xué)出版社,2004-05.

[2] 孟會,劉雪峰.PCI Express總線技術(shù)分析[J].計(jì)算機(jī)工程,2006(32):252-258.

[3] 武安河.Windows設(shè)備驅(qū)動程序WDF開發(fā)[M].北京.電子工業(yè)出版社,2009

篇(11)

1 嵌入式Linux系統(tǒng)

1.1 Linux操作系統(tǒng)

Linux是一套可以免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),其實(shí)際上只是一個操作系統(tǒng)的內(nèi)核,主要用于Intel x86系列CPU的計(jì)算機(jī)上[ ]。

談及Linux的起源,其靈感源自于UNIX。UNIX操作系統(tǒng)于1969年由Bell實(shí)驗(yàn)室設(shè)計(jì)開發(fā),之后Linus Torvalds設(shè)計(jì)了Linux,該系統(tǒng)在發(fā)展初期就得到了廣大程序員的幫助,逐步發(fā)展成為現(xiàn)今這樣一個擁有自己版權(quán)的完整的系統(tǒng)。

Linux具有很多特點(diǎn),如支持多種體系結(jié)構(gòu),支持大量的設(shè)備,具有完善的網(wǎng)絡(luò)功能,開放源代碼,軟件資源豐富,內(nèi)核穩(wěn)定等,可總結(jié)為以下幾點(diǎn):

(1)強(qiáng)大的編程能力[ ]。由于Linux源自于世界各地成千上萬的程序員和黑客,使得Linux就猶如加入到了一個高手如云的編程組織中,同時,由于GPL的存在,Linux開放源碼,吸引更多專業(yè)人士的加入,在這種需求的刺激下,Linux提供的開發(fā)工具功能也越來越完善,越來越強(qiáng)大。

(2)完善的組網(wǎng)能力。Linux具有強(qiáng)大的組網(wǎng)能力,它對當(dāng)前的TCP/IP協(xié)議[ ]提供了完全的支持,同時也支持下一代Internet協(xié)議IPv6。在安全性方面,Linux內(nèi)核中包括了IP防火墻代碼、IP防偽及IP服務(wù)質(zhì)量控制等特性。現(xiàn)階段,Linux廣泛用于服務(wù)器,其可以作為Windows客戶機(jī)的打印和文件服務(wù)器,也可用做NT的文件和打印服務(wù)器,甚至可作為Macintosh客戶機(jī)的文件和打印服務(wù)器。另外,Linux還包括了一個Ftp服務(wù)器、一個電子郵件傳輸程序以及POP和IMAP郵件服務(wù)程序。

(3)Linux是自由開放的。Linux是自由軟件,允許成千上萬的人檢查軟件,修改軟件,最終可以按照用戶自己的意愿來定義自由軟件,可以定制自己的Linux。

(4)系統(tǒng)穩(wěn)定。Linux提供了完全的內(nèi)存保護(hù)機(jī)制,每個進(jìn)程都運(yùn)行在各自的虛擬地址空間中,不會損壞進(jìn)程或內(nèi)核使用的地址空間。一臺運(yùn)行Linux的機(jī)器啟動一次可以運(yùn)行數(shù)個月。在安全性的較量上,Linux明顯比Windows98和NT占上風(fēng)。據(jù)統(tǒng)計(jì)分析,Linux是目前最安全的操作系統(tǒng)。

1.2 嵌入式系統(tǒng)

最早期的8位/16位系統(tǒng),大多都是沒有操作系統(tǒng)的,然而在進(jìn)入32位時代之后,系統(tǒng)軟件變得越來越復(fù)雜,出現(xiàn)了控制能力不夠,維護(hù)成本過高,系統(tǒng)升級困難等問題,促使了操作系統(tǒng)的迅猛發(fā)展。而嵌入式操作系統(tǒng),則被定義為“以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng),對功能、可靠性、成本、功耗等方面有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)”。

嵌入式操作系統(tǒng)的特點(diǎn)有:提供較好的內(nèi)核管理、多任務(wù)管理、資源管理、穩(wěn)定性好、可裁剪和配置、滿足實(shí)時性需求、針對性強(qiáng)等。隨著計(jì)算機(jī)信息技術(shù)的不斷發(fā)展,嵌入式操作系統(tǒng)也在不斷演化升級,常見的有uC/OSⅡ操作系統(tǒng),eCOS操作系統(tǒng),VxWorks嵌入式實(shí)時操作系統(tǒng),WinCE操作系統(tǒng)以及Linux操作系統(tǒng)等。嵌入式Linux利用嵌入式系統(tǒng)實(shí)時性、穩(wěn)定性的特性和Linux相輔相成,很好的彌補(bǔ)了Linux實(shí)時性差的缺點(diǎn),使得Linux在嵌入式領(lǐng)域發(fā)展迅速。近年來,嵌入式Linux操作系統(tǒng)的應(yīng)用相當(dāng)熱門,已經(jīng)廣泛應(yīng)用于筆記本電腦、連網(wǎng)裝置、網(wǎng)絡(luò)電視等各式各樣的通信基礎(chǔ)產(chǎn)品中。

2 系統(tǒng)硬件環(huán)境

2.1 Intel的XScale系統(tǒng)結(jié)構(gòu)

XScale系統(tǒng)結(jié)構(gòu)是對StrongARM的系統(tǒng)結(jié)構(gòu)的擴(kuò)充和改進(jìn)。Intel的第一個StrongARM處理器SA-110實(shí)現(xiàn)了ARM系統(tǒng)結(jié)構(gòu)的第4版,即ARMv4內(nèi)核。StrongARM是ARM公司的注冊商標(biāo),最初由ARM公司與當(dāng)時DEC公司聯(lián)合開發(fā),由DEC生產(chǎn)和銷售,但是后來由Intel生產(chǎn)。SA-110是第一個采用哈佛結(jié)構(gòu)的ARM內(nèi)核,因此,它有兩個獨(dú)立的高速緩存和兩個MMU。這樣取指令與讀/寫就不需要在時間上互相錯開,從而提高了訪問高速緩存的速度。

2.2 PXA27x處理器

PXA27x處理器是Intel公司在2004年4月12日正式的當(dāng)前最新的嵌入式處理器。它的時鐘頻率從312到624MHz,并內(nèi)建64MB(megabytes)的堆棧型IntelStrataFlash內(nèi)存。它內(nèi)置了Intel公司的無線MMX技術(shù),能夠?yàn)?D游戲與影片應(yīng)用提供更高的效能,顯著提升多媒體性能。312MHz的CPU(PXA27x系列中最低時鐘頻率的產(chǎn)品)將達(dá)到520MHzARMCPU的多媒體處理效能,而鐘頻達(dá)到624MHz則可以具備775MHzARMCPU的表現(xiàn)。

3 系統(tǒng)軟件環(huán)境的建立

3.1 嵌入式操作系統(tǒng)的選擇

嵌入式操作系統(tǒng)的選擇主要從以下幾個方面加以考慮。

①操作系統(tǒng)的硬件支持:首先是否支持目標(biāo)平臺,其次可移植性。②開發(fā)工具的支持程度:選擇嵌入式操作系統(tǒng)時必須考慮與之相關(guān)的開發(fā)工具。在線仿真器(ICE)、編譯器、匯編器、鏈接器、調(diào)試器以及模擬器等不同程度的影響到嵌入式軟件的開發(fā)。

③能否滿足應(yīng)用要求:應(yīng)用對操作系統(tǒng)的要求包括實(shí)時性能、不同語言的支持、標(biāo)準(zhǔn)兼容性、技術(shù)支持、源代碼還是目標(biāo)代碼等等。

若找不到一個合適的操作系統(tǒng)或者買不起昂貴的商用操作系統(tǒng),可以考慮自己建立一個操作系統(tǒng)。

3.2 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)

Trident PNX8471芯片平臺能夠接收BTSC(Broadcast Television System Committee),該平臺有兩個硬盤接口、一個MII 接口(Media Independent Interface,介質(zhì)無關(guān)接口或稱為媒體獨(dú)立接口,它是IEEE-802.3定義的以太網(wǎng)行業(yè)標(biāo)準(zhǔn)。它包括一個數(shù)據(jù)接口,以及一個MAC和PHY之間的管理接口)、2個USB2.0接口、1個USB1.1接口、5路TS輸入接口、2路I2C,支持3D圖形加速。在性能上支持:視頻支持1080P60輸出,支持H.264、MPEG2、VC-1、DiVX、AVS等格式,同時也支持RMVB格式480P的輸出,3DTV支持H.264 MVC 1080P30輸出;音頻支持BTSC、CH3/4,輸出支持YPbPr、RGB、Y/C、CVBS;TS處理方面最大支持5路基帶輸入和4路DMA輸入,最大支持192個Filter。

Trident PNX8471芯片平臺的編譯使用GNU3.81,Perl版本5.8.8,支持Android2.3,Linux內(nèi)核版本2.6.34。平臺在基于Android的架構(gòu)上增加了數(shù)字電視相關(guān)的功能模塊。實(shí)現(xiàn)本項(xiàng)目的EPG功能,同時兼顧EPG功能的擴(kuò)展性,我們需要在硬件抽象層增加Demux模塊,用來接收PSI/SI數(shù)據(jù),這個部分將是Program模塊、Event模塊、Time模塊公用的模塊;在Libraries層增加Program模塊、Event模塊、Time模塊,用來實(shí)現(xiàn)節(jié)目、事件、時間的功能;在應(yīng)用框架層(Application Framework)增加獲取EPG功能的EPG JNI接口;在應(yīng)用層增加EPG的呈現(xiàn)。

4 結(jié)語

嵌入式系統(tǒng)已成為以高速CPU和嵌入式操作系統(tǒng)為核心的軟硬件綜合系統(tǒng)。系統(tǒng)兼容性好,效率高,而且具備文件和目錄管理、設(shè)備支持、多任務(wù)、網(wǎng)絡(luò)支持、圖形窗口及用戶界面等功能。

參考文獻(xiàn):

[ ]彭曉明,王強(qiáng).Linux核心源代碼分析[M].北京:人民郵電大學(xué)出版社,2000.

[2]李善平,劉文峰.Linux與嵌入式系統(tǒng)[M].北京:清華大學(xué)出版社,2006.3.

主站蜘蛛池模板: 五大连池市| 湾仔区| 伊通| 苏州市| 分宜县| 砚山县| 揭阳市| 郓城县| 巴中市| 将乐县| 大宁县| 民乐县| 和林格尔县| 博爱县| 万安县| 景谷| 原阳县| 云梦县| 洪洞县| 楚雄市| 宝坻区| 玉环县| 油尖旺区| 闽清县| 外汇| 舞钢市| 金湖县| 宜城市| 通河县| 巴彦淖尔市| 祁阳县| 福清市| 麻城市| 新巴尔虎左旗| 同仁县| 武鸣县| 怀远县| 灵武市| 闵行区| 垣曲县| 永寿县|