精品国产一区二区三区四_av网站免费观看_国产一区二区免费视频_成人免费在线观看视频_久久精品一区二区三区四区_亚洲国产99

驅(qū)動程序設(shè)計(jì)優(yōu)選九篇

時間:2023-03-02 15:08:39

引言:易發(fā)表網(wǎng)憑借豐富的文秘實(shí)踐,為您精心挑選了九篇驅(qū)動程序設(shè)計(jì)范例。如需獲取更多原創(chuàng)內(nèi)容,可隨時聯(lián)系我們的客服老師。

第1篇

關(guān)鍵詞:wince 驅(qū)動程序;開發(fā);設(shè)計(jì)

1 引言

WINCE和Windows 98或Windows 2000不同,它可以工作在12種不同的處理器體系結(jié)構(gòu)、180余種CPU上;同時,WINCE是一個實(shí)時操作系統(tǒng)(實(shí)時系統(tǒng)的意義就是輸入的指令不必進(jìn)入隊(duì)列就可以馬上處理,過去我們使用的DDS就是實(shí)時系統(tǒng)),可以滿足應(yīng)用程序所需要的實(shí)時性要求。

Windows CE的模塊化設(shè)計(jì)使得它能夠在大量的平臺上定制使用,從客戶電子設(shè)備到專用的工業(yè)控制器。由于它是模塊化的,因而我們可以使用滿足平臺系統(tǒng)需求的最小軟件模塊和組件集合來設(shè)計(jì)嵌入式系統(tǒng)平臺,從而使內(nèi)存用量最小,但最大可能地提高操作系統(tǒng)的性能。因此外圍擴(kuò)展設(shè)備就必須要有硬件驅(qū)動才能正常工作。

和其它的操作系統(tǒng)一樣,Windows CE也提供設(shè)備驅(qū)動軟件,這些軟件的目的是驅(qū)動內(nèi)部和外圍的硬件設(shè)備,或?yàn)樗鼈兲峁┙涌凇TO(shè)備驅(qū)動程序?qū)⒉僮飨到y(tǒng)和設(shè)備鏈接起來,使得操作系統(tǒng)能夠識別設(shè)備或者為應(yīng)用程序提供設(shè)備服務(wù)。

Windows CE支持廣泛的基于各種CE平臺的設(shè)備驅(qū)動程序。也提供一些用于驅(qū)動程序開發(fā)的模型(model) ,其中包括來自其它操作系統(tǒng)的驅(qū)動程序模型(model),因?yàn)檫@些豐富多變的驅(qū)動程序模型, Windows CE適應(yīng)大部分的內(nèi)部和外圍設(shè)備口Microsoft Windows CE設(shè)備驅(qū)動程序工具包配備了文檔資料,這些文檔資料使得你能夠?yàn)閃indows CE創(chuàng)建設(shè)備驅(qū)動程序。目前,Windows CE提供了四種設(shè)備模型,其中兩種是專用于Windows CE的模型,另外兩種外部模型來自其它操作系統(tǒng)。

2 驅(qū)動程序開發(fā)簡介

2.1 開發(fā)工具

Windows CE驅(qū)動可以使用Platform Builder或者Visual Studio開發(fā),但是開發(fā)人員一般都使用Platform Builder開發(fā)設(shè)備驅(qū)動程序,對于部分驅(qū)動也會使用Visual Studio開發(fā),應(yīng)用程序開發(fā)人員更多的使用Visual Studio開發(fā)驅(qū)驅(qū)動程序。作為BSP(Board Support Package)的一部分進(jìn)行整體編譯開發(fā)。

2.2 驅(qū)動分類

2.2.1 按加載方式和接口類型分類

1) 本機(jī)驅(qū)動程序(Built-In Drivers)

通常由GWES加載,驅(qū)動接口一般都是定制的(Custom Purpose)。

2) 流驅(qū)動程序(Stream Drivers)

通常由Device Manager加載,驅(qū)動接口是標(biāo)準(zhǔn)的流式接口。

3) 混和型驅(qū)動程序

同時有定制式和流驅(qū)動兩套驅(qū)動接口,但是和系統(tǒng)交互只使用流式驅(qū)動接口,比如PC卡槽驅(qū)動。

2.2.2 按驅(qū)動層次分類

1) 層次型驅(qū)動程序(Layered Driver)

> MDD(Model Device Driver),與硬件無關(guān),面向上層應(yīng)用程序,一般由微軟建立統(tǒng)一框架;

> PDD(Platform Dependent Driver),針對具體硬件平臺的操作代碼,一般由驅(qū)動開發(fā)商實(shí)現(xiàn)MDD和PDD之間通過標(biāo)準(zhǔn)的設(shè)備驅(qū)動服務(wù)供應(yīng)商接口DDSI連接。

2) 獨(dú)立型驅(qū)動程序(Monolithic Driver)

> 獨(dú)立驅(qū)動程序包含了MDD面向上層應(yīng)用和PDD面向硬件平臺兩方面的代碼;

> 適用于操作不復(fù)雜的驅(qū)動;

> 減少了MDD和PDD傳遞之間傳遞信息的開銷,實(shí)時性更強(qiáng);

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

    流驅(qū)動程序必須實(shí)現(xiàn)一套標(biāo)準(zhǔn)接口,流驅(qū)動程序適用于IO操作,這也是嵌入式系統(tǒng)中最常見的設(shè)備驅(qū)動,操作接口和文件系統(tǒng)操作相似,通過CreateFile,ReadFile,WriteFile,IOControl函數(shù)等來操作應(yīng)用程序和流驅(qū)動交互,可以把設(shè)備當(dāng)作文件操作。

3.1 文件前綴名確定

    根據(jù)文件前綴名在系統(tǒng)中必須唯一這一特點(diǎn),在定義文件前綴名必須是三個字母,若有多個同類設(shè)備,由后綴一個阿拉伯?dāng)?shù)字區(qū)分,例如COM1,LPT3等等。文件前綴名將會在驅(qū)動的標(biāo)準(zhǔn)接口函數(shù)中體現(xiàn),比如XXX_Init,XXX_Close等。

3.2 通用函數(shù)

    根據(jù)設(shè)備的不同,所需函數(shù)不同,通用函數(shù)如下所示:

1) XXX_Init:通知設(shè)備管理器為設(shè)備初始化分配資源;

2) XXX_Deinit:通知設(shè)備管理器回收設(shè)備初始化時分配的資源;

3) XXX_Open:打開設(shè)備。應(yīng)用程序調(diào)用CreateFile時,通過文件系統(tǒng)映射為XXX_Open;

4) XXX_Close:關(guān)閉設(shè)備。應(yīng)用程序調(diào)用CloseFile時,通過文件系統(tǒng)映射為XXX_Close;

5) XXX_PowerUp:設(shè)備上電時,操作系統(tǒng)調(diào)用該函數(shù)完成必要的上電操作;

6) XXX_PowerDown:設(shè)備掉電時,操作系統(tǒng)調(diào)用該函數(shù)完成必要的關(guān)機(jī)操作

7) XXX_Read:從打開的設(shè)備文件中讀取數(shù)據(jù),可以通過ReadFile映射;

8) XXX_Write:向打開的設(shè)備文件寫數(shù)據(jù),可以通過WriteFile映射;

9) XXX_Seek:文件定位,根據(jù)設(shè)備情況決定是否支持;

10) XXX_IOControl:IO操作擴(kuò)展,可以根據(jù)設(shè)備情況來決定支持何種特殊的操作模式。

3.3 DEF文件建立

    流驅(qū)動一般以DLL形式存在,DEF文件定義了DLL需要導(dǎo)出的接口集,因此DEF文件的名稱與設(shè)備驅(qū)動名稱相同。

3.4 寫注冊表

    在wince中任何設(shè)備的識別都是通過注冊表來實(shí)現(xiàn)的,因此必須在注冊表中添加具體的設(shè)備驅(qū)動項(xiàng),以便系統(tǒng)識別。具體方法如下:

在注冊表中增加驅(qū)動程序入口點(diǎn),找到注冊表項(xiàng),注冊項(xiàng)位于注冊表的Root Key下,一般為[HKEY_LOCAL_MACHINEDriversBuiltInSampleDrv],建立必要的子鍵和鍵值,“Prefix”和“DLL”是兩個重要,而且是必須的鍵,分別描述了設(shè)備前綴名和驅(qū)動程序的動態(tài)連接庫名,然后根據(jù)具體設(shè)備的需要建立驅(qū)動程序需要的其子他鍵。

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

驅(qū)動程序編寫完畢后,就應(yīng)該進(jìn)行硬件的調(diào)試。具體方法如下:

4.1 調(diào)試區(qū)信息(Debug Zone)

調(diào)試區(qū)一般和WinCE的控制臺調(diào)試工具Cesh.exe配合調(diào)試,在不打斷OS運(yùn)行情況下,進(jìn)行驅(qū)動的實(shí)時調(diào)試,利用宏開關(guān),可以選擇需要輸出的調(diào)試區(qū)信息,可以得到進(jìn)程,線程和調(diào)試狀態(tài)信息。并且可以利用IDE環(huán)境,動態(tài)選擇開關(guān)調(diào)試區(qū)信息,但是打印驅(qū)動程序輸出調(diào)試信。必須借助于至少一種外設(shè)顯示調(diào)試信息,比如串口或者網(wǎng)卡或者其他通過調(diào)用RETAILMSG或者DEBUGMSG完成,不影響OS的運(yùn)行,保證驅(qū)動程序運(yùn)行的真實(shí)性,動態(tài)輸出設(shè)備的狀態(tài)信息,調(diào)試相對簡單,也是最廣泛使用的一種調(diào)試方法。

4.2 核心調(diào)試工具(Kernel Debugger)

核心調(diào)試工具將會禁止所有硬件中斷,掛起操作系統(tǒng),因此可以單步調(diào)試OS或者核心代碼,可以訪問堆棧信息,但是必須在Platform的環(huán)境下,利用至少一種外設(shè)進(jìn)行通信。

4.3 硬件輔助調(diào)試方法

利用硬件調(diào)試工具可以觀察物理設(shè)備的真實(shí)狀態(tài),一般常用的方法可以利用JTAG工具實(shí)時查看CPU內(nèi)部寄存器,利用邏輯分析儀或者示波器實(shí)時查看物理外設(shè)的輸入輸出狀態(tài)。利用指示LED來顯示驅(qū)動程序?qū)崟r狀態(tài)信息。

4.4 Visual Studio調(diào)試

可以利用VS內(nèi)置的調(diào)試工具進(jìn)行單步跟蹤,狀態(tài)調(diào)試等。

5 測試驅(qū)動程序

驅(qū)動程序經(jīng)過調(diào)試以后就需要對驅(qū)動的功能進(jìn)行測試。其常用的方法如下:

1) 寫一個應(yīng)用程序來測試驅(qū)動程序的正確性

2) 模擬各種可能發(fā)生的硬件輸入狀態(tài)來測試驅(qū)動程序的正確性

3) 利用Windows CE自帶的測試工具CETK來測試驅(qū)動程序的性能和完備性

6 驅(qū)動程序的集合和

6.1 驅(qū)動程序集成

驅(qū)動程序經(jīng)過調(diào)試和測試確定其正確性后,就可以對驅(qū)動程序進(jìn)行集成了。具體過程如下:

1) 在BSP的Driver目錄下建立新的驅(qū)動文件夾MyDrv

2) 實(shí)現(xiàn)MyDrv驅(qū)動以及相關(guān)的DEF文件

3) 如果需要用到硬件中斷資源,修改原BSP中的相關(guān)中斷處理函數(shù)OEMInterruptEnable,OEMInterruptDisable,OEMInterruptDone,OEMInterruptHandler

4) 在Platform.reg中,增加驅(qū)動程序相關(guān)項(xiàng)

5) 在Platform.bib中,增加驅(qū)動程序的相關(guān)注冊表項(xiàng)MyDrv.Dll$(_FLATRELEASEDIR)MyDrv.dll NK SH

6.2 驅(qū)動程序

驅(qū)動程序進(jìn)過集成以后就可以使用了,具體的過程如下所示:

1) 利用CAB Wizard生成.cab驅(qū)動包

2) 直接提供驅(qū)動程序文件夾以及相關(guān)注冊表項(xiàng)和修改說明

7 總結(jié)

本為詳細(xì)的介紹了,wince下驅(qū)動開發(fā)的流程,介紹了驅(qū)動程序開發(fā)到的詳細(xì)過程,并詳細(xì)說明了各個部分的實(shí)現(xiàn)和操作方法,使是初學(xué)者對wince下驅(qū)動程序的開發(fā)流程和一般的開發(fā)工具有了初步的了解。

第2篇

關(guān)鍵詞:PCI; vxworks;驅(qū)動程序;運(yùn)動控制卡

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2012)29-6966-03

VxWorks是目前世界上用戶數(shù)量最大的實(shí)時嵌入式操作系統(tǒng), 它具有高度可剪裁的微內(nèi)核結(jié)構(gòu)、高效的多任務(wù)調(diào)度、靈活的任務(wù)間通信手段、快速靈活的I/O系統(tǒng)、確定的微妙級中斷延遲時間等優(yōu)點(diǎn)。

本文介紹了基于PCI 接口規(guī)范的通用運(yùn)動控制卡在VxWorks下的驅(qū)動程序的設(shè)計(jì)。對其設(shè)計(jì)驅(qū)動程序需要對實(shí)時操作系統(tǒng)、實(shí)時軟件設(shè)計(jì)、硬件設(shè)備有深入的了解。因此, 該設(shè)計(jì)不僅本身具有很高的應(yīng)用價值, 也為實(shí)時驅(qū)動程序的設(shè)計(jì)提供了一個樣例。

1 系統(tǒng)組成

在基于微機(jī)的數(shù)據(jù)采集、處理與控制系統(tǒng)中,計(jì)算機(jī)接口卡常常是其中的關(guān)鍵硬件設(shè)備。目前在運(yùn)動控制領(lǐng)域,各類運(yùn)動控制卡得到廣泛運(yùn)用,其中以工控機(jī)通過ISA或PCI等系統(tǒng)總線連接運(yùn)動控制卡的主從式結(jié)構(gòu)最為流行,由工控機(jī)發(fā)出控制指令和參數(shù),控制卡根據(jù)接收到的指令及參數(shù)完成具體控制功能。由于PCI總線的高速和即插即用特性,使其取代ISA被廣泛應(yīng)用于高速數(shù)據(jù)采集與傳輸?shù)认到y(tǒng)中,有效地解決了實(shí)時采集、實(shí)時傳輸和實(shí)時存儲等問題。

2 PCI 配置空間

PCI系統(tǒng)具有三種地址空間:存儲器空間、I/O空間和配置空間。每個PCI設(shè)備都有64個配置雙字用于實(shí)現(xiàn)配置寄存器,64個配置雙字分為兩部分,⑴PCI協(xié)議定義了開頭16個雙字的格式和用途,稱為設(shè)備的配置頭區(qū)域;⑵其它48個雙字的用途是由設(shè)備指定的。目前PCI協(xié)議定義了兩種頭區(qū)域格式,第1類配置頭區(qū)域用于定義PCI-PCI橋,而第0類配置頭區(qū)域用于定義其它PCI設(shè)備。所有的PCI設(shè)備,包括PCI-PCI橋都必須實(shí)現(xiàn)下述配置寄存器:廠商標(biāo)志、設(shè)備標(biāo)志、命令、狀態(tài)、分類碼、版本標(biāo)志和頭區(qū)域類型寄存器。如表1所示為PCI配置寄存器。這些寄存器對編程訪問PCI設(shè)備至關(guān)重要,我們就是利用vendor ID 和device ID來枚舉出對應(yīng)的設(shè)備,再進(jìn)一步獲得設(shè)備的其他信息的。

3 驅(qū)動程序的開發(fā)

VxWorks 提供在指定目標(biāo)系統(tǒng)上運(yùn)行的板級支持包(BSP),本文選用的是針對pentium的板級支持包。VxWorks是支持PCI總線的,提供了一些庫函數(shù)專門用來訪問PCI設(shè)備。為了調(diào)用這些函數(shù)以方便開發(fā),需要包含如下頭文件"iosLib.h"、"pciConfigLib.h"、"pciIntLib.h"、"sysLib.h"和"pciLocalBus.h",還需要導(dǎo)入sysOutLong()和sysInByte()等函數(shù)。在config.h里面定義INCLUDE_PCI以添加VxWorks對PCI的支持,還可以定義PCI_CFG_TYPE為PCI_CFG_FORCE、PCI_CFG_AUTO 或 PCI_CFG_NONE,我們一般定義為PCI_CFG_NONE,Vxworks只需把配置好的信息讀出來就可以了。

針對PCI 總線結(jié)構(gòu)的數(shù)據(jù)采集模塊,其驅(qū)動程序的主要開發(fā)步驟如下:確定設(shè)備的PCI 配置信息確定設(shè)備的內(nèi)部存儲器、寄存器基地址及中斷號設(shè)備初始化中斷服務(wù)程序設(shè)備各功能函數(shù)。以下按照程序執(zhí)行的順序分步驟給出源代碼,并加以詳細(xì)的說明。

4 結(jié)束語

利用上文所述的方法編寫的驅(qū)動程序,達(dá)到了本項(xiàng)目所要求的性能指標(biāo),系統(tǒng)經(jīng)過實(shí)際驗(yàn)證是高速穩(wěn)定可靠的,而且由于PCI總線的即插即用特性,不需要用戶去手動跳線,極大得方便了使用。

參考文獻(xiàn):

[1] microsoft msdn[EB].2001.

第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; /*返回數(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ù)更方便了用戶使用。

結(jié)語

第4篇

關(guān)鍵詞:嵌入式操作系統(tǒng);Win CE;SPI;驅(qū)動程序

中圖分類號:TP311文獻(xiàn)標(biāo)識碼:B

文章編號:1004-373X(2009)10-069-04

Design of EP9315-SPI Driver Based on Win CE

ZHANG Dong1,XU Dijian2

(1.Chongqing University of Arts and Sciences,Chongqing,402160,China;2.Chongqing University of Science and Technology,Chongqing,401331,China)

Abstract: It is very important to compile driver connecting operating system with corresponded hardware device.Based on stream interface driver model,the design of SPI driver in embedded operating system Win CE in development environment of platform builder 4.2 and design method are introduced and analysed,realizing virtual address map,key code and the relationship between driver and SPI application program in EVC program environment is discussed.Driver and corresponded application program can be operated on FS_EP9315 development platform of ucdragon rightly.Experience indicates the methord is right and feasible.

Keywords:embedded operating system;Win CE;SPI;driver program

0 引 言

嵌入式是“以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適合應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的計(jì)算機(jī)系統(tǒng)”。Windows 是Microsoft推出的功能強(qiáng)大的緊湊、高效、可伸縮的32位嵌入式操作系統(tǒng),主要面對各種各樣嵌入式系統(tǒng)的產(chǎn)品[1,2]。

該系統(tǒng)具有多線程、多任務(wù)、完全搶占式的特點(diǎn),是為各種具有嚴(yán)格資源限制的硬件系統(tǒng)所設(shè)計(jì)的。為了將操作系統(tǒng)和硬件設(shè)備連接起來,硬件和軟件的驅(qū)動聯(lián)系就顯得很重要。SPI是一種高速、全雙工、同步的通信總線,在芯片的管腳上只占用4根線,節(jié)約了芯片的管腳,同時為PCB的布局節(jié)省了空間,提供了方便,正是出于這種簡單易用的特性,現(xiàn)在越來越多的芯片都集成了這種通信協(xié)議。SPI的工作模式有兩種:主模式和從模式,SPI總線可以配置成單主單從、單主多從、互為主從。為了充分利用芯片的SPI接口進(jìn)行相應(yīng)的驅(qū)動程序設(shè)計(jì)以及應(yīng)用程序設(shè)計(jì),通用方法的研究就顯得十分重要。

1 Win CE提供的驅(qū)動模型

Win CE操作系統(tǒng)支持兩種類型的驅(qū)動程序,一種為本地驅(qū)動程序,是把設(shè)備驅(qū)動程序作為獨(dú)立的任務(wù)實(shí)現(xiàn)的,直接在頂層任務(wù)中實(shí)現(xiàn)硬件操作,因此有明確和專一的目的。本地驅(qū)動程序適合于那些集成到Win CE平臺的設(shè)備,諸如鍵盤、觸摸屏等設(shè)備。另一種是具有定制接口的流接口驅(qū)動程序,它是一般類型的設(shè)備驅(qū)動程序,為用戶一級的動態(tài)鏈接庫(DLL)文件,用來實(shí)現(xiàn)一組固定的函數(shù)稱為“流接口函數(shù)”,這些流接口函數(shù)使得應(yīng)用程序可以通過文件系統(tǒng)訪問這些驅(qū)動程序。這里論述的SPI驅(qū)動就屬于流接口驅(qū)動。

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

2.1 EP9315芯片及SPI接口簡介

EP9315是一款基于ARM920T,由Cirrus Logic公司生產(chǎn)的工業(yè)級芯片[3,4] ,內(nèi)帶MMU,16 KB的指令Cache,16 KB的數(shù)據(jù)Cache和數(shù)學(xué)協(xié)處理器,主頻為200 MHz,系統(tǒng)總線為100 MHz。該芯片擁有一組SPI接口,利用它可方便實(shí)現(xiàn)與SPI器件進(jìn)行通信,可大大簡化工程應(yīng)用的硬件設(shè)計(jì)軟件。

SPI驅(qū)動程序采用Win CE流驅(qū)動的標(biāo)準(zhǔn)形式。下面從驅(qū)動程序具體設(shè)計(jì)步驟以及驅(qū)動代碼的編寫兩個方面做較為詳細(xì)的闡述。

2.2 SPI驅(qū)動程序設(shè)計(jì)步驟

在Platform Builder 4.2下設(shè)計(jì)Win CE流接口驅(qū)動程序可按照以下步驟進(jìn)行[5-7]:

(1) 在C:\\Win CE420\\PLATFORM\\ep931x\\drivers目錄下新建一個目錄SPI;

(2) 從其他驅(qū)動目錄下復(fù)制makefile文件到SPI目錄下;

(3) 用文本編輯器建立4個文本文件,文件名分別為SPI.c,SPI.h,SPI.def和sources;

(4) 編輯目錄C:\\Win CE420\\PLATFORM\\ep931x\\driver下的dirs文件。用文本編輯器打開該文件,找到“DIRS=”等式,在該等式最后添加一行, 如下面所示:

DIRS=…

SPI

(5) 在Platform Builder 4.2中打開Platform.bib文件,在該文件最后和FILES之前加入一行,指明在生成Windows CE內(nèi)核映射時自動將SPI.dll加入到內(nèi)核映像中,添加內(nèi)容如下:

SPI.dll MYM(_FLATRELEASEDIR)\ SPI.dll NK SH

(6)具體的流接口驅(qū)動程序跟注冊表密不可分,在Platform Builder 4.2中打開platform.reg文件,在該文件最后加入如下所示注冊表信息,以使在生成操作系統(tǒng)映像時,Platform Builder將注冊表信息加入到注冊表中。在Platform.reg中添加內(nèi)容如下:

[HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SPI]

"Prefix"=" SPI "

"Dll"=" SPI.dll"

"FriendlyName"=" SPI Driver"

"Index"=dword:1

"Order"=dword:0

第5篇

關(guān)鍵詞:MCP2515 嵌入式Linux 驅(qū)動 CAN

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

1系統(tǒng)硬件結(jié)構(gòu)介紹

本系統(tǒng)的硬件平臺主要由OK2440開發(fā)板、基于MCP2515的CAN總線通信模塊和以STC89C52為控制器的CAN節(jié)點(diǎn)模塊組成。CAN通信模塊用來完成OK2440開發(fā)板和STC89C52控制的節(jié)點(diǎn)模塊之間的數(shù)據(jù)傳輸。

1.1 MCP2515功能簡介

MCP2515是一款獨(dú)立的CAN總線控制器,完全支持CAN V2.0B 技術(shù)規(guī)范。MCP2515 擁有六個驗(yàn)收濾波寄存器和兩個驗(yàn)收屏蔽寄存器,通過它們可以過濾掉總線上不需要的報文,從而減少M(fèi)CU關(guān)于處理CAN總線上無用數(shù)據(jù)的開銷。MCP2515與MCU 的連接是通過業(yè)界標(biāo)準(zhǔn)串行外設(shè)接口來實(shí)現(xiàn)的。

1.2 TJA1050功能簡介

TJA1050 是介于CAN控制器和物理總線之間的一種符合ISO 11898標(biāo)準(zhǔn)的高速CAN收發(fā)器。其最高速率可達(dá)1Mbit/s,而且它的電磁抗干擾EMI性極高,至少可以連接110個節(jié)點(diǎn)。在實(shí)際電路中,可為物理總線提供差動發(fā)送和為CAN控制器提供差動接收。

2 MCP2515相關(guān)驅(qū)動程序設(shè)計(jì)

2.1 Linux設(shè)備驅(qū)動簡介

在Linux系統(tǒng)中,由于對硬件的操作必須處在特權(quán)模式下,在用戶工作模式下,程序一般不能直接和硬件進(jìn)行通信。因此,設(shè)備驅(qū)動程序則承擔(dān)了用戶模式下硬件和用戶應(yīng)用程序之間的通信工作,同時它還為應(yīng)用程序和內(nèi)核中其他的部分訪問這些設(shè)備提供了程序接口。大多數(shù)設(shè)備驅(qū)動程序可以在系統(tǒng)工作時,以動態(tài)方式進(jìn)行加載,在不需要的時候又可以將其卸載掉。

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

2.2.1 MCP2515驅(qū)動初始化函數(shù)

在MCP2515的驅(qū)動初始化函數(shù)中首先通過s3c2440_spi_ioremap()函數(shù)將S3C2440上的SPI寄存器的物理地址映射到內(nèi)核空間,這樣才可以在驅(qū)動程序中訪問和配置S3C2440的SPI寄存器。在正確的配置S3C2410的SPI寄存器后,通過s3c2440_spi_init()來完成對S3C2440相關(guān)寄存器的賦值。然后通過s3c2440_irq_init()函數(shù)來完成中斷方面相關(guān)的設(shè)置。MCP2515_init()和MCP2515_dev_init()兩個函數(shù)主要是針對于MCP2515控制器進(jìn)行相關(guān)的配置和為MCP2515設(shè)備驅(qū)動程序申請和初始化內(nèi)存空間。最后通過MCP2515 _cdev_register(Device0)函數(shù)完成MCP2515在內(nèi)核中的注冊。

2.2.2 MCP2515相關(guān)中斷函數(shù)的注冊

在CAN總線驅(qū)動程序中,CAN通信模塊接收和發(fā)送數(shù)據(jù)必須以中斷的方式與系統(tǒng)內(nèi)核之間進(jìn)行數(shù)據(jù)的交換,所以在MCP2515的驅(qū)動程序中必須用到內(nèi)核中的相關(guān)中斷函數(shù)。對于MCP2515的中斷注冊函數(shù)request_irq(),如果此中斷注冊函數(shù)返回值為0則表示中斷注冊成功,返回負(fù)數(shù)則表示注冊失敗。

2.2.3 MCP2515的文件操作函數(shù)

MCP2515_fops中定義了很多與設(shè)備有關(guān)的操作函數(shù),內(nèi)核可以通來它來訪問與MCP2515操作有關(guān)的函數(shù)。在MCP2515的文件操作函數(shù)中,read()和write()兩個函數(shù)是用來完成讀寫CAN總線上數(shù)據(jù)的功能的,通過傳遞不同的參數(shù)給驅(qū)動程序中的read()和write(),我們可以讀取和寫入相應(yīng)的數(shù)據(jù)。驅(qū)動中的CAN總線讀函數(shù)read()是整個驅(qū)動程序設(shè)計(jì)的難點(diǎn),其中在函數(shù)的設(shè)計(jì)中采用了Linux內(nèi)核阻塞機(jī)制。read()讀取完CAN總線上的數(shù)據(jù)后,通過驗(yàn)收濾波寄存器和屏蔽濾波寄存器來決定總線上的數(shù)據(jù)幀是否存入到總線控制器相應(yīng)的接收緩沖寄存器里。

2.2.4 MCP2515的卸載函數(shù)

當(dāng)我們不需要繼續(xù)使用某個設(shè)備時,我們可以將這個設(shè)備從內(nèi)核中卸載掉。在設(shè)備的卸載過程中,必須將其內(nèi)核中所對應(yīng)的設(shè)備號釋放掉。在模塊的卸載函數(shù)中,我們通過調(diào)用int unregister_chrdev_region(unsigned int major,const char *name)函數(shù)來完成設(shè)備驅(qū)動的卸載。此函數(shù)的兩個參數(shù)分別對應(yīng)設(shè)備文件的主設(shè)備號和設(shè)備名。在卸載模塊時,Linux內(nèi)核會把設(shè)備名與內(nèi)核中已注冊的設(shè)備名稱進(jìn)行對比,如果兩者相等,則完成設(shè)備的卸載,反之則卸載失敗。MCP2515的驅(qū)動卸載函數(shù)主要是完成MCP2515驅(qū)動在內(nèi)核中所占用的中斷的釋放和MCP2515在內(nèi)核中的注銷。

3 結(jié)語

本文重點(diǎn)討論了S3C2440中MCP2515的驅(qū)動程序設(shè)計(jì)方法,并詳細(xì)介紹了Linux系統(tǒng)下如何開發(fā)MCP2515的驅(qū)動程序的方法。實(shí)驗(yàn)結(jié)果表明,本文所設(shè)計(jì)的Linux下MCP2515驅(qū)動程序可以在OK2440開發(fā)板上正常運(yùn)行,基本可以完成CAN總線上數(shù)據(jù)的正常發(fā)送與接收,測試結(jié)果符合論文的要求。本文提到的基于Linux下MCP2515驅(qū)動程序的開發(fā),對其他Linux驅(qū)動程序的開發(fā)具有一定的啟示作用。

參考文獻(xiàn)

[1]宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.

[2]楊慶華,張景元.單片機(jī)和MCP2515的CAN總線通信模塊設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2007.

[3]劉淼.嵌入式系統(tǒng)接口設(shè)計(jì)與Linux驅(qū)動程序開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.

第6篇

關(guān)鍵詞:CAN_NODE實(shí)驗(yàn)板;ATmega128;CAN總線驅(qū)動程序

中圖分類號: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.

[3] 劉濱.基于單片機(jī)的CAN_NODE的設(shè)計(jì)與實(shí)現(xiàn)[M].青島:中國海洋大學(xué),2011.

第7篇

關(guān)鍵詞:VxWorks操作系統(tǒng);串口驅(qū)動程序;共享中斷

中圖分類號:TP316文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2009)33-9544-03

The Design of Driver for Multi Serial Sharing IRQ Based on VxWorks System

LIU Wei,TAO Ying

(Department of Information Engineering, Jiangxi Vocational College of Finance and Economics, Jiujiang 332000, China)

Abstract: This paper introduces the structure of serial port driver on the VxWorks system, then the achievement of the driver of serial driver is analyzed. The driver for multi serial sharing IRQ based on VxWorks system is designed, and loading VxWorks system with the module of the driver is achieved.

Key words: VxWorks system; serial port driver; sharing IRQ

VxWorks操作系統(tǒng)是美國Wind River公司開發(fā)的一種嵌入式實(shí)時操作系統(tǒng),由于其高可靠性、強(qiáng)實(shí)時性以及可裁減性,廣泛應(yīng)用于航空航天、軍事、民用通信和工業(yè)控制等領(lǐng)域。

在某大型控制系統(tǒng)中,我們需要開發(fā)一個具有4路串口通訊、1路CAN通訊以及2路以太網(wǎng)通訊的多種通訊方式并存的通訊設(shè)備。考慮到通訊能力以及通訊的實(shí)時性要求,CPU選用盛博公司PC104+總線的Pentium III處理器,串口選用具有PC104總線接口的4路串口擴(kuò)展板,采用VxWorks操作系統(tǒng)來實(shí)現(xiàn)以上需求。由于每種通訊方式都采用中斷方式觸發(fā),而系統(tǒng)硬件提供的中斷源是有限的,針對這種情況,為了節(jié)省系統(tǒng)的中斷資源,本文設(shè)計(jì)了一個基于VxWorks的多串口共享中斷的驅(qū)動程序,并對該驅(qū)動程序的功能進(jìn)行了長時間測試驗(yàn)證。

1 串行設(shè)備驅(qū)動的結(jié)構(gòu)

在VxWorks操作系統(tǒng)中,串行設(shè)備作為一種特殊的字符型設(shè)備,操作系統(tǒng)為其提供一個簡單、統(tǒng)一、獨(dú)立于設(shè)備的接口,在應(yīng)用層對于串行設(shè)備的任何操作都可以視為對一個文件的操作,而具體的實(shí)現(xiàn)是通過串行設(shè)備的驅(qū)動程序來完成。

在VxWorks中串行設(shè)備驅(qū)動采用3層抽象的軟件結(jié)構(gòu),即I/O系統(tǒng)、虛擬設(shè)備ttyLib或tyLib以及硬件驅(qū)動,其結(jié)構(gòu)示意圖如圖1所示。在VxWorks中,I/O系統(tǒng)并不直接與具體的硬件驅(qū)動進(jìn)行交互,而是將驅(qū)動程序中與硬件無關(guān)的部分放在虛擬設(shè)備ttyLib中實(shí)現(xiàn),再利用虛擬設(shè)備ttyLib與I/O系統(tǒng)進(jìn)行通訊,使得I/O系統(tǒng)獨(dú)立于具體的硬件驅(qū)動,而驅(qū)動程序的開發(fā)者只需要實(shí)現(xiàn)系統(tǒng)所提供的接口并且將其掛載到虛擬設(shè)備ttyLib就能完成具體串行設(shè)備驅(qū)動的設(shè)計(jì),從而保證驅(qū)動代碼的可復(fù)用性和接口的統(tǒng)一性。

2 串行設(shè)備驅(qū)動的實(shí)現(xiàn)

VxWorks在啟動過程中對串行設(shè)備驅(qū)動的實(shí)現(xiàn)主要包括兩部分:串口的初始化和串行設(shè)備的創(chuàng)建。串口的初始化主要包括初始化串口設(shè)備,分配串口所需的資源以及完成串口中斷程序的系統(tǒng)掛接;串行設(shè)備的創(chuàng)建包括tty驅(qū)動的初始化和對tty設(shè)備的創(chuàng)建,即建立起I/O系統(tǒng)與硬件驅(qū)動層的聯(lián)系。

2.1 串口的初始化

sysInit()作為VxWorks操作系統(tǒng)啟動的入口程序會調(diào)用第一個C程序函數(shù)usrInit(),完成用戶定義系統(tǒng)的初始化工作,而串口的硬件初始化是在usrInit()函數(shù)的子函數(shù)sysHwInit()中完成。對于VxWorks現(xiàn)有的Intel8250驅(qū)動(Tornado目錄/target/src/drv/sio/i8250Sio.c),sysHwInit()還會調(diào)用sysSerial.c文件下的sysSerialHwInit(),sysSerialHwInit()函數(shù)主要對串行設(shè)備的設(shè)備描述符進(jìn)行初始化,在初始化過程中還會調(diào)用底層的i8250HrdInit()對串行設(shè)備的端口進(jìn)行初始化。在完成系統(tǒng)硬件和VxWorks內(nèi)核的初始化以后,系統(tǒng)會啟動一個函數(shù)名為usrRoot()的任務(wù),usrRoot()作為VxWorks操作系統(tǒng)的根任務(wù)調(diào)用sysClkConnect()對系統(tǒng)時鐘中斷進(jìn)行配置,而具體的工作是由sysClkConnect()的子函數(shù)sysHwInit2()完成,其中sysHwInit2()會調(diào)用sysSerialHwInit2()來完成串行設(shè)備的中斷掛接。

2.2 串行設(shè)備的創(chuàng)建

在usrRoot()中通過調(diào)用ttyDrv()完成tty驅(qū)動的初始化,而ttyDrv()則調(diào)用iosDrvInstall()將tty驅(qū)動添加到系統(tǒng)的驅(qū)動程序列表中,并且完成與I/O系統(tǒng)層的各系統(tǒng)操作函數(shù)的連接。tty虛擬設(shè)備層與底層硬件驅(qū)動的連接則是通過ttyDevCreate()來完成,并實(shí)現(xiàn)各個串行設(shè)備的創(chuàng)建。

3 多串口共享中斷的驅(qū)動程序開發(fā)

串口擴(kuò)展板選用的是盛博的A3-CSD板卡,采用PC104總線接口,集成了4路16C554兼容的光電隔離異步串行口,每個串行口能獨(dú)立控制發(fā)送與接受,且具有16字節(jié)FIFO以減少中斷請求次數(shù),此外該擴(kuò)展板還具有一個串口中斷狀態(tài)指示寄存器,可以指示產(chǎn)生中斷的串口。根據(jù)上述硬件配置,可以在現(xiàn)有Intel8250驅(qū)動的基礎(chǔ)上進(jìn)行改進(jìn)來完成多串口共享中斷的驅(qū)動程序設(shè)計(jì)。

3.1 串口設(shè)備的初始化

每個串口設(shè)備都需要有一個的描述自身屬性的結(jié)構(gòu)體I8250_CHAN_EX,即設(shè)備描述符,且結(jié)構(gòu)體的第一個成員必須為指向SIO_DRV_FUNCS結(jié)構(gòu)的指針,該結(jié)構(gòu)體還包含描述16C554芯片各個端口的信息以及提供給高層協(xié)議的回調(diào)函數(shù)。在系統(tǒng)啟動過程中通過調(diào)用sysSerialHwInitEx()完成對該結(jié)構(gòu)體的初始化并且將自定義的全局指針數(shù)組pi8250ChanEx[4]中各元素分別指向4個串口的I8250_CHAN_EX結(jié)構(gòu)體,初始化過程中會調(diào)用i8250HrdInitEx()將串口驅(qū)動程序的設(shè)備操作入口函數(shù)安裝到SIO_DRV_FUNCS結(jié)構(gòu)中,然后調(diào)用sysSerialHwInitEx2()完成串口中斷的系統(tǒng)連接。其中sysSerialHwInitEx2()的實(shí)現(xiàn)代碼為:

void sysSerialHwInitEx2 (void)

{

int i;

for (i = 0; i < N_UART_CHANNELS_EX; i++)

if (i8250ChanEx[i].int_vec)

{/*將四個串口設(shè)備的中斷服務(wù)程序i8250ShareIntEx ()連接到同一中斷*/

(void) intConnect (INUM_TO_IVEC (i8250ChanEx[i].int_vec),

i8250ShareIntEx, (int)&i8250ChanEx[i] );

if (sysBp)

sysIntEnablePIC (devParasEx[i].intLevel);/*中斷使能*/

}}

其中,宏N_UART_CHANNELS_EX表示串口設(shè)備的個數(shù),i8250ChanEx結(jié)構(gòu)的成員變量int_vec表示該串口的系統(tǒng)中斷號,這里每個i8250ChanEx結(jié)構(gòu)的int_vec項(xiàng)值都是相同的。

3.2 串口驅(qū)動程序的入口點(diǎn)函數(shù)編寫

編寫串口設(shè)備驅(qū)動程序需要完成串口設(shè)備的入口點(diǎn)函數(shù),這些函數(shù)包括控制命令函數(shù)i8250IoctlEx(),啟動發(fā)送循環(huán)函數(shù)i8250StartupEx(),輪詢方式輸入函數(shù)i8250PRxCharEx(),輪詢方式輸出函數(shù)i8250PTxCharEx(),回調(diào)安裝函數(shù)i8250CallbackInstallEx(),單串口中斷服務(wù)函數(shù)i8250IntEx(),多串口共享中斷服務(wù)函數(shù)i8250ShareIntEx()等函數(shù)。這里只列出多串口共享中斷服務(wù)函數(shù)i8250ShareIntEx(),其余函數(shù)可以參考i8250Sio.c文件的各相應(yīng)函數(shù)。

void i8250ShareIntEx (I8250_CHAN_EX*pChan)

{

FASTintoldlevel;

oldlevel = intLock(); /*關(guān)閉系統(tǒng)中斷*/

IntStatus = sysInByte(UART_INT_STATUS); /*讀串口中斷狀態(tài)指示寄存器* /

while(( IntStatus & 0x0F) != 0x00 )/*判斷是否有串口中斷產(chǎn)生*/

{

if (IntStatus & COM0_ INT _FLAG)

i8250IntEx(pi8250ChanEx[0]);/*串口1產(chǎn)生了中斷*/

……………

if (IntStatus & COM3_ INT _FLAG)

i8250IntEx(pi8250ChanEx[3]);/*串口4產(chǎn)生了中斷*/

}

intUnlock(oldlevel); /*開啟系統(tǒng)中斷*/

}

其中,全局變量pi8250ChanEx為I8250_CHAN_EX結(jié)構(gòu)的指針數(shù)組,分別指向4個串口設(shè)備所對應(yīng)的I8250_CHAN_EX結(jié)構(gòu),宏UART_INT_STATUS表示串口中斷狀態(tài)指示寄存器地址。

在進(jìn)入i8250ShareIntEx()后首先關(guān)閉系統(tǒng)中斷,通過查詢串口中斷狀態(tài)指示寄存器來判斷產(chǎn)生中斷的串口設(shè)備,然后將產(chǎn)生此中斷的串口描述符結(jié)構(gòu)體,即pi8250ChanEx[4]中對應(yīng)的元素,作為參數(shù)傳遞給單串口中斷服務(wù)函數(shù)i8250IntEx(),最后重新開啟系統(tǒng)中斷。

3.3 以模塊加載串口驅(qū)動程序

在config.h中加入#undef INCLUDE_TTY_DEV,執(zhí)行下面的代碼后生成一個o格式的串口驅(qū)動的庫文件8250SioEx.o,然后在應(yīng)用程序中利用loadModule()將8250SioEx.o動態(tài)加載到內(nèi)存中運(yùn)行。

sysSerialHwInitEx();/*初始化串口設(shè)備*/

sysSerialHwInitEx2(); /*串口中斷的系統(tǒng)掛接*/

if (N_UART_CHANNELS_EX > 0)

{

ttyDrv();

for (int i = 0;i < N_UART_CHANNELS_EX;i++)

{

sprintf (tyName, "%s%d", "/tyCo/", i);

(void) ttyDevCreate (tyName, sysSerialChanExGet (i), 512, 512); /*創(chuàng)建tty設(shè)備*/

}

}

其中sysSerialChanExGet()返回一個描述串口設(shè)備的I8250_CHAN_EX結(jié)構(gòu)體。

4 結(jié)束語

本文詳細(xì)分析了串行設(shè)備驅(qū)動程序的結(jié)構(gòu)以及在VxWorks啟動過程中串行設(shè)備驅(qū)動程序的加載過程,設(shè)計(jì)了一個多串口共享中斷的驅(qū)動程序,利用該驅(qū)動程序?qū)?個串口同時進(jìn)行了連續(xù)10小時的數(shù)據(jù)收發(fā)測試,4個串口都能穩(wěn)定地發(fā)送和接收數(shù)據(jù)。此外,在測試過程中發(fā)現(xiàn)在進(jìn)入多串口共享中斷服務(wù)函數(shù)后需要將系統(tǒng)中斷關(guān)閉,待執(zhí)行完中斷處理后再開啟系統(tǒng)中斷,否則會引起串口工作的不穩(wěn)定。

參考文獻(xiàn):

[1] 周啟平.VxWorks下設(shè)備驅(qū)動程序及BSP開發(fā)指南[M].北京:中國電力出版社,2004.

[2] 陳智育,溫彥軍,陳琪.VxWorks程序開發(fā)實(shí)踐[M].北京:人民郵電出版社,2004.

[3] VxWorks programmer’s guide version 2.0[Z].Wind River System Inc,1999.

[4] TL16C550 asynchronous communications element[Z].1998.

第8篇

關(guān)鍵詞:DSP;TMS320C6416;PCI Linux2.6;驅(qū)動程序;DMA

中圖分類號:TP368.11 文獻(xiàn)標(biāo)識碼:A文章編號:1007-9599(2012)04-0000-02

一、引言

數(shù)字信號處理器(DSP)在通訊、語音圖像處理、數(shù)據(jù)加密等各方面得到越來越廣泛的應(yīng)用。TI C6000系列DSP芯片內(nèi)嵌PCI接口,支持主/從模式的讀寫,以33MHz的工作頻率和32位地址/數(shù)據(jù)總線進(jìn)行數(shù)據(jù)傳輸,理論上最高可以支持132MByte/s的數(shù)據(jù)傳輸,在速度上遠(yuǎn)遠(yuǎn)超過DSP常用的HPI、McBSP總線,完全可以滿足傳輸實(shí)時性的要求。

本文在Linux2.6內(nèi)核下,以TMS320C6416 DSP數(shù)據(jù)加密卡為平臺,研究了PCI設(shè)備驅(qū)動程序的開發(fā)方法。首先介紹了常規(guī)的以IO內(nèi)存方式對DSP進(jìn)行讀寫操作的方法,接著結(jié)合DSP芯片特點(diǎn),提出了一種基于DMA傳輸方式的DSP加密卡控制方法,與常規(guī)方法比,顯著地提高了傳輸速度,具有較高的應(yīng)用價值。

二、TMS320C6416的PCI接口

TMS320C6416是一款TI公司生產(chǎn)的DSP芯片,屬于C6000系列。C6000系列DSP片內(nèi)集成了一個主/從模式的PCI接口,可以通過PCI總線實(shí)現(xiàn)主機(jī)與DSP的互連。TMS320C6416的PCI接口由EDMA的地址產(chǎn)生硬件與DSP相連,支持PCI接口規(guī)范2.2版本[1]。

(一)PCI數(shù)據(jù)訪問

DSP內(nèi)嵌PCI主要包含三類寄存器:PCI配置寄存器、PCI I/O寄存器以及存儲器映射寄存器。

PCI主機(jī)通過3個基地址空間(Base0-2)能夠訪問DSP全部的存儲器映射空間。如圖1所示,Base0空間定義了一段可預(yù)取4Mbytes的DSP存儲器空間。Base1定義了8Mbytes不可預(yù)取的存儲器空間。Base2定義了16Byte的I/O空間。當(dāng)主機(jī)上電啟動后,主機(jī)操作系統(tǒng)執(zhí)行配置事務(wù),將DSP的內(nèi)存和I/O區(qū)域映射到主機(jī)處理器的地址空間,此段空間的物理地址,可以通過讀取BASE0-2寄存器獲得[2]。

三、Linux驅(qū)動程序開發(fā)

Linux下對TMS320C6416加密卡進(jìn)行驅(qū)動程序開發(fā),要完成的工作主要包括:對PCI設(shè)備的查找、初始化、卸載,對字符設(shè)備的數(shù)據(jù)讀寫和控制,中斷處理等[3]。

(一)PCI設(shè)備初始化

在Linux2.6內(nèi)核中,使用pci_driver結(jié)構(gòu)體來定義PCI驅(qū)動。設(shè)備查找時通過id_table結(jié)構(gòu)體中的的VENDER_ID、DEVICE_ID來區(qū)別不同的設(shè)備,對于TMS320C6416芯片,VENDER_ID和DEVICE_ID分別為0x104c、0xa106。

pci_driver結(jié)構(gòu)體中的probe()函數(shù)向內(nèi)核提供了對硬件進(jìn)行探測并初始化的接口。probe()函數(shù)完成的功能有:

1.讀取DSP加密卡Base0-2空間基地址和中斷號,通過pci_read_config_dword()函數(shù)實(shí)現(xiàn);

2.將IO內(nèi)存空間映射到Linux內(nèi)核虛擬地址空間。通過ioremap()函數(shù)實(shí)現(xiàn);

3.申請DSP加密卡中斷服務(wù)程序。通過request_irq()函數(shù)實(shí)現(xiàn);

4.申請DSP加密卡的主設(shè)備號,注冊DSP加密卡字符設(shè)備驅(qū)動程序。通過cdev_init()、cdev_add()函數(shù)實(shí)現(xiàn)。

初始化完成后,可以通過設(shè)置DSPP寄存器,訪問BASE0空間讀取DSP內(nèi)存資源,基于I/O內(nèi)存方式進(jìn)行PCI數(shù)據(jù)讀寫關(guān)鍵代碼如下:

static ssize_t dsp_read(struct file *fp, char *buf, size_t size, loff_t *f_pos)

{

outl(*f_pos, dsp_dev.iospace+IO_DSPP_OFFSET); //設(shè)置DSPP寄存器

copy_to_user(buf,dsp_dev.bar0, size); //拷貝DSP內(nèi)存至主機(jī)

}

在實(shí)際使用中, TMS320C6416 PCI接口可以采用DMA方式進(jìn)行數(shù)據(jù)操作,通過DMA控制器直接傳輸I/O數(shù)據(jù),可大大提高與主機(jī)通信的吞吐量。

(二)基于DMA傳輸?shù)募用芸刂?/p>

在Linux2.6內(nèi)核中,file_operations結(jié)構(gòu)體中的ioctl()函數(shù)向應(yīng)用程序提供了對硬件進(jìn)行命令控制的接口。以DSP加密卡加解密控制命令為例,加密卡加密命令要完成的操作是:通過DMA讀操作將主機(jī)數(shù)據(jù)發(fā)送給DSP加密卡,等待DSP加密卡將數(shù)據(jù)加密完畢后,通過DMA寫操作將加密數(shù)據(jù)回傳給主機(jī)。詳細(xì)步驟如下:

1.主機(jī)調(diào)用內(nèi)核函數(shù)get_free_page()申請DMA空間,調(diào)用virt_to_bus()函數(shù)將內(nèi)核空間虛擬地址轉(zhuǎn)換成PCI總線地址,將此地址寫入到DSP端PCIMA寄存器中;

2.主機(jī)訪問Base1空間,調(diào)用writel()函數(shù)修改DSP端PCIMA、DSPMA寄存器配置DMA傳輸源地址、目的地址,修改DSP端PCIMC寄存器設(shè)置DMA傳輸方向并啟動DMA傳輸[4];

3.DMA傳輸完成后,DSP端響應(yīng)MASTER OK中斷,在中斷中釋放信號量,開始數(shù)據(jù)加密操作。加密操作完成后,使用DMA方式將產(chǎn)生的密文數(shù)據(jù)回送給主機(jī),并給主機(jī)發(fā)送中斷;

4.PC機(jī)響應(yīng) 中斷,將密文數(shù)據(jù)拷貝至用戶空間。

(三)用戶態(tài)設(shè)備訪問

Linux系統(tǒng)下可通過使用命令insmod將驅(qū)動程序編譯生成的.ko文件插入到內(nèi)核中,從而實(shí)現(xiàn)驅(qū)動程序的模塊化動態(tài)加載。使用mknod命令創(chuàng)建由主、次設(shè)備號確定的加密卡設(shè)備文件,然后就可以像操作普通文件一樣來操作DSP加密卡設(shè)備。打開設(shè)備文件后,就可以實(shí)現(xiàn)對設(shè)備進(jìn)行諸如數(shù)據(jù)讀寫、設(shè)備控制等操作。

四、測試結(jié)果

在主機(jī)上編寫測試程序,設(shè)置DSP的EMIF工作在100 MHz/133 MHz時鐘,數(shù)據(jù)線為32位。PCI總線工作在33MHz時鐘,使用DMA方式進(jìn)行連續(xù)的數(shù)據(jù)讀寫,傳輸1GB的數(shù)據(jù),測得DSP主模式下DMA方式數(shù)據(jù)寫操作速度為90Mbytes/s,讀操作速度為70MBytes/s,實(shí)驗(yàn)證明,所開發(fā)的驅(qū)動程序使用良好穩(wěn)定,傳輸高效,滿足高速數(shù)據(jù)傳輸和高速數(shù)據(jù)處理的需要。

參考文獻(xiàn):

[1]Texas Instruments.TMS320C6000 DSP Peripheral Component Interconnect(PCI)Reference Guide[Z].2007:20221

[2][美]Jonathan C,Alessandro R.LINUX設(shè)備驅(qū)動程序(第2版)[M].北京:中國電力出版社,2006

[3]宋寶華,華清遠(yuǎn)見.LINUX設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2010

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

第9篇

計(jì)算機(jī)專業(yè)的學(xué)生在初開始接觸專業(yè)課時就要學(xué)習(xí)程序設(shè)計(jì),程序設(shè)計(jì)的學(xué)習(xí)比較困難,就算對一些理論知識有所理解,但是在實(shí)踐階段也很難有效的掌握其技巧與技術(shù)。特別是對程序語言設(shè)計(jì)的學(xué)習(xí),很多學(xué)生感到不知所措,無從下手。

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é)生最終考核成績。

4結(jié)語

相關(guān)文章
相關(guān)期刊
主站蜘蛛池模板: 羞羞视频免费观看 | 亚洲视频在线一区二区三区 | 91亚洲精| 国产精品一区二区吃奶在线观看 | 欧美精品二区 | 欧美亚洲激情视频 | 亚洲国产精品18久久 | 日本高清中文字幕 | 瑟瑟在线观看 | 久久9视频 | 黄色一级毛片 | www亚洲免费国内精品 | a毛片 | 国产91久久精品 | 91一区二区在线 | 中文字幕影院 | av片免费| 91免费版在线观看 | 国产一区二区不卡 | 国产日韩一区二区 | 日韩视频一区二区三区 | 国产精品二区三区 | 欧美日韩中文字幕 | 精品久久久久久 | 国产无套精品久久久久久 | 第一色在线 | 姐姐在线观看动漫第二集免费 | 亚洲精品专区 | 天天草天天干 | 亚洲乱码一区二区三区在线观看 | 亚洲黄色免费在线看 | 日本老妇高潮乱hd | 我和我的祖国电影在线观看免费版高清 | 久久中文字幕一区 | 成年人在线观看 | 久久久久久亚洲 | 91极品国产| 日本草草影院 | 一级一级特黄女人精品毛片 | 一本一本久久a久久精品牛牛影视 | 国产精品成人久久久久 |