公務(wù)員期刊網(wǎng) 精選范文 驅(qū)動程序設(shè)計范文

驅(qū)動程序設(shè)計精選(九篇)

前言:一篇好文章的誕生,需要你不斷地搜集資料、整理思路,本站小編為你收集了豐富的驅(qū)動程序設(shè)計主題范文,僅供參考,歡迎閱讀并收藏。

第1篇:驅(qū)動程序設(shè)計范文

關(guān)鍵詞:CPCI 422;驅(qū)動設(shè)計;模塊互換;IVI規(guī)范

中圖分類號:TP311.11

0 引 言

可互換虛擬儀器(Interchangeable Virtual Instrument,IVI)驅(qū)動程序規(guī)范是由IVI基金會在VPP\[1\]基礎(chǔ)上為儀器驅(qū)動制定的編程接口規(guī)范。它擴展了VPP儀器驅(qū)動程序的標準,并增加了儀器的可互換性、仿真和狀態(tài)緩存等特點,從而實現(xiàn)不同型號儀器之間的互換,在測試系統(tǒng)硬件組成發(fā)生變化時,測試程序代碼可以重用。RS 422總線通常用于串行數(shù)據(jù)通信,采用平衡的差分數(shù)據(jù)傳輸方式,最大傳輸速率能達到10 Mb/s,最大傳輸距離為300 m。目前有關(guān)422的接口模塊種類很多,為了實現(xiàn)各種型號422模塊的互換,使用IVI標準進行驅(qū)動設(shè)計是很必要的。

1 IVI驅(qū)動程序的結(jié)構(gòu)

IVI驅(qū)動程序體系結(jié)構(gòu)主要包括IVI類驅(qū)動庫、IVI專用驅(qū)動庫、IVI引擎、IVI配置實用程序、IVI配置信息文件。其中,IVI 類驅(qū)動器是儀器的功能和屬性集,通過這些功能和屬性集實現(xiàn)對一種儀器類進行控制。它是一組接口函數(shù),并不直接控制儀器工作。目前,已經(jīng)了示波器、數(shù)字萬用表等8類儀器規(guī)范\[2\]。IVI專用驅(qū)動庫封裝了用于控制某一種儀器所需要的信息,能夠直接與儀器硬件通信。IVI 引擎主要完成狀態(tài)緩存、儀器屬性跟蹤、類驅(qū)動器到專用驅(qū)動器的映像功能,是實現(xiàn) IVI 儀器驅(qū)動程序完成狀態(tài)緩存和其他增強性能的關(guān)鍵支持庫。IVI 配置實用程序用于配置儀器無關(guān)測試系統(tǒng),創(chuàng)建和配置 IVI邏輯名稱,在測試程序中通過傳送邏輯名稱將操作映像到具體儀器驅(qū)動程序。具體IVI體系層次結(jié)構(gòu)如圖1所示\[3\]。

[HT5”K][JZ]圖1 IVI體系結(jié)構(gòu)[HT5]

目前,國內(nèi)外只有NI公司,比較系統(tǒng)地提出了實現(xiàn)儀器互換的體系結(jié)構(gòu)。該公司已經(jīng)實現(xiàn)了8類儀器的IVI驅(qū)動開發(fā),而且也提供一個名為“MAX”的IVI配置程序,用于配置儀器無關(guān)測試系統(tǒng)。同時也提供了一個專用驅(qū)動庫開發(fā)向?qū)?用以開發(fā)專用驅(qū)動\[4\]。但該向?qū)Р荒軐σ延序?qū)動程序進行升級和IVI標準封裝,NI公司也沒有提供類驅(qū)動庫的開發(fā)向?qū)?加上類驅(qū)動庫數(shù)量的局限性,導(dǎo)致部分模塊無法用NI公司提供的開發(fā)向?qū)нM行IVI驅(qū)動設(shè)計,比如文中所涉及的CPCI 422基于IVI標準的驅(qū)動開發(fā)\[5\]。

2 CPCI 422驅(qū)動開發(fā)

在此,以自研CPCI 422模塊為例,介紹422驅(qū)動程序開發(fā)過程。CPCI 422模塊具有CPCI總線接口,能通過422總線發(fā)送數(shù)據(jù),并且能接收被測設(shè)備通過422總線傳來的數(shù)據(jù),并把數(shù)據(jù)傳送給上位機進行處理。該模塊具有8個通道,每個通道均能實現(xiàn)接收或者發(fā)送功能,通道能夠單獨工作也可一起工作,并且能對數(shù)據(jù)傳輸參數(shù)進行設(shè)置。

針對IVI體系結(jié)構(gòu),首先設(shè)計422類驅(qū)動函數(shù)庫。然后在類驅(qū)動函數(shù)庫基礎(chǔ)上開發(fā)專用驅(qū)動函數(shù)庫,驅(qū)動函數(shù)最后以.dll形式存在,采用 LabWindows/CVI,Visual Basic和 Visual C++等開發(fā)環(huán)境均可以開發(fā)。同時設(shè)計具備IVI引擎功能函數(shù)或者程序。對于IVI 配置信息文件可以通過專門的IVI配置實用軟件(如NI公司提供的MAX)或者其他文本編輯器進行編輯。

基于IVI標準的驅(qū)動程序配置引擎是整個IVI體系中的核心支柱。其主要功能就是實現(xiàn)類驅(qū)動庫到專用驅(qū)動庫的映射,使應(yīng)用程序在調(diào)用類驅(qū)動庫時能自動加載相應(yīng)配置的專用驅(qū)動庫。

該設(shè)計中,IVI配置引擎設(shè)計的主要思路是通過讀取配置信息文件,由配置文件中所設(shè)置的模塊邏輯名找到對應(yīng)的專用驅(qū)動庫信息字段。此字段主要包括專用驅(qū)動庫路徑文件名、專用驅(qū)動庫函數(shù)前綴等,然后通過這些一一對應(yīng)的映射關(guān)系,自動加載專用驅(qū)動庫。其工作流程如圖2所示。

該設(shè)計運用函數(shù)ivi422Class_SpecificDriver實現(xiàn)自動加載功能。下面為具體的函數(shù)設(shè)計:

該函數(shù)核心是以代表專用驅(qū)動庫文件名稱為形式參數(shù),調(diào)用LoadLibrary( )函數(shù)加載專用驅(qū)動庫。應(yīng)用程序只需通過類驅(qū)動庫及模塊的配置信息作為參數(shù),調(diào)用ivi422Class_SpecificDrive()函數(shù),即可實現(xiàn)專用驅(qū)動庫的自動加載。根據(jù)上面介紹可知,讀取配置文件以及根據(jù)配置文件自動加載專用驅(qū)動庫,即可實現(xiàn)配置引擎的功能。

類驅(qū)動庫是IVI體系的外觀框架,用來控制一個特定類型儀器的一系列功能和屬性。它是一組編程接口,而不對儀器進行直接操作。該設(shè)計中,為了實現(xiàn)422模塊的正常通信,作為連接虛擬儀器硬件和應(yīng)用測試程序的紐帶,將422類驅(qū)動函數(shù)規(guī)劃如表1所示。序號函數(shù)功能描述

1Init打開并初始化儀器

2Close關(guān)閉儀器

3SerialRead開始接收數(shù)據(jù)

4SetClock設(shè)置每個通道波特率模式

5SetUART通道工作參數(shù)設(shè)置

6SetDivisor通道具體波特率設(shè)置

7ChannelControl設(shè)置每個通道的工作狀態(tài)

8SerialWriteData開始發(fā)送數(shù)據(jù)

9SpecificDriver動態(tài)加載專用驅(qū)動庫[HJ0][HJ][HT5SS]

根據(jù)IVI規(guī)范,類驅(qū)動函數(shù)由函數(shù)名前綴加具體函數(shù)名構(gòu)成。在參數(shù)設(shè)置上均采用VISA數(shù)據(jù)類型。在該設(shè)計中,類驅(qū)動函數(shù)均采用ivi422Class作為函數(shù)前綴名?,F(xiàn)舉例如下:

該函數(shù)的功能是提供儀器初始化函數(shù)接口,其中返回值定義為ViStatus型,具體表示形式,參照IVI標準,如IVI_SUCCESS。參數(shù)為ViSession型指針,用來返回儀器資源句柄。

根據(jù)前面介紹可知,類驅(qū)動函數(shù)只提供接口功能,不涉及具體儀器操作,現(xiàn)仍以初始化函數(shù)為例,介紹類驅(qū)動函數(shù)如何實現(xiàn)接口功能。其具體實現(xiàn)如下:

該函數(shù)的核心部分就是調(diào)用GetProcAddress(hDLL,FuncName)函數(shù),獲取專用驅(qū)動庫函數(shù)對應(yīng)函數(shù)地址。其中,hDLL為在配置引擎功能中調(diào)用ivi422Class_SpecificDriver()函數(shù)獲取的專用驅(qū)動庫句柄,FuncName為對應(yīng)函數(shù)名稱。

對于專用驅(qū)動動態(tài)鏈接庫的開發(fā),該設(shè)計未借助Labwindows/CVI中的專用驅(qū)動開發(fā)向?qū)?而是直接在VC中進行編制。專用驅(qū)動庫函數(shù)的主體函數(shù)名和參數(shù)類型與類驅(qū)動是完全一致的,否則類驅(qū)動和專用驅(qū)動之間的參數(shù)傳遞會出錯\[8\]。為了與類驅(qū)動前綴名相區(qū)別,在該設(shè)計中,專用驅(qū)動函數(shù)前綴名一律為ivi422。舉例如下:

函數(shù)則具體針對儀器操作,完成模塊初始化功能。

對于上層應(yīng)用程序,專用驅(qū)動函數(shù)隱藏了具體硬件工作細節(jié),只以函數(shù)的形式提供了完成一項具體功能的接口。上層應(yīng)用程序只需要通過類驅(qū)動庫間接調(diào)用專用驅(qū)動庫提供的函數(shù),即可完成對硬件的操作控制。規(guī)劃表中已經(jīng)列出了422操控的基本函數(shù),如果需要再增加函數(shù),只需要在類驅(qū)動的專用驅(qū)動中同時增加,便能實現(xiàn)功能擴展。

[BT3]2.3 CPCI 422模塊IVI驅(qū)動程序中配置文件編輯

對于IVI 配置信息文件,可以通過專門的IVI配置實用軟件(如NI公司提供的MAX)進行編輯。在該設(shè)計中,利用圖形化編程軟件自己設(shè)計以對話框為基礎(chǔ)的配置實用程序,通過此程序?qū)ε渲梦募M行編輯。圖3為此程序的主界面。

通過此程序,修改配置文件中的邏輯名字段、描述字段、驅(qū)動庫加載路徑字段,以及驅(qū)動函數(shù)前綴字段、仿真調(diào)試字段。然后通過配置引擎對于配置文件的讀操作,建立類驅(qū)動庫和專用驅(qū)動庫的正確映射。當改變模塊時,只需要改變模塊的邏輯名,以及模塊專用驅(qū)動庫的加載路徑和前綴,而不需要修改類驅(qū)動庫,也不會影響上層應(yīng)用程序,從而實現(xiàn)了儀器的互換特性。

2.4 應(yīng)用程序調(diào)用驅(qū)動工作流程

首先,應(yīng)用程序通過一個邏輯名調(diào)用 IVI 類驅(qū)動庫,配置引擎,將該邏輯名與配置文件中的所有邏輯名進行匹配,得到實際的 IVI專用驅(qū)動庫指針,并實現(xiàn)該驅(qū)動器的動態(tài)加載;然后將 IVI 類驅(qū)動器中的函數(shù)和屬性與IVI 類專用驅(qū)動器的對應(yīng)函數(shù)和屬性進行鏈接,使應(yīng)用程序可以間接地訪問這些函數(shù)和屬性。在編制應(yīng)用程序時,應(yīng)同時包含類驅(qū)動庫的動態(tài)鏈接庫和頭文件,編制過程中,對開發(fā)人員只需調(diào)用類驅(qū)動函數(shù)。┩4為應(yīng)用IVI體系基于422模塊的應(yīng)用程序調(diào)用驅(qū)動工作流程。

第2篇:驅(qū)動程序設(shè)計范文

通信卡的硬件設(shè)計

1 通信卡的主要特點

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

2 通信卡的電路設(shè)計

通信卡組成框圖如圖1所示。其主要由DMA控制器、總線競爭仲裁器、串行通信控制器、數(shù)據(jù)緩沖存儲器SRAM、存儲器I/O映像和物理地址產(chǎn)生器、總線接口及防護、波特率產(chǎn)生器、接口電路等單元電路組成。

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

3 通信流程設(shè)計

如果要發(fā)送一幀數(shù)據(jù),CPU用批命令將數(shù)據(jù)放到本卡SRAM中,然后設(shè)置相應(yīng)的發(fā)送DMA通道。DMA通道是非自動重裝方式,啟動8274控制器發(fā)送,然后CPU就不需要管理,由卡上硬件自動發(fā)送。

如果需要接收數(shù)據(jù),啟動接收通道。接收通路自動搜索輸入信號,搜索到數(shù)據(jù)幀時,由卡上DMA控制器來管理,將接收的數(shù)據(jù)放人本卡SRAM中,并向CPU請求中斷,讀出數(shù)據(jù)。

4 總線競爭設(shè)計

由于同時可進行四路通信,且CPU可隨時對某一路發(fā)控制命令或訪問卡上SRAM存儲器,就將出現(xiàn)CPU與本卡主設(shè)備DMA爭用本卡總線的狀況。由于ISA總線沒能給出CPU指令排隊狀態(tài)序列,這給總線仲裁帶來了困難,而本卡的總線競爭、仲裁是由可編程邏輯器件設(shè)計的狀態(tài)機來完成的。狀態(tài)機使用一個4MHz信號作為時鐘,共設(shè)3種狀態(tài):

①CPU控制狀態(tài)。

②DMA控制狀態(tài)。

③空閑狀態(tài),CPU及DMA均未能得到控制權(quán)。

當狀態(tài)機檢測到無CPU及DMA申請總線使用權(quán)時,就進入空閑狀態(tài),而一旦CPU或DMA請求總線,狀態(tài)機立即將總線使用權(quán)交給CPU或DMA。如果正在CPU控制狀態(tài)期間,DMA申請總線使用權(quán),狀態(tài)機仍然判定CPU控制總線,讓DMA處于等待,直到檢測CPU指令完成,狀態(tài)機才轉(zhuǎn)為DMA控制狀態(tài)。如果在DMA控制狀態(tài)時,CPU申請總線使用權(quán),狀態(tài)機仍然判定DMA控制總線,讓CPU處于等待,直至DMA字節(jié)傳送完,狀態(tài)機轉(zhuǎn)為CPU控制狀態(tài)。CPU及DMA對總線的使用權(quán)是單個指令或字節(jié)傳送,不設(shè)置總線封鎖,因而CPU、DMA可頻繁交換使用權(quán),不會出現(xiàn)等待時間過長的現(xiàn)象。

通信卡的驅(qū)動程序設(shè)計

1 設(shè)備驅(qū)動程序的I/O模型

通信卡的驅(qū)動程序是利用Windows XP的DDK軟件開發(fā)的標準的核心態(tài)設(shè)備驅(qū)動程序。它使用統(tǒng)一的“文件”形式,用戶可以通過代表通信卡設(shè)備的文件名,在WIN32子系統(tǒng)中用文件操作函數(shù)來訪問。該設(shè)備驅(qū)動和程序可以根據(jù)用戶的需要,設(shè)置為自動加載,或手動加載,也可以動態(tài)的加載該驅(qū)動程序。通信卡的驅(qū)動程序設(shè)計成為支持同步I/O模型,也可以為異步I/O模型。

2 發(fā)送數(shù)據(jù)I/O例程設(shè)計

在用戶態(tài)提交發(fā)送任務(wù)到核心態(tài),由I/O管理程序負責調(diào)用驅(qū)動程序,驅(qū)動程序發(fā)送IRP交給硬件,假若當前發(fā)送器不忙,則具體的發(fā)送操作全部由發(fā)送器自行完成,而驅(qū)動程序則返回已經(jīng)一個本幀可以發(fā)送的標志。具體的發(fā)送完成結(jié)果則可以在發(fā)送任務(wù)完成后查詢得到。可是,如果程序向當前設(shè)備發(fā)送器提交發(fā)送任務(wù)時,該發(fā)送器正在處理上一幀,那么則有兩種方法處理。

①立即方式:立即返回一個錯誤,當前設(shè)備忙,不能發(fā)送。

②阻塞方式:I/O管理器程序會調(diào)度相應(yīng)的異步處理例程,將當前的發(fā)送任務(wù)放進任務(wù)隊列中,返回一個標志:I/O掛起,當前設(shè)備忙,發(fā)送任務(wù)提交任務(wù)隊列。驅(qū)動程序會在發(fā)送器空閑時,提交任務(wù)隊列中的發(fā)送任務(wù)給發(fā)送器。完成發(fā)送任務(wù)后,將相關(guān)文件句柄設(shè)為有信號狀態(tài),通知本次發(fā)送任務(wù)完成。

3 接收數(shù)據(jù)I/O例程

接收數(shù)據(jù)例程采用客戶/服務(wù)器的模式設(shè)計。由于用戶的接收請求和硬件的接收并不是同步的,所以在設(shè)計中,為避免丟失數(shù)據(jù),考慮創(chuàng)造一個專門的接收線程。這樣,同步用戶請求、接收線程、硬件層之間的通信就必須仔細地設(shè)計。圖2示意了用戶態(tài)接收請求、接收線程以及硬件層之間的通信同步。

①硬件層與接收線程之間通信

硬件層與接收線程之間通信的同步是通過同步事件對象來實現(xiàn)的。同步事件對象通常處于無信號狀態(tài),只有當成功地接收到一幀時,才將該事件置為有信號狀態(tài)。接收線長久等待同步事件對象,在沒有收到數(shù)據(jù)時,因同步事件對象處于無信號狀態(tài)而阻塞。當硬件檢測到數(shù)據(jù)時,實時中斷服務(wù)程序負責將同步事件對象置為有信號狀態(tài),接收線程就會釋放阻塞。將通信卡SRAM上的接收數(shù)據(jù)讀進接收線程緩沖區(qū)隊列,然后將同步事件對象置為無信號狀態(tài),接收線程再次阻塞,等待接收下一幀數(shù)據(jù)。

②用戶層和接收線程之間的通信

當用戶提交接收任務(wù)時,由驅(qū)動程序的調(diào)度程序讀取接收線程的緩沖區(qū)隊列,并將標志置為“空”,同時將緩沖隊列事件置為無信號狀態(tài),并返回,如果緩沖區(qū)是空,則

?立即方式:立即返回無數(shù)據(jù)。

?阻塞方式:阻塞直到有數(shù)據(jù)隊列進入。接收隊列的每個緩沖區(qū)都對應(yīng)一個通知事件,如果接收線程將SRAM中的數(shù)據(jù)讀進隊列,就將相應(yīng)的通知事件置為有信號狀態(tài),用戶請求就等待該通知事件,只要有數(shù)據(jù)在隊列中,就讀取返回,否則被阻塞。

4 硬中斷服務(wù)程序設(shè)計

通信卡在全雙工的通信中具有實時性,而且在較高的波特率,硬中斷非常多。為了防止高優(yōu)先級中斷過多地搶占CPU時間,設(shè)計中采用了實時中斷服務(wù)程序和延遲過程調(diào)用的方法。

在Windows XP系統(tǒng)中,每個內(nèi)核函數(shù)和過程都運行于特定的優(yōu)先級。較高優(yōu)先級的函數(shù)或事件可以搶占較低優(yōu)先級,反之則不然。實時中斷服務(wù)程序ISR運行于DIRQL級,具有較高的優(yōu)先級,它只能被更高級的硬中斷所搶占,不會對同級或較低優(yōu)先級的硬中斷的響應(yīng)。所以,在實時中斷服務(wù)程序中,只做盡量少的必須工作,即讀出中斷向量,而將大量的數(shù)據(jù)傳送及處理等工作交給延遲過程DPC去完成。因為DPC過程運行于DISPATCH_LEVEL級,是相對較低的優(yōu)先級,它可以被任何級的硬中斷所搶占。這樣,既保證了硬中斷的及時響應(yīng),又提高了程序的性能。

5 驅(qū)動程序人口例程

Windows XP為每個核心態(tài)的驅(qū)動程序提供了一個默認的標準入口點DriverEntry()。設(shè)計中,考慮到該例程運行于PASSIVE_LEVE級,系統(tǒng)只運行該例程一次就拋棄了,所以在驅(qū)動程序中用到的重要數(shù)據(jù)、對象等都不能保存在DriverEntry()例程中,必須在初始化過程中分配一塊NoPaged內(nèi)存來保存。通信卡的驅(qū)動程序的DriverEntry()例程主要完成如下功能。

讀取Registry的硬件配置信息,聲明I/O地址、中斷等資源;創(chuàng)建代表通信卡的設(shè)備名MPSC,該名字對WIN32子系統(tǒng)是可見的;設(shè)置調(diào)度例程入口點;分配一塊NoPaged的內(nèi)存,存儲重要信息;連接硬中斷,設(shè)置中斷服務(wù)程序,初始化線程、事件、信號燈、DPC等內(nèi)核對象,返回狀態(tài)STATUS_SUCCESS。

如果在以上過程中遇到錯誤,則需要做以下工作:斷開硬中斷;釋放硬件資源;將相關(guān)的錯誤信息打包,并記錄;返回錯誤信息。

6 設(shè)計驅(qū)動程序中需要注意的問題

由于通信卡在應(yīng)用中具有一定的實時性,為了克服中斷的不確定性。提高系統(tǒng)的性能,開發(fā)了Windows XP系統(tǒng)所有驅(qū)動程序中最難的異步驅(qū)動程序。在系統(tǒng)的內(nèi)核開發(fā),異步模型I/O操作中,內(nèi)核對象的同步十分復(fù)雜,細微的差錯都會導(dǎo)致系統(tǒng)徹底崩潰。在設(shè)計驅(qū)動程序中需要注意以下問題。

?在程序中用到的內(nèi)核對象:事件、信號燈、線程以及連鎖等,都必須將其存儲在Nopaged內(nèi)存中,否則,會造成系統(tǒng)崩潰。

第3篇:驅(qū)動程序設(shè)計范文

關(guān)鍵詞:嵌入式;CF卡;低層驅(qū)動;存儲設(shè)備

中圖分類號:TB文獻標識碼:A 文章編號:1672-3198(2012)12-0162-01

0 引言

設(shè)備驅(qū)動程序是構(gòu)成Linux內(nèi)核的主要部分,不合理的驅(qū)動設(shè)計會導(dǎo)致系統(tǒng)內(nèi)核出現(xiàn)紊亂,由于不穩(wěn)定而導(dǎo)致系統(tǒng)崩潰,使行成重要數(shù)據(jù)丟失或嚴重后果。因此,設(shè)計合理的驅(qū)動程序,有助于保障系統(tǒng)的整體穩(wěn)定性。在S3C2410開發(fā)板下設(shè)計合理的驅(qū)動程序是本文研究的重點。

S3C2410的硬件平臺是基于ARM公司的ARM920T處理器核,采用32位微控制器,價格低,功耗低,性能高;軟件平臺通過u-boot移植和內(nèi)核編譯完成,所有這些特性使S3C2410為 linux操作系統(tǒng)內(nèi)核驅(qū)動程序設(shè)計提供了較好的解決方案。

目前,嵌入式系統(tǒng)中應(yīng)用最廣泛的存儲卡是CF卡。多數(shù)情況下,使用PCMCIA控制器實現(xiàn)CF卡的操作,為了減少設(shè)備使用和成本降低,本文在沒有PCMCIA控制器情況下,探討分析設(shè)備驅(qū)動程序設(shè)計步驟,CF卡的配置及底層驅(qū)動如何工作等問題,研究實現(xiàn)了利用CF卡作為存儲設(shè)備的嵌入式Linux系統(tǒng)。

1 系統(tǒng)設(shè)計

嵌入式系統(tǒng)使用CF卡作為存儲設(shè)備的設(shè)計目前有很多,而開發(fā)設(shè)備的選型不同,開發(fā)的方法不同,本系統(tǒng)使用Linux操作系統(tǒng),以S3C2410為開發(fā)平臺,以ARM920T處理器為模板來實現(xiàn)CF卡的嵌入式系統(tǒng)。

驅(qū)動程序開發(fā)首先需對Linux操作系統(tǒng)中原有的IDE程序進行改造,用后臺程序管理CF卡的熱插拔事務(wù),同時CF卡以Memory尋址訪問方式進行8位尋址。在對Linux設(shè)備進行驅(qū)動程序設(shè)計時,具體設(shè)計步驟如下:

(1)啟動系統(tǒng),將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主驅(qū)動號。利用設(shè)備號對此數(shù)組進行索引。調(diào)用設(shè)備注冊函數(shù)module_register_chrdev()進行設(shè)備注冊。

(2)為驅(qū)動函數(shù)定義功能函數(shù),當系統(tǒng)調(diào)用這些功能函數(shù)時,系統(tǒng)將自動運行函數(shù)定的模塊實現(xiàn)特有的功能。

(3)當一個模塊使用完成時,啟動動態(tài)的卸載模塊函數(shù),調(diào)用cleanup_module()函數(shù),并調(diào)用設(shè)備注銷函數(shù)即可卸載函數(shù)。

在進行設(shè)計時,需注意Linux設(shè)備驅(qū)動程序接口和幾個重要的數(shù)據(jù)結(jié)構(gòu)。具體有以下四層接口:應(yīng)用進程與內(nèi)核、內(nèi)核與文件、文件系統(tǒng)與設(shè)備驅(qū)動程序、設(shè)備驅(qū)動程序與硬件設(shè)備。

每個驅(qū)動程序都有一個數(shù)據(jù)結(jié)構(gòu),包含的函數(shù)指針指向所開發(fā)的接口,內(nèi)核用主設(shè)備號作為索引訪問數(shù)據(jù)結(jié)構(gòu)。

2 接口和重要的數(shù)據(jù)結(jié)構(gòu)

設(shè)備驅(qū)動程序是操作系統(tǒng)硬件設(shè)備和內(nèi)核的接口,Linux 操作系統(tǒng)中,Linux 操作系統(tǒng)采用統(tǒng)一的接口,在硬件設(shè)備、設(shè)備驅(qū)動程序、文件系統(tǒng)、內(nèi)核、應(yīng)用程序進程間有相連的接口。

驅(qū)動程序有一個file_operations的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)提供了很多接口,其中常用的接口有open、read、write、seek、release等,為驅(qū)動程序開發(fā)提供了保障。驅(qū)動程序中struct inode數(shù)據(jù)結(jié)構(gòu)為設(shè)備和文件對應(yīng)了唯一的inode號,驅(qū)動程序中同時也使用了struct file、struct device 數(shù)據(jù)結(jié)構(gòu)。

3 CF卡基本配置

CF卡在存儲操作前,對CF卡進行的相關(guān)配置主要有以下幾個方面:配置GPIO并分配尋址端口,用于傳輸CF卡信號。配置CF卡的屬性存儲空間和尋址訪問方式。在系統(tǒng)中CF卡使用Memory尋址訪問方式,將屬性寄存器配置為0x00,其他屬性寄存器保持默認值。驗證對屬性寄存器的值,當驅(qū)動屬性值與默認值不匹配時,則說明Memory尋址訪問方式?jīng)]有正確使用CF卡,此時需修改屬性值為默認值即可。

4 CF卡驅(qū)動程序設(shè)計

4.1 底層驅(qū)動實現(xiàn)

CF卡存儲備份需要通過CF卡的底層驅(qū)動實現(xiàn),這就要求CF卡能準確的接收及響應(yīng)系統(tǒng)對它的I/0請求。具體流程如下:

(1)在讀寫命令時,使用LBA尋址模式來訪問CF卡。當驅(qū)動對CF卡的I/O請求進行正確接收后,此時把相關(guān)參數(shù)值和ATA命令值寫入對應(yīng)的寄存器,并向CF卡ATA命令,即完成了ATA命令。

(2)填寫ATA命令控制塊后,CF卡可以利用輪詢的方法對發(fā)送的命令做出響應(yīng)。

(3)受外部環(huán)境影響造成CF卡沒有接收到命令或者接收命令出錯時,可以使用軟重置將其恢復(fù)到初始狀態(tài),并重新發(fā)送該ATA命令。

快捷的實現(xiàn)存儲備份需使CF卡能及時響應(yīng)熱插拔,把CF卡設(shè)定為TureIDE工作模式,這樣CF卡就可以隨意移動。在系統(tǒng)層注冊字符型設(shè)備CFMGR文件實現(xiàn)探測熱插拔事件、與應(yīng)用層通信,實現(xiàn)分配或釋放系統(tǒng)資源,從而驅(qū)動CF卡;在應(yīng)用層及時監(jiān)聽熱插拔事件并采用Select阻塞機制,達到盡量少的占用CPU資源。

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

驅(qū)動程序的作用在于為應(yīng)用程序提供機制,它是內(nèi)核的一部分。該驅(qū)動程序?qū)崿F(xiàn)了設(shè)備初始化,在內(nèi)核和設(shè)備間相互傳送數(shù)據(jù),讀取、回送數(shù)據(jù),檢測錯誤等功能,開發(fā)的難點在于高效請求處理、中斷、1/O操作等方面功能設(shè)計。

5 結(jié)語

本文通過系統(tǒng)驅(qū)動程序的設(shè)計流程分析,研究程序開發(fā)的接口和數(shù)據(jù)結(jié)構(gòu),對CF卡進行配置,研究開發(fā)驅(qū)動程序,實現(xiàn)了CF卡存儲備份和快速熱插拔,使其便于在其他系統(tǒng)中應(yīng)用。

參考文獻

[1]嵌入式Linux 中CF卡的管理研究[EB/OL].140.112.99.135/ntu/showthread.php?threadid=67.

第4篇:驅(qū)動程序設(shè)計范文

windows nt是一個功能全面的操作系統(tǒng),具有完全集成式的連網(wǎng)能力,它的網(wǎng)絡(luò)模型開始于mac子層,網(wǎng)絡(luò)接口卡(network interface card以后簡稱網(wǎng)卡或nic)驅(qū)動程序駐留在其中。通過相關(guān)的網(wǎng)卡把windows nt與網(wǎng)絡(luò)連接起來,但一直到80年代后期,許多傳輸協(xié)議的實現(xiàn)受限于mac層接口的獨特實現(xiàn),因為mac層定義了協(xié)議與網(wǎng)卡之間的轉(zhuǎn)換機制。

1989年,microsoft和3com兩公司提出了一個定義mac層與osi模型高層協(xié)議驅(qū)動程序之間的網(wǎng)絡(luò)設(shè)備接口規(guī)范(network device interface specification : ndis),ndis給數(shù)據(jù)交換提出了一個靈活的環(huán)境,它規(guī)范了軟件接口──稱為ndis接口,傳輸協(xié)議可用它與網(wǎng)卡驅(qū)動程序進行通信。因此在windows nt環(huán)境下開發(fā)核心態(tài)網(wǎng)卡驅(qū)動程序應(yīng)遵循ndis規(guī)范。

對于高速網(wǎng)絡(luò)fddi(fiber distributed data interface)網(wǎng)卡驅(qū)動程序還需要smt(station management)站管理功能的實現(xiàn),否則將不能作為一個fddi站連入環(huán)結(jié)構(gòu)中,只能實現(xiàn)點到點間的數(shù)據(jù)通信。故有必要將smt軟件移植到網(wǎng)卡驅(qū)動程序中,這將又導(dǎo)致對miniport nic驅(qū)動程序編程框架的破壞,于是有必要形成fddi網(wǎng)卡驅(qū)動程序(包含smt)與windows nt操作系統(tǒng)的良好接口──由邏輯網(wǎng)卡的注冊和mac層驅(qū)動程序的初始化來完成。

所以,本課題旨在深入研究應(yīng)用microsoft公司的ddk(device driver kit)將smt移植于windows nt的fddi網(wǎng)卡驅(qū)動程序過程中如何注冊miniport nic驅(qū)動程序。即怎樣正確注冊邏輯網(wǎng)卡和mac驅(qū)動程序的初始化。著重討論與初始化相關(guān)的上邊緣函數(shù)的使用和調(diào)用關(guān)系以及初始化過程中遇到的各種問題的具體解決。

第一章windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序

總體結(jié)構(gòu)介紹

第一節(jié)windows nt網(wǎng)絡(luò)結(jié)構(gòu)

§1.1.1 windows nt網(wǎng)絡(luò)體系結(jié)構(gòu)

windows nt的網(wǎng)絡(luò)體系結(jié)構(gòu)是基于國際標準化(iso)制定的標準模型──開放式系統(tǒng)互連(open system interconnection:osi)參考模型分層建立的,這種方式有利于隨時擴展其它功能和服務(wù)。

windows nt網(wǎng)絡(luò)模型開始于mac子層,網(wǎng)卡驅(qū)動程序就駐留在其中。它通過相關(guān)的網(wǎng)卡把windows nt與網(wǎng)絡(luò)連接起來,圖中的多個網(wǎng)卡表明在一臺運行windows nt的計算機上能使用多種網(wǎng)卡。

這一網(wǎng)絡(luò)體系結(jié)構(gòu)包括兩個重要接口──ndis接口與傳輸驅(qū)動

程序接口(tdi)。這兩個接口把兩個層隔離開來,辦法是相鄰的部件只允許按單一的標準來寫,不允許多重標準。例如一個網(wǎng)卡驅(qū)動程序(在ndis接口的下面)就不需要特地按每個傳輸協(xié)議來寫它的代碼塊,恰恰相反,該驅(qū)動程序是寫給ndis接口的,它通過符合ndis的相應(yīng)傳輸協(xié)議來請求服務(wù)。這些接口包含在windows nt的網(wǎng)絡(luò)體系結(jié)構(gòu)中,以容納可移植、可互換的模塊。

在兩個接口之間,是傳輸協(xié)議。它在網(wǎng)絡(luò)中起著組織者的作用。一個傳輸協(xié)議規(guī)定了數(shù)據(jù)以何種方式呈遞給下一個接收層,以及如何對數(shù)據(jù)相應(yīng)地進行打包。它通過ndis把數(shù)據(jù)傳給網(wǎng)卡驅(qū)動程序,并通過tdi把數(shù)據(jù)傳給轉(zhuǎn)發(fā)程序(redirector)

tdi之上是轉(zhuǎn)發(fā)程序,它把本地的網(wǎng)絡(luò)資源申請轉(zhuǎn)送給網(wǎng)絡(luò)。

為了能和其他廠商的網(wǎng)絡(luò)互連,windows nt允許有多個轉(zhuǎn)發(fā)程序。對于每一個轉(zhuǎn)發(fā)程序windows nt計算機必須也有一個相應(yīng)的供應(yīng)者(provider)(由網(wǎng)絡(luò)廠商提供)。多供應(yīng)者路由選擇程序決定適當?shù)墓?yīng)者,然后借助于供應(yīng)者,對應(yīng)用請求到相應(yīng)的轉(zhuǎn)發(fā)程序做出選擇。

§1.1.2 windows nt網(wǎng)絡(luò)驅(qū)動程序

windows nt支持兩種類型的網(wǎng)絡(luò)驅(qū)動程序

傳輸驅(qū)動程序

實現(xiàn)數(shù)據(jù)鏈路層中的邏輯鏈路控制子層協(xié)議和傳輸層協(xié)議。向 下與ndis接口,向上與tdi接口。

網(wǎng)卡驅(qū)動程序

實現(xiàn)對物理層的管理和數(shù)據(jù)鏈路層中介質(zhì)訪問控制子層協(xié)議,通過ndis向下管理物理網(wǎng)卡,向上與傳輸驅(qū)動程序通信。

§1.1.3 windows nt網(wǎng)卡驅(qū)動程序

windows nt環(huán)境下的網(wǎng)卡驅(qū)動程序也分為兩種:

miniport網(wǎng)卡驅(qū)動程序:miniport驅(qū)動程序只須實現(xiàn)與網(wǎng)絡(luò)硬件相關(guān)的操作(包括發(fā)送和接收)。而所有底層網(wǎng)卡驅(qū)動程序的通用操作(如同步),一般由ndis接口程序來實現(xiàn)。

full網(wǎng)卡驅(qū)動程序:full網(wǎng)卡驅(qū)動程序必須實現(xiàn)所有硬件相關(guān)和同步、排隊等操作。例如full網(wǎng)卡驅(qū)動程序為了響應(yīng)數(shù)據(jù)接收,需要保持本身的捆綁信息,而miniport就可以由ndis接口庫來實現(xiàn)。

在windows nt的早期版本中,full網(wǎng)卡驅(qū)動程序要求開發(fā)者實現(xiàn)許多底層操作,來處理多處理器的核心問題以及處理器、線程的同步,這樣不同的開發(fā)者在大量重復(fù)著許多相同的工作。

而miniport網(wǎng)卡驅(qū)動程序允許開發(fā)者僅僅寫一些與網(wǎng)絡(luò)硬件相關(guān)的代碼即可,而那些通用的函數(shù)由ndis接口庫來實現(xiàn),這樣開發(fā)出來的驅(qū)動程序減少了不必要的工作。

第二節(jié)miniport驅(qū)動程序的結(jié)構(gòu)

ndis接口規(guī)范了網(wǎng)卡驅(qū)動程序的實現(xiàn),同時也對tdi驅(qū)動程序的實現(xiàn)提出了一定的要求,在nt中,ndis約束下的網(wǎng)卡驅(qū)動程序、tdi驅(qū)動程序和系統(tǒng)的關(guān)系如下圖所示:

圖2.0 ndis約束下的網(wǎng)卡驅(qū)動程序、tdi驅(qū)動程序和系統(tǒng)的關(guān)系

miniport驅(qū)動程序包括驅(qū)動程序?qū)ο蟆Ⅱ?qū)動程序源代碼和ndis接口庫代碼。windows nt ddk提供ndis.h作為miniport驅(qū)動程序的主要頭文件,定義了miniport驅(qū)動程序的入口點、ndis接口庫函數(shù)和通用數(shù)據(jù)結(jié)構(gòu)。

上邊緣函數(shù)的作用是網(wǎng)卡驅(qū)動與ndis接口庫進行通信,而下邊緣函數(shù)是tdi協(xié)議驅(qū)動程序與ndis通信的手段。

§1.2.1 miniport網(wǎng)卡對象

ndis用一個叫做邏輯網(wǎng)卡的軟件對象來描述系統(tǒng)中的每塊網(wǎng)卡,而邏輯網(wǎng)卡與windows nt設(shè)備對象的通信由i/o子系統(tǒng)來管理,描述網(wǎng)卡的設(shè)備對象包括相關(guān)的網(wǎng)絡(luò)信息如名字、網(wǎng)絡(luò)地址和網(wǎng)卡內(nèi)存基地址等,它還包含與硬件相關(guān)的驅(qū)動程序狀態(tài)數(shù)據(jù)(捆綁數(shù)目,捆綁句柄,包過濾數(shù)據(jù)庫等)。ndis分配一個句柄到miniportinitialize這個上邊緣函數(shù)的一個結(jié)構(gòu)中,然后miniport網(wǎng)卡驅(qū)動程序?qū)⒃谝院筇峁┻@個句柄來給ndis調(diào)用,這個結(jié)構(gòu)一直被ndis保持,并且對miniport驅(qū)動程序不透明。

當miniport網(wǎng)卡驅(qū)動程序初始化一塊網(wǎng)卡時,它創(chuàng)立自己的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來描述網(wǎng)卡,記錄需要它管理的與設(shè)備相關(guān)的狀態(tài)信息。當miniport網(wǎng)卡驅(qū)動程序調(diào)用ndismsetatttibutes或ndismsetattributesex兩ndis庫函數(shù)時,它傳遞一個句柄給這數(shù)據(jù)結(jié)構(gòu)。這樣,當調(diào)用miniport驅(qū)動程序入口點時,它就傳遞這個句柄來驗證驅(qū)動程序所對應(yīng)的網(wǎng)卡的正確性。這個數(shù)據(jù)結(jié)構(gòu)為miniport網(wǎng)卡驅(qū)動程序所擁有并維護。

§1.2.2網(wǎng)絡(luò)對象標識符

miniport nic驅(qū)動程序還需要維護一組對象,這些對象是系統(tǒng)定義的對象標識符(object idetifier:oid)來標識,以描述驅(qū)動程序的性能和當前狀態(tài)信息。為查詢這些信息,上層驅(qū)動程序調(diào)用ndisrequest向ndis接口庫指示oid。oid表示了調(diào)用所需的信息類型,如miniport驅(qū)動程序所支持的lookahead緩沖區(qū)大小等。ndis接到上層驅(qū)動程序的查詢請求,將oid傳遞給上邊緣函數(shù)miniportqueryinformation實現(xiàn)對oid的查詢,如果上層驅(qū)動程序請求改變狀態(tài)信息則調(diào)用miniportsetinformation實現(xiàn)對oid的設(shè)置。

§1.2.3 miniport網(wǎng)卡驅(qū)動程序代碼

典型的miniport nic驅(qū)動程序必須有一些函數(shù)來通過ndis接口實現(xiàn)上層驅(qū)動程序與硬件的通信。這些函數(shù)稱為上邊緣服務(wù)函數(shù)。

這些上邊緣服務(wù)函數(shù)由驅(qū)動程序的開發(fā)者根據(jù)驅(qū)動程序面向的特定低層網(wǎng)絡(luò)類型和硬件以及相應(yīng)環(huán)境,可以有選擇地實現(xiàn),但必須保證驅(qū)動程序最基本的功能,這些基本功能包括初始化、發(fā)送、中斷處理、重置、參數(shù)查詢與設(shè)置和報文接收。

miniportinitialize:操作系統(tǒng)根據(jù)系統(tǒng)配置信息,檢測出網(wǎng)卡已安裝時,由ndis接口在初始化時調(diào)用,主要完成低層網(wǎng)絡(luò)類型確定,對應(yīng)于物理網(wǎng)卡的邏輯網(wǎng)卡初始化,中斷信息注冊,網(wǎng)卡與主機通訊方式的確認。i/o端口的申請與注冊,內(nèi)存映像,mib的初始化,物理網(wǎng)卡的驗證與初始化等。

miniportreconfigure:支持網(wǎng)卡參數(shù)動態(tài)變化,和miniportinitilize一樣由ndis接口以初始化級別調(diào)度執(zhí)行(不能屏蔽中斷,必須由驅(qū)動程序承認并清除在此期間產(chǎn)生的中斷),支持即插即用和軟配置的網(wǎng)卡在動態(tài)改變參數(shù)時,必須提供此函數(shù)。

miniportqueryinformation:查詢網(wǎng)卡的狀態(tài)以及網(wǎng)卡驅(qū)動程序的操作或統(tǒng)計參數(shù),如是否支持組通訊、網(wǎng)卡的物理速率是否支持回環(huán)、是否支持直接拷貝等,這些參數(shù)以oid方式統(tǒng)一管理。

miniportsetinformation:ndis接口或協(xié)議驅(qū)動程序通過調(diào)用此接口改變驅(qū)動程序維護的oid庫,一些操作參數(shù)的改變也將同時改變驅(qū)動程序狀態(tài),例如組地址的設(shè)置。

miniportreset:包括網(wǎng)卡硬件重置和驅(qū)動程序軟件重置,軟件重置包括驅(qū)動程序狀態(tài)重置,以及一些相關(guān)的參數(shù)重置,還需考慮有些參數(shù)的恢復(fù),重置時不必完成所有正在活躍的外部請求,但必須釋放已占用的外部資源。

miniporthalt:掛起網(wǎng)卡并釋放該網(wǎng)卡驅(qū)動程序占用的所有資源,在此期間不屏蔽中斷。

miniportisr:高優(yōu)先級的中斷處理程序,進行的工作包括初始中斷處理類型,決定是否進行中斷轉(zhuǎn)交,對卡上中斷進行處理 等,該服務(wù)類型只在以下情況被調(diào)用:

ndis接口調(diào)用miniportinitialize和miniporthalt兩函數(shù)時。

.中斷處理類型設(shè)為每此中斷處理過程都調(diào)用時。

為使系統(tǒng)能及時響應(yīng)所有硬件中斷,高優(yōu)先級的硬件中斷處理程序應(yīng)盡可能的減少運行時間,防止長時間的屏蔽低優(yōu)先級中斷,避免造程中斷丟失。

miniporthandleinterrupt:由中斷延時處理程序在中斷延時處理時進行調(diào)用。ndis排隊所有的延時處理,該服務(wù)主要處理發(fā)送完成、報文接收、描述符用盡、溢出、網(wǎng)卡異常等中斷。

miniportsend:ndis收到上層發(fā)送請求時經(jīng)過若干協(xié)議處理再向下調(diào)用此服務(wù)過程,發(fā)送的packet已含有l(wèi)lc和mac頭,該服務(wù)過程進行邊界對齊、packet約束重整、描述符映射和報文發(fā)送、以及發(fā)送資源和packet緩沖隊列管理。

miniporttransferdata:多個已和網(wǎng)卡捆綁的協(xié)議驅(qū)動程序在接收到報文到達指示后,向網(wǎng)卡驅(qū)動程序發(fā)出傳送請求以拷貝各自所需的報文數(shù)據(jù)部分,網(wǎng)卡驅(qū)動程序根據(jù)各協(xié)議驅(qū)動程序?qū)蝹€packet是否進行多次拷貝,以決定是否暫存只允許單次拷貝的packet等。

miniportcheckhandle:ndis每秒調(diào)用此服務(wù)函數(shù)一次,驅(qū)動程序發(fā)現(xiàn)網(wǎng)卡異常時報告給ndis由ndis調(diào)用miniportreset進行硬件重恢復(fù)。

miniportenableintrrupt:中斷使能。

miniportdisableinterrupt:中斷屏蔽。

另外,每個網(wǎng)卡驅(qū)動程序必須有一個初始化入口點,由driver entry函數(shù)實現(xiàn),它和系統(tǒng)相關(guān),由操作系統(tǒng)在裝入驅(qū)動程序時調(diào)用,主要完成初始化ndis wrapper,再由wrapper初始生成驅(qū)動程序管理塊并完成相應(yīng)各種初始化工作,登錄網(wǎng)卡驅(qū)動程序所有上邊緣服務(wù)入口點,同時寫入ndis版本信息。

§1.2.4 ndis接口庫

ndis接口庫包括在ndis.sys中,它是一個核態(tài)函數(shù)庫,有一套抽象的函數(shù),無論協(xié)議驅(qū)動程序還是nic驅(qū)動程序都連接到這個庫中,以實現(xiàn)上下層之間的操作。

第二章fddi網(wǎng)卡驅(qū)動程序的加載和運行

第一節(jié) 網(wǎng)卡驅(qū)動程序的安裝

windows nt網(wǎng)卡驅(qū)動程序安裝的目的是實現(xiàn)網(wǎng)卡相應(yīng)硬件信息和驅(qū)動程序在windows nt注冊庫中的注冊,使windows nt能夠正確識別網(wǎng)卡,了解所必需的軟硬件信息并能在windows nt啟動時加載相應(yīng)驅(qū)動程序。

網(wǎng)卡驅(qū)動程序安裝時,首先在主群組的控制面板中選擇“網(wǎng)絡(luò)”,然后添加網(wǎng)卡,指定相應(yīng)信息文件──oemsetup.inf的路徑,以完成以下兩個必要的操作:

復(fù)制驅(qū)動程序到相應(yīng)的系統(tǒng)目錄(windows nt根目錄\system32\drivers\)中;

在windows nt注冊庫中存入相應(yīng)軟硬件信息。

下面主要以fddi網(wǎng)卡為例介紹安裝驅(qū)動程序所必需的工作:

§2.1.1網(wǎng)卡一般硬件參數(shù)

對于fddi網(wǎng)卡,必須在編寫其oemsetup.inf文件時確定以下硬件參數(shù):

總線類型:pci(5)……括號中的數(shù)字5表示pci總線在ndis中的總線類型代碼;

廠商代號:0x5588……系統(tǒng)加載時確定網(wǎng)卡的標記,也是編程時確定pci槽號的標識;

cfid: 0x01;

介質(zhì)類型:光纖(3) ……括號中的數(shù)字表示光纖在ndis中的介質(zhì)類型代碼;

是否支持全雙工:支持。

對于其它的硬件信息在此inf配置信息文件中可有可無,如若配置,則可在驅(qū)動程序的編寫時利用這些信息,方便編程,同時有利于其它應(yīng)用對其參數(shù)的確定和使用。

§2.1.2 fddi網(wǎng)卡加載時需在注冊庫登錄表里做的網(wǎng)絡(luò)配置

網(wǎng)卡驅(qū)動程序的安裝通常將創(chuàng)建登錄表中的四個不同子鍵:

software registrion鍵,對應(yīng)于驅(qū)動程序,存在于hkey_local_machine\software\company\ productname\version中。我們的fddi網(wǎng)卡驅(qū)動程序所對應(yīng)的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

網(wǎng)卡的軟件登錄鍵,存在于hkey_local_machine\software\microsoft\ windows nt\nt3.51\networkcards\yhfddi1;

驅(qū)動程序的服務(wù)登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services

網(wǎng)卡的服務(wù)登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services

對于每一個網(wǎng)絡(luò)部件,一個名為netrules的特殊子鍵在鄰近的驅(qū)動程序或網(wǎng)卡登錄子鍵里創(chuàng)建,netrules標識網(wǎng)絡(luò)部件為網(wǎng)絡(luò)整體的一部分。

fddi網(wǎng)卡驅(qū)動程序?qū)?yīng)的標準軟件登錄表項將出現(xiàn)在以下路徑:

hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

驅(qū)動程序?qū)?yīng)的標準項的值為:

description =yhfddi/pci adapter controller

install date =……

……

refcount =0x01

servicename =yhfddi

softwaretype =driver

title =yhfddi/pci adapter controller

而且在yhfddi驅(qū)動程序相關(guān)的netrules子鍵下,這些值項為:

bindable =yhfddi driver yhfddi adapter non exclusiver

bindform =“yhfddisys”yes no container

class = reg_multi_sz “yhfddi driver basic”

infname =oemnad1.inf

type =yhfddisys ndisdriver yhfddidriver

use =driver

yhfddi網(wǎng)卡在如下路徑的networkcards子鍵里介紹:

hkey_local_machine\software\microsoft\

windows nt\nt3.51\networkcards\yhfddi1;

網(wǎng)卡的標準項包括以下這些值:

description =yhfddi/pci adapter controller

install date =……

manufacturer =net612

productname =yhfddi

servicename =yhfddi01

title =[01]yhfddi/pci adapter controller

§2.1.3編寫inf信息配置文件

gui inf描述語言被windows nt用以書寫系統(tǒng)所有部件的配置文件,當然也可以用以書寫網(wǎng)絡(luò)系統(tǒng)各部件的配置文件,該配置文件描述了網(wǎng)絡(luò)部件安裝、配置、刪除的執(zhí)行過程。當網(wǎng)絡(luò)部件進行初始安裝或二次安裝(通常通過ncpa進行)時,安裝程序讀取部件對應(yīng)的配置文件,進行解釋執(zhí)行。gui inf描述語言由節(jié)、命令、邏輯操作、變量規(guī)范、流程控制以及一套調(diào)用dll或外部程序的機制組成,其中,節(jié)是配置文件的主體,節(jié)可分為install節(jié)(類似于函數(shù)),shell節(jié)(也類似于函數(shù),但可調(diào)用insall和shell節(jié)),detect節(jié)(不包含命令),一個配置文件一般由若干不同類型的節(jié)組成。驅(qū)動程序的開發(fā)者根據(jù)需要可以在配置文件中編寫相應(yīng)代碼,使得用戶和系統(tǒng)之間能進行交互,并且由用戶決定一些配置參數(shù)。

nt網(wǎng)卡配置文件有其一套規(guī)范,驅(qū)動程序開發(fā)者必須按規(guī)范編寫配置文件,一般來說,一個配置文件至少應(yīng)該提供下面三個節(jié):

安裝入口點:[identify]shell節(jié)。該節(jié)主要功能是給出安裝部件的類型名,系統(tǒng)通過它識別該部件屬于哪一大類(display,mouse,scsi,network等)中的哪一類(網(wǎng)絡(luò)adapter,driver,transport,service,network和netprovidor),同時,還需要給出映像文件和配置文件所在的源介質(zhì)及標識。

[returnoption]shell節(jié)。系統(tǒng)執(zhí)行安裝identify節(jié)后,執(zhí)行該節(jié)。它主要功能是檢查所需安裝的部件是否支持的硬件平臺和語言,并給出網(wǎng)卡名(有些配置文件支持多類網(wǎng)卡,此時必須讓用戶進行選擇,并獲得選擇結(jié)果)。

[installoption]shell節(jié)。該節(jié)是配置文件得主體,也是上次安裝完后再次進行配置、刪除、更新的入口點。主要功能是拷貝映像文件和配置文件,生成配置的各種選項,創(chuàng)建該部件在注冊庫中對應(yīng)的各種登錄子樹并更新重寫。

第二節(jié) 驅(qū)動程序的加載過程

§2.2.1 windows nt的啟動過程

第5篇:驅(qū)動程序設(shè)計范文

關(guān)鍵詞:WDMDriver;Windows;例程;DLL

中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2009)33-9557-02

Study about WDM-based I/O Device Driver

SUN Hu-jun

(Department of Computer Engineering, Xi'an Aerotechnical College, Xi'an 710077, China)

Abstract: This article describes the characteristics and structure of the WDM; Describes I/O device driver a basic component;Discusses the DLL in the practical application significance.

Key words: WDMDriver; Windows; distance; DLL

在計算機應(yīng)用系統(tǒng)和控制系統(tǒng)的開發(fā)過程中,通常需要在Windows 環(huán)境下,直接訪問和控制具有特定功能的硬件設(shè)備。由于操作系統(tǒng)版本不同,其運行機制必然存在差異。在這里針對驅(qū)動程序的運行機制主要分為兩類。一類是以前的Dos 和Windows98系統(tǒng),在這類環(huán)境下可以直接完成對I/O 端口的讀寫;另一類是NT4.0以上版本W(wǎng)indows系統(tǒng),在這類環(huán)境下,為了使系統(tǒng)變得更為安全,Windows對系統(tǒng)底層操作采取了屏蔽策略,不允許用戶態(tài)的應(yīng)用程序直接訪問I/O端口,而是通過編寫驅(qū)動程序,這樣可以使用Kernel層設(shè)備驅(qū)動程序提供的各種服務(wù)間接地訪問I/O,因此編寫I/O設(shè)備驅(qū)動程序極為重要。

為了解決I/O設(shè)備驅(qū)動程序和不同結(jié)構(gòu)操作系統(tǒng)的兼容性[3],微軟公司在 1997年提出了一種全新的Windows 驅(qū)動程序模式(WDM),支持即插即用、電源管理和WMI技術(shù),為存在于Windows 9x 和Windows 2000 操作系統(tǒng)中的設(shè)備驅(qū)動程序提供了統(tǒng)一的參考框架。

1 WDM系統(tǒng)函數(shù)

WDM 驅(qū)動程序包含了許多子例程,操作系統(tǒng)通過調(diào)用相關(guān)例程來執(zhí)行針對I/O 請求包的各種操作[1]。WDM 驅(qū)動程序可執(zhí)行包中的內(nèi)容如下:

1.1 基本驅(qū)動程序與設(shè)備操作

DrvierEntry、 AddDevice

① DriverEntry例程負責初始化程序范圍的數(shù)據(jù)結(jié)構(gòu)和資源。

② AddDevice例程是被系統(tǒng)調(diào)用,進行初始化一個被枚舉的新設(shè)備。

1.2 I/O 控制

DpcForIsr、OnInterrupt、StartIo、AdapterControl

① StartIo例程進行串行處理,對IRP進行排隊。

② AdaperControl例程負責執(zhí)行DMA 傳輸。

③ OnInterrupt是一個中斷服務(wù)例程。

④ DPC是一個延遲過程調(diào)用例程。

1.3 派發(fā)功能函數(shù)

DispatchWriter、DispatchRead、DispatchWmi、DispatchPnp DispatchPower

Dispatch為調(diào)度例程,負責處理應(yīng)用程序與驅(qū)動程序之間的通信,包括Writer,Read等,開發(fā)人員必須選擇特定驅(qū)動中需要的例程。

1.4 設(shè)備的創(chuàng)建和初始化

1) 內(nèi)核模式驅(qū)動程序沒有main或WinMain,而是由I/O管理器根據(jù)需要調(diào)用一個驅(qū)動程序例程:① 驅(qū)動程序被裝入時;② 驅(qū)動程序被卸出或系統(tǒng)關(guān)閉時;③ 用戶程序發(fā)出I/O系統(tǒng)服務(wù)調(diào)用時;④ 共享硬件資源對驅(qū)動程序可用時;⑤ 設(shè)備操作過程中的任何時候。

2) 相關(guān)內(nèi)容:① 所有驅(qū)動程序必須包含DriverEntry例程,進行驅(qū)動程序初始化。② 利用AddDevice函數(shù)負責創(chuàng)建一個設(shè)備對象,并建立一個私有的設(shè)備擴展對象。③ 給出設(shè)備名并創(chuàng)建符號連接名或者注冊設(shè)備接口。④ 初始化設(shè)備擴展和設(shè)備對象的標志位。⑤ 把新設(shè)備對象附著到設(shè)備堆棧中。

2 硬件的訪問及資源分配

PnP管理器使用IRP來指導(dǎo)驅(qū)動程序啟動、停止和刪除設(shè)備,并查詢驅(qū)動程序的設(shè)備,WDM是PnP驅(qū)動程序,必須具備PnP例程。IRP是DDK定義的一個數(shù)據(jù)結(jié)構(gòu)。當驅(qū)動程序接收到PnP子碼IRP_MN_START_DEVICE 時,IRP堆棧列表內(nèi)的兩個字段AllocatedResourcesTranslated 和AllocatedResources,列出分配的資源。

用來描述這些資源的結(jié)構(gòu)是CM_PARTIAL_RESOURCE_LIST 類型,它包括一個CM_PARTIAL_RESOURCE_DESCRIPTOR 結(jié)構(gòu)的計數(shù)數(shù)組。

數(shù)組中每一個資源描述符都有一個Type 成員[3],它表示所代表的資源的類型。主要有4個重要的共同體類型是Port(端口)、Interrupt(中斷)、Memory(內(nèi)存)、Dma(直接內(nèi)存訪問)。得到了設(shè)備的I/O地址,就可以對設(shè)備進行讀取了,在讀寫端口地址和內(nèi)存時應(yīng)該使用標準的內(nèi)核讀取例程,在WDM 中應(yīng)使用HAL宏等。這樣就可以不用考慮不同操作平臺的特性,也可以更好的適應(yīng)Windows 2000 多任務(wù),多進程環(huán)境的要求。

在分配硬件資源時,首先必須編輯安裝文件(inf文件),它包含了WDM 設(shè)備驅(qū)動程序的制造商信息、要復(fù)制的文件列表、要創(chuàng)建的注冊表項等。INF 安裝文件向操作系統(tǒng)添加了硬件資源。當驅(qū)動程序收到IRP_MJ_PNP 的IRP_MN_START_DEVICE 的子碼時,驅(qū)動程序獲得設(shè)備的硬件資源。

3 動態(tài)鏈接庫(.dll)

雖然驅(qū)動程序是為設(shè)備硬件層編程服務(wù)的,但同樣需要和應(yīng)用程序進行通信,從而最終達到應(yīng)用程序控制設(shè)備的目的。

通常情況下,應(yīng)用程序通過專用的API 函數(shù)操作硬件,但由于這些函數(shù)攜帶參數(shù)很多,使用起來并不方便,因此可以另外開發(fā)一套用于中轉(zhuǎn)數(shù)據(jù)的功能函數(shù)集(動態(tài)鏈接庫),可以使得底層驅(qū)動設(shè)備對用戶是透明的[2]。采用這種分層結(jié)構(gòu),應(yīng)用程序通過動態(tài)鏈接庫(.dll)來存取I/O設(shè)備。動態(tài)鏈接庫(.dll)提供給應(yīng)用程序最常用的接口函數(shù),包括設(shè)備初始化,關(guān)閉設(shè)備,存取端口等。在應(yīng)用程序中加入特定的動態(tài)鏈接庫可以很方便的操作端口,并且可以重復(fù)使用,縮短了開發(fā)周期。

4 結(jié)束語

WDM驅(qū)動程序模型具有較好的可移植性:編寫驅(qū)動程序時,WDM規(guī)定只使用ANSI C標準規(guī)定的語言元素;硬件和軟件的可配置性靈活:使用HAL工具調(diào)用低級總線驅(qū)動程序或?qū)崿F(xiàn)一個標準控制接口,避免直接引用硬件;使用注冊表作為配置信息的容器;可運行在多處理器平臺上?;?WDM 驅(qū)動模型設(shè)計的驅(qū)動程序可以穩(wěn)定地在Windows 2000/XP/NT下運行,可以更好的實現(xiàn)分布式的數(shù)據(jù)監(jiān)測和控制。

參考文獻:

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

[2] Cant C.Writing Windows WDM Device Drivers[M].孫義,譯.北京:機械工業(yè)出版社,2007.

[3] 李建.Windows2000下I/O設(shè)備驅(qū)動程序設(shè)計[D].北京:北方交通大學,2003.

第6篇:驅(qū)動程序設(shè)計范文

0、引言

“面向?qū)ο蟪绦蛟O(shè)計”是軟件工程專業(yè)和計算機科學與技術(shù)專業(yè)的一門專業(yè)核心課程。該課程是軟件工程等課程的先修課程,同時又是進行軟件開發(fā)的直接工具,是把所學的專業(yè)知識轉(zhuǎn)化為應(yīng)用的橋梁,是學生就業(yè)專業(yè)知識的關(guān)鍵技術(shù),所以該課程在整個教學體系中占據(jù)非常重要的地位。目前該課程在教學中仍普遍采用傳統(tǒng)的以語法講授為主線的課堂教學模式,從而導(dǎo)致學生學習該課程的主動性和積極性不高,缺乏知識運用和解決實際問題的能力,教學效果也不理想。針對目前“面向?qū)ο蟪绦蛟O(shè)計”課程教學中存在的問題,課程組將基于項目的教學方法應(yīng)用于該課程的教學實踐,并取得了初步成效。筆者從教學目標、教學內(nèi)容、教學方法和手段、教學組織和教學評價等幾個方面介紹項目驅(qū)動在“面向?qū)ο蟪绦蛟O(shè)計”課程教學改革中的應(yīng)用,并希望可以與工作在教學改革第一線的教學同行進行交流和探討。

1、項目驅(qū)動教學的理論基礎(chǔ)與認知研究

1.1 目前課程教學中存在的問題

面向?qū)ο蟪绦蛟O(shè)計(OOP)是一種全新的程序設(shè)計思想。但目前該課程大都以演繹的方式來教授,教學中存在重語言介紹、輕對象思想和方法傳授的情況,即在教學內(nèi)容的組織上是以特定的面向?qū)ο蟪绦蛟O(shè)計語言結(jié)構(gòu)組織的,從基本語言要素、語法和語句結(jié)構(gòu)組織,然后再舉一些例子說明這些語句的應(yīng)用,而這些例子都是一些語言語法層面上的簡單應(yīng)用,很少涉及實際問題的解決。這種教學方式不僅不利于學生領(lǐng)會和理解面向?qū)ο蟮乃枷牒头椒?,更不利于培養(yǎng)學生使用面向?qū)ο蠓椒ń鉀Q實際問題能力。

1.2 建構(gòu)主義

工程與科學教學中主要采用的演繹式教學法將課程或知識點作為學科內(nèi)一個自成系統(tǒng)的知識體系來處理。教師按照從一般原理到數(shù)學模型再到模型應(yīng)用這樣的方式進行教學,很少會提到為什么要這樣做,以及這樣的模型可以用來解決什么實際問題,學生為什么要學習這些東西等,而學生的任務(wù)就是被動地吸收這些知識。

在教育心理學中有一個公認的準則,就是只有當人們清楚地意識到有必要去了解某個事物時,他才會最為強烈地去主動學習。如果只是告訴學生某項知識或技能在日后會用得到,并不能起到有效的激勵作用。

與傳統(tǒng)教育模式不同的建構(gòu)主義認為學生的學習是將新的信息納入到自己已有的認知框架中。因此,教育應(yīng)該從學生可能熟悉的內(nèi)容與經(jīng)歷出發(fā),與學生已有的知識結(jié)構(gòu)聯(lián)系起來。教學內(nèi)容應(yīng)該與實際應(yīng)用有關(guān),并與其他知識領(lǐng)域相關(guān)聯(lián),而不應(yīng)是抽象的或獨立的。教育者要創(chuàng)造條件引導(dǎo)學生自行建構(gòu)知識,并從實踐經(jīng)歷中獲得證據(jù)來修正自己的知識建構(gòu)。

建構(gòu)主義支持歸納式的教學,即教學不是從一般原理到應(yīng)用,而是首先從具體事物出發(fā),提出一個有待解決的實際問題;然后教師在學生解決問題的過程中向?qū)W生提供所需的信息,幫助學生把握事實、了解規(guī)則、知道程序、明白原理。項目驅(qū)動的教學也是歸納式教學的一種。

1.3 認知研究

心理學與神經(jīng)學方面的研究對歸納式的項目驅(qū)動教學提供了強有力的支持。

布蘭斯福德(Bmnsf-ord)等人在文獻中指出:“凡是新的學習都涉及先前學習所得信息的轉(zhuǎn)移”,即學生對新知識的接受程度受已有知識的影響是很強的。如果新知識與學生已有知識或認知有聯(lián)系或一致的話,學生學習起來較容易。項目驅(qū)動教學是在學生能聯(lián)系起來的情景、問題或應(yīng)用的背景下提出新的知識。因此,這樣的教學內(nèi)容能夠與學生已有的認知結(jié)構(gòu)結(jié)合起來,是有易于學生接受的。

學生的學習動機會影響到學生愿意投入學習的時間的多少。如果學生發(fā)現(xiàn)學習的東西有用,而且能夠用來做一些對別人有影響的事情的話,學習就會更有積極性。項目驅(qū)動的教學通過與實際應(yīng)用相關(guān)的項目來提供一門課程的教學內(nèi)容與技能。學生在學習的過程中能夠親身體會到所學知識的實用性。因此,這樣的教學方法能夠大大增進學生學習的積極性。

此外,如果教學環(huán)境與實際工作環(huán)境相似,學生在日后就能夠很容易地將課程所學得的知識與技能移用到實際工作場景中。項目驅(qū)動的教學圍繞真實的項目來組織教學,因此有助于彌補學生的學習環(huán)境與實際工作環(huán)境兩者之間的不一致,從而有利于學生將所學的東西應(yīng)用到實際工作中去。

綜上所述,把項目驅(qū)動教學應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程的教學中,能夠激發(fā)學生的學習興趣,有效地提高學生學習的積極性和主動性,改善教學效果,并有利于學生的職業(yè)素質(zhì)和能力的培養(yǎng)。

2、項目驅(qū)動教學的應(yīng)用

課程組將項目驅(qū)動的教學模式應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程的教學過程中,教學以項目為核心,學生為主體。教師在教學中起主導(dǎo)作用,將軟件工程化思想融入到教學內(nèi)容中,以軟件產(chǎn)品的生產(chǎn)周期作為課程內(nèi)容的主框架,教學內(nèi)容包括若干個不同層次的軟件項目,通過項目引出知識點。項目驅(qū)動教學模式在課程教學中的應(yīng)用激發(fā)學生動手實踐和分析思考,提高了學生的綜合應(yīng)用能力。

下面從教學內(nèi)容、教學方法和手段、教學組織和教學評價等方面介紹將項目驅(qū)動教學應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程改革的具體做法。

2.1 基于項目驅(qū)動的教學內(nèi)容改革

課程組通過選用國外原版經(jīng)典教材,引進國外的先進教學理念,依據(jù)課程教學大綱,以職業(yè)活動為導(dǎo)向,以學生為教學主體,以項目為中心,對課程教學內(nèi)容進行整合、序化,構(gòu)建了模塊化課程結(jié)構(gòu),如圖1所示。該結(jié)構(gòu)將課程內(nèi)容劃分為4個模塊:語言基礎(chǔ)、面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)、面向?qū)ο蟪绦蛟O(shè)計的方法理論和開發(fā)應(yīng)用,并細化每個模塊的知識點和職業(yè)素質(zhì)、技能和能力培養(yǎng)的要求,突出面向?qū)ο蟪绦蛟O(shè)計的方法理論和開發(fā)應(yīng)用,著重培養(yǎng)學生的職業(yè)素養(yǎng)、主動學習和創(chuàng)新的能力。

在上述4個教學模塊中,教學內(nèi)容是按項目驅(qū)動的。在講授課程內(nèi)容時直接從面向?qū)ο蟪绦蛟O(shè)計入手,將語言基礎(chǔ)的知識分散到其他模塊中進行講解。在2、3、4級模塊中,通過項目來詳細展示每個單元的重要理論和概念,所涉及的語法知識會隨著解決問題的需要而引入。基于項目驅(qū)動教學的2、3、4級模塊所包含的項目如圖2所示。

項目驅(qū)動教學實施的關(guān)鍵在于項目的設(shè)計與選取。教學項目的設(shè)計與選取遵循有的放矢、與實際應(yīng)用相關(guān)聯(lián)的原則。同時項目的難易程度要以不將學生逼到其“最近發(fā)展區(qū)(Zone ofProximal development)”之外為原則,即選擇的項目要比學生可以獨立完成的項目難一些,但是在教師指導(dǎo)下或與其他學生合作能夠完成。

2.2 基于項目驅(qū)動的教學方法改革

根據(jù)軟件設(shè)計開發(fā)的工程性特點,“面向?qū)ο蟪绦蛟O(shè)計”課程的教學靈活地運用了“基于項目的教學方法”,突出了“理論教學構(gòu)筑學生的知識結(jié)構(gòu),實踐教學構(gòu)筑學生的職業(yè)技能結(jié)構(gòu)”的教學原則,并將面向?qū)ο蟪绦蛟O(shè)計的基本原理、軟件編程的基本規(guī)范和軟件設(shè)計建模的教學完全地融合在一起。

項目驅(qū)動教學法與傳統(tǒng)的教學法相比,有很大的區(qū)別,主要表現(xiàn)在改變了傳統(tǒng)的3個中心,將以“教師”為中心轉(zhuǎn)變?yōu)橐浴皩W生”為中心,以“知識體系”為中心轉(zhuǎn)變?yōu)橐浴绊椖俊睘橹行?,以“理論講解”為中心轉(zhuǎn)變?yōu)橐浴绊椖繉嵺`”為中心。在教學過程中,學生可以參與軟件產(chǎn)品的構(gòu)思、設(shè)計、實施和運行,這給學生創(chuàng)造了感知軟件、動手實踐、分析思考的機會。通過解決問題,學生的學習興趣被激發(fā),基本的工程素質(zhì)和能力得到了培養(yǎng)。“基于項目的教學方法”目的在于創(chuàng)造條件引導(dǎo)學生通過親自參與,自行構(gòu)建知識,而不是簡單地接受教師的詮釋。

2.3 教學評價和考核方法改革

項目驅(qū)動教學重在知識的應(yīng)用與集成,因此教學的考核與評價要強調(diào)對概念的理解,重視對知識、技能學習過程的評價,關(guān)注實踐環(huán)節(jié)及工程應(yīng)用能力,應(yīng)對學生進行多視角、多方位的綜合測評,力求知識與能力的協(xié)調(diào)統(tǒng)一和考核評價的客觀與公正。課程組將考試形式由筆試改為機試,并增加課程設(shè)計考核環(huán)節(jié)。學生最終成績的評定方法是:機試占20%,日常表現(xiàn)(出勤率、作業(yè)與實驗成績)占20%,自我評價與同學生評價占10%,項目設(shè)計和參與程度占20%,答辯情況占20%,撰寫論文或報告占10%。考核形式的改革會引導(dǎo)學生在課程學習中注重編程能力和解決問題能力的培養(yǎng)。

3、項目驅(qū)動在教學中的應(yīng)用效果與評價

從2009~2010學年的第一學期開始,課程組將項目驅(qū)動應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”的課程教學中。通過與傳統(tǒng)教學進行對比,我們得出以下兩方面的結(jié)論。

3.1 項目驅(qū)動對教學產(chǎn)生的正面效果

項目驅(qū)動教學增進了學生在概念理解方面的思維能力,增強了學生分析問題、解決問題的能力,能夠有效地調(diào)動學生學習的積極性,提高學習的責任心,改善了學生與學生、教師與學生之間的互動關(guān)系,在學生的團隊合作與溝通能力培養(yǎng)方面起到積極的作用,特別是對于那些學習風格不適于傳統(tǒng)課堂授課的學生的教學效果特別好。

3.2 項目驅(qū)動教學在應(yīng)用中存在的問題

項目驅(qū)動教學并不是一種很容易開展的教學。從教師方面而言,該方法要求教師對課程知識的把握程度要深,要有豐富的教學經(jīng)驗,能夠根據(jù)教學情況隨機應(yīng)變。就學生方面而言,基于項目的教學方法要求學生對自身的學習負有更多的責任。在項目實施過程中,各種項目管理與人際沖突等問題還會出現(xiàn),這些都是學生所不習慣的,同時也對教師的教學組織能力提出了更高的要求。因此,有些教師和學生在一開始會對它感到不適應(yīng),在學習過程中也會出現(xiàn)兩極分化現(xiàn)象。此外,如文獻中所描述的,基于項目的教學容易產(chǎn)生內(nèi)容知識方面的空白,忽視和遺漏一些關(guān)鍵知識點,從而影響學生今后對一些重要內(nèi)容的進一步學習。

第7篇:驅(qū)動程序設(shè)計范文

關(guān)鍵詞:C#程序設(shè)計;任務(wù)驅(qū)動;工作過程;共享資源;課程開發(fā)

1 引言

程序設(shè)計是一項實踐性很強的活動,項目的完成,需要整合各個知識點,還需要具備綜合應(yīng)用知識的能力。《C#程序設(shè)計》是我校計算機應(yīng)用專業(yè)的一門核心課程,2008年立項為院精品課程,2010年立項為浙江省精品課程。本課程幾年來完成了基于工作過程的課程開發(fā),課程開發(fā)遵循了趙志群教授所講的工學結(jié)合課程的基本原則:學生通過對技術(shù)(或服務(wù))工作的任務(wù)、過程和環(huán)境進行整體化的感悟和反思,實現(xiàn)知識與技能、過程與方法、情感態(tài)度與價值觀學習的統(tǒng)一。課程從提出一個具體的應(yīng)用項目的需求開始,到最終完成項目開發(fā)交給用戶為止,通過若干相對獨立而又逐步發(fā)展的任務(wù)組織知識點,每一個任務(wù)都是先提出要解決的問題,然后明確目標和解決問題的步驟,在.NET Framework基礎(chǔ)上,運用Visual C#進行面向?qū)ο蟮某绦蛟O(shè)計,充分利用面向?qū)ο蟮姆庋b性、繼承性和多態(tài)性等特性實現(xiàn)項目,步步為營,逐步發(fā)展,給學生持續(xù)的動力、興趣和成就感。課程開發(fā)側(cè)重工學結(jié)合,知識和能力的統(tǒng)一。

2 課程開發(fā)的主要步驟

2.1 尋找一系列具有典型意義的綜合性的工作任務(wù)

以就業(yè)為導(dǎo)向是課程體系設(shè)置核心的特征。職業(yè)教育的本質(zhì)就是就業(yè)教育,學習的目標就是為了就業(yè),有助于就業(yè)的我們就學、并且學精,無助于就業(yè)的我們就不學。為了能夠滿足就業(yè)的需求,我們做的第一件事情就是去軟件開發(fā)企業(yè)了解用人狀況和技術(shù)需求,通過對掌握的一手數(shù)據(jù)進行詳細分析和多次專家研討,比較全面地掌握企業(yè)用人需求。尋找一系列具有典型意義的綜合性的工作任務(wù)。

整體化的工作分析的結(jié)果不是獨立的、點狀的“能力點”或者“技能點”,而是過程完整的“典型工作任務(wù)”。

2.2 在典型工作任務(wù)的基礎(chǔ)上設(shè)計學習領(lǐng)域課程及其學習任務(wù)

學習情境的載體是一個“學習與工作任務(wù)”,即“內(nèi)容是工作的學習任務(wù)”,“用于學習的工作任務(wù)”,簡稱“學習任務(wù)”或“學習性任務(wù)”。

學習任務(wù)是學習情境的物質(zhì)化表現(xiàn),它來源于企業(yè)生產(chǎn)或服務(wù)實踐,能夠建立起學習和工作的直接聯(lián)系,但并不一定是企業(yè)真實工作任務(wù)的忠實再現(xiàn)。

軟件開發(fā)領(lǐng)域內(nèi)所涉及到的技術(shù)內(nèi)容是非常多的,不同的行業(yè)會使用不同的技術(shù),不同的項目也會使用不同的技術(shù),在技術(shù)選擇上我們遵循實用原則:所選擇的技術(shù)一定是能夠解決實際工作中的實際問題的技術(shù)。課程主要內(nèi)容集中在如何解決軟件開發(fā)項目中所涉及到的技術(shù)工具、技術(shù)框架、開發(fā)流程和編碼調(diào)試經(jīng)驗等方面?!安灰ケ痴b對象有哪些方法、屬性,而是要去使用這個對象去解決實際問題”。

課程內(nèi)容的安排要以學習任務(wù)為中心來開展,并適當?shù)匕讯鄠€學習任務(wù)聯(lián)結(jié)成一個工程項目。在每一個學習領(lǐng)域課程中,都采用一個實際的開發(fā)項目來組織技術(shù)內(nèi)容,課上老師會通過項目的講解來引出技術(shù)內(nèi)容,而上機課要求同學自己逐步完成一個類似的項目。

在項目的選擇上,在考慮到項目的實用性的同時,也盡可能地提高項目的趣味性、并加強與日常生活中遇到的問題和現(xiàn)象的 聯(lián)系,從而幫助同學理解項目內(nèi)容。

2.3 課程學習任務(wù)舉例

課程體系中典型工作任務(wù)之一:開發(fā)三層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序。

學習任務(wù)1:用三層結(jié)構(gòu)實現(xiàn)不同類型用戶登錄考試管理系統(tǒng)(應(yīng)用面向?qū)ο髮崿F(xiàn)三層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序的開發(fā))。

子任務(wù)1:完成管理員窗體的登錄。

子任務(wù)2:完成學員窗體的登錄。

首先教師指導(dǎo)學生實現(xiàn)管理員窗體的登錄過程,項目在三層結(jié)構(gòu)的基礎(chǔ)上具體實現(xiàn)步驟如下:

(1)實現(xiàn)業(yè)務(wù)實體層。包括新增實體層項目、添加其它項目對實體項目的引用、添加數(shù)據(jù)表對應(yīng)的實體類、編寫實體類。(2)設(shè)計用戶界面。(3)實現(xiàn)數(shù)據(jù)訪問層。(4)實現(xiàn)業(yè)務(wù)邏輯層。(5)實現(xiàn)表示層數(shù)據(jù)綁定。

關(guān)鍵技術(shù):使用實體類消除關(guān)系數(shù)據(jù)與類之間的差別,通過將關(guān)系數(shù)據(jù)封裝成實體對象,用實體對象實現(xiàn)三層結(jié)構(gòu)中數(shù)據(jù)傳遞的載體。見圖1。

運行完成的應(yīng)用系統(tǒng),首先進入系統(tǒng)登錄窗體。見圖2。

學生在數(shù)據(jù)庫管理員表中找到存在的用戶名及密碼并輸入登錄窗體,選擇用戶類別為管理員,進入管理員窗體界面。至此完成管理員窗體的登錄,學生已有了小小的成就感,接下來讓學生獨立完成子任務(wù)2:完成學員窗體的登錄,同時培養(yǎng)了學生對知識的再學習能力。

學習任務(wù)2:用實體類實現(xiàn)教員賬戶創(chuàng)建、實現(xiàn)教員信息預(yù)覽、編輯。

子任務(wù)1:用實體類實現(xiàn)教員賬戶創(chuàng)建。

子任務(wù)2:用實體類實現(xiàn)教員信息預(yù)覽。

子任務(wù)3:用實體類實現(xiàn)教員信息編輯。

2.4 基于“共享型教學資源”的教學模式

創(chuàng)建基于共享型教學資源平臺,建成以“共享型教學資源庫”為核心,以“開放型教學平臺”為載體,具有行業(yè)企業(yè)參與、滿足廣大師生自我學習和自我提高、滿足服務(wù)地方經(jīng)濟需要為一體的具有高可用性、開放性、共享性、伸縮性和可靠性的教學資源共享、管理和服務(wù)平臺。

基于“共享型教學資源”的高職教學平臺能使高職院校和企業(yè)間的需求信息及時、順利地對接,使學校能充分尊重學生職業(yè)生涯的發(fā)展需求,充分調(diào)動學生學習技術(shù)業(yè)務(wù)的自覺性,大力營造崗位成才的環(huán)境和氛圍,使學生盡快適應(yīng)企業(yè)的環(huán)境,實現(xiàn)向“社會人”和“職業(yè)人”的轉(zhuǎn)變。做到學校出人才、企業(yè)用人才、學生實現(xiàn)崗位成才。

基于“共享型教學資源”的高職教學平臺強調(diào)在線學習,重視發(fā)揮學生的主體作用,指導(dǎo)學生利用教學平臺自主探究,引導(dǎo)學生進行發(fā)現(xiàn)學習。

教師利用平臺整合教學資源,提出學習任務(wù),引導(dǎo)學生學習新知識。運用自主學習與協(xié)作學習相結(jié)合的方式進行探究式學習,對任務(wù)進行交流與討論,通過協(xié)作完成并在線提交任務(wù)。教師和企業(yè)專家給出任務(wù)評價標準,并做為課程考核的重要評價指標之一。

3 總結(jié)

浙江省教育廳廳長劉希平說:“我們應(yīng)該高度重視課程開發(fā),尤其是二次開發(fā)。我們應(yīng)該鼓勵和要求教師在教學過程中進行二次開發(fā),即對已有的課程,教師應(yīng)根據(jù)自己的理解、研究,針對學生的實際,進行一些教學創(chuàng)新。教師只有對教材有獨特的理解、系統(tǒng)的分析,才能夠把課教得生動,教得有針對性?!?/p>

本門課程的教學團隊經(jīng)過幾年的教學實踐,針對學生的實際,對課程進行了二次開發(fā),將一個大的項目分解成幾個小的學習任務(wù),再分解成幾個子任務(wù),明確提出任務(wù)的需求和目標,給學生持續(xù)的動力、興趣和成就感。

在項目實施過程中,根據(jù)需要進行分組,以組為單位完成任務(wù),學生的收獲既有交流中的炫耀引發(fā)的自豪感,又有互通有無、相互學習、相互補充中對知識的逐步完善。通過項目教學能夠更好地促進學生實踐能力和綜合素質(zhì)的提高。

在今后的教學中要繼續(xù)完善《基于共享型教學平臺》的建設(shè),使學生通過這個平臺能更好地了解企業(yè)需求,并學會自主學習,能完成平臺提出的相應(yīng)任務(wù)需求,為社會、企業(yè)不斷創(chuàng)造價值,真正實現(xiàn)崗位成才。

參考文獻

[1]北京阿博泰克北大青鳥信息技術(shù)有限公司.在.NET框架下開發(fā)三層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用系統(tǒng)[M].北京:科學技術(shù)文獻出版社,2008.

第8篇:驅(qū)動程序設(shè)計范文

[關(guān)鍵詞]項目驅(qū)動 實踐應(yīng)用 教學改革

[作者簡介]湯海蓉(1974-),女,湖南常德人,湖南文理學院計算機學院,講師,碩士,主要研究方向為數(shù)據(jù)庫、計算機教育。(湖南 常德 415000)李錫輝(1974-),女,湖南望城人,湖南信息職業(yè)技術(shù)學院,副教授,碩士,主要研究方向為WEB應(yīng)用開發(fā),視頻圖像處理。(湖南 長沙 410200)

[中圖分類號]G642 [文獻標識碼]A [文章編號]1004-3985(2012)06-0140-03

在互聯(lián)網(wǎng)時代,JAVA語言已經(jīng)是使用最廣泛的編程語言之一。由于免費、跨平臺、語言本身技術(shù)先進,它已經(jīng)成為許多學科研究、課程和計算的首選語言。有關(guān)資料顯示,IT人才屬國內(nèi)人才緊缺指數(shù)較高的一類,優(yōu)秀的JAVA編程人員更是尤其缺乏。隨著3G、物聯(lián)網(wǎng)時代的到來,JAVA語言不僅不會“過時”,相反,它將會在新的業(yè)務(wù)領(lǐng)域有著更輝煌的發(fā)展前景。正因如此,目前各類高校均將JAVA作為計算機專業(yè)的主要教學語言之一,通過學習,學生可以獲得一定的編程能力,鍛煉自己的邏輯思維,為將來的就業(yè)打好基礎(chǔ)。

一、JAVA語言目前教學中存在的問題

傳統(tǒng)實踐教學中,由于受諸多因素的影響,教學效果不甚理想。具體表現(xiàn)在:

1 教學手法單一。傳統(tǒng)的教學是以教師、教材為中心。教師負責教,學生負責學,教材怎么寫,教師就怎么講,學生就怎么學。一般方法是教師根據(jù)大綱和教材,針對某個知識點進行重點講授,列舉若干驗證性的實驗加以佐證,學生亦通過上機編寫一些小的算法,對課堂上的某一到兩個知識點加以理解和吸收。一定程度上忽視了學生作為學習主體的存在,忽視了JA―VA語言具有極強實踐性的特征,使學生喪失了學習的積極性、自主性和創(chuàng)造性。

2 學生對課程的難度認識不夠。源于JAVA在行業(yè)中的廣泛應(yīng)用,許多學生初次接觸JAVA,對學成之后的前景是非常期待的,因而興趣十分濃厚,又由于有C及C++語言的基礎(chǔ),會認為不過是C++的向上封裝。但隨著學習的深入,面對大量不斷涌現(xiàn)的各類環(huán)境配置、OOP思想、類庫、乃至設(shè)計模式、架構(gòu)等,繁多而枯燥,在沒有實際成果激勵的情況下,無法達到原來的預(yù)期,就會產(chǎn)生畏難心理,進而影響后續(xù)的學習。

3 實踐能力差。傳統(tǒng)教學模式下培養(yǎng)出的學生,被動接受知識,理論掌握得較好,也能在實驗中實現(xiàn)一些孤立算法,各個知識點之間沒有建立相關(guān)串聯(lián),一旦被要求完成一個實際的完整項目時,則會茫然得不知從何下手。更不用說運用軟件工程的思想進行開發(fā)和團隊合作了。

4 考核標準單一。傳統(tǒng)教學對學生的考核是通過筆試完成的,掌握了教師所交給的課本知識,通過記憶,考試就能夠取得好成績,學校對教師的評價也基本上是看教學成績,使部分學生產(chǎn)生了只要背背知識點通過考試就行、實踐無所謂的錯誤傾向。這種重結(jié)果而不重過程。重考試成績而不重全面發(fā)展的考核方式,不能充分地發(fā)揮出考核作為指導(dǎo)教學、檢驗學生學習能力的指揮棒作用。

以上諸多問題究其根源是學生學習動力的缺乏,解決的辦法就在于激發(fā)其學習興趣和信心,最好的途徑就是能夠讓學生自己動手解決實際問題,讓其能力得到肯定和承認,讓其體會到成功的快樂,從而增強學習動力。針對于此,有必要對傳統(tǒng)的課程教學模式進行改革,經(jīng)過不斷實踐,筆者在教學中總結(jié)了一套行之有效的基于項目驅(qū)動的教學方法。

二、基于項目驅(qū)動的教學法

基于項目驅(qū)動的教學法是指根據(jù)大綱所規(guī)定的教學內(nèi)容、教學目的和教學要求,將一個實際管理活動中與課程相關(guān)的內(nèi)容,加以收集、歸納、整理,形成項目任務(wù)。依托這些資料,教師通過巧妙設(shè)計教學內(nèi)容,深入淺出地講解知識點,形象地指導(dǎo)學生實施理論聯(lián)系實際,讓學生通過完成項目來達到掌握知識的目的。學生在強烈的問題動機驅(qū)動下,通過對教學資源的主動應(yīng)用,進行自主探索和互動協(xié)作,根據(jù)項目要求進行需求分析、數(shù)據(jù)庫設(shè)計、代碼編寫以及測試,針對項目中各種實際問題,獨立思考,協(xié)同探索,研究解決問題的方法,通過實踐實現(xiàn)目標,提高概括分析問題、解決實際問題以及編程的能力。

基于項目驅(qū)動的教學目的是以學生為中心,但不是要求學生只會解釋問題,而是要培養(yǎng)學生具有解決實際問題的能力,解決“干什么”“怎么干”的問題。強調(diào)以直接經(jīng)驗的形式來掌握融合在各實踐活動中的最新知識、技能和技巧。在項目教學中,學生不但學習了新知識,更學會了探究解決問題的一般研究規(guī)律和方法,這為學生分析新的項目,達到舉一反三的目標,打下了良好的專業(yè)基礎(chǔ),讓其能在將來的工作中,很快進入角色。

三、具體操作

經(jīng)過實踐總結(jié),筆者將項目驅(qū)動教學的過程劃分成以下幾個步驟,具體如圖1所示:

1 確定項目。課程學習開始之初,先選取一個與學生聯(lián)系較為緊密的實際項目,比如學生管理系統(tǒng)、網(wǎng)上商城等。項目的選擇要求如下:(1)具有典型性、符合實際;(2)項目設(shè)計的問題具有啟發(fā)性,符合教學的要求;(3)符合教學目標的需要;(4)內(nèi)容的深淺應(yīng)符合學生學習的需求;(5)項目的設(shè)計應(yīng)體現(xiàn)知識的系統(tǒng)性和整合性。以學生管理系統(tǒng)為例,首先將教師在以往工作中編寫的系統(tǒng)運行展示給學生,讓其大致了解將來要求設(shè)計完成的效果,激起學生的興趣,然后有的放矢地設(shè)計自己的目標項目。

2 任務(wù)劃分及小組分工。根據(jù)軟件工程的思想,以項目功能模塊為單位進行小組劃分,并選定小組負責人,培養(yǎng)團隊精神。具體劃分見圖2。在項目的需求分析階段,小組成員可以通過集體討論,集思廣益,給出設(shè)計方案;在設(shè)計過程中,由組長安排各成員的分工協(xié)作,確定每人所承擔的任務(wù)。成員可以輪流承擔各階段的設(shè)計、編碼和測試任務(wù),使學生在過程中扮演不同的角色,培養(yǎng)各方面的能力,加強與他人的溝通;要求每個小組既要實現(xiàn)獨立的子系統(tǒng)的功能,又應(yīng)當與其他小組建立聯(lián)系,最后要求整合以共同完成整個項目。

3 教學安排。在教學過程中,教師要對教材上的知識點進行重新組織和安排。不是不加選擇地從頭講到尾,而是根據(jù)知識點的難易程度、實用性以及與實踐項目的關(guān)系密切程度,有選擇地進行講解。由于前期已有相關(guān)課程的學習基礎(chǔ),比如在C++課程中已經(jīng)學習了OOP的思想及相關(guān)語法知識,只需對其差異部分稍加講解;數(shù)據(jù)庫相關(guān)知識的掌握,使得學生可以較早著手分析和數(shù)據(jù)庫相關(guān)的內(nèi)容,進行概念結(jié)構(gòu)設(shè)計和邏輯結(jié)構(gòu)設(shè)計。另外,針對教材一般只定位于J2SE中的一部分基礎(chǔ)知識,根據(jù)項目實踐需要以及學生的能力水平,還需將一部分高級和擴展部分內(nèi)容穿插到課堂和實踐中,如網(wǎng)絡(luò)編程、系統(tǒng)的邏輯架構(gòu)及物理架構(gòu)的設(shè)計等,以幫助學生提高項目實踐能力。部分教學安排見下表:

4 過程指導(dǎo)。在項目進行過程中,主要依靠學生自身的能力和團隊的協(xié)作,通過查閱資料及網(wǎng)絡(luò)自主學習,以團隊為單位

獨立解決遇到的困難;教師亦必須全程指導(dǎo)、策劃,協(xié)調(diào)各個子項目之間的協(xié)同進展,通過多種教學手段答疑解惑,如推薦網(wǎng)絡(luò)版教程、Email答疑、QQ群集體討論、定期當面探討等,對設(shè)計過程中可能遇到的較深入的知識點進行有效學習指導(dǎo),在項目的一些關(guān)鍵階段進行適當?shù)狞c評,并對設(shè)計過程中出現(xiàn)的偏差及時糾正,鼓勵學生獨立思考和團隊協(xié)作,引導(dǎo)學生變注重知識為注重能力,使他們完善設(shè)計,促進自身的不斷提高。

5 綜合評估。學期結(jié)束,需要對完成的較完整的項目進行檢查與評價。首先應(yīng)由學生對自己的工作進行評定,闡述包括在項目準備、具體設(shè)計、測試過程中碰到的各種疑難問題、解決的手法以及結(jié)果如何,總結(jié)團隊合作的感受,并對本組負責的模塊的運行效果加以點評。教師最后進行工作總結(jié),總結(jié)團隊中各成員在設(shè)計過程中的分工和職能的完成情況,依據(jù)各組負責模塊的難易程度、總體完成情況、個人對團隊的貢獻等因素進行綜合評判,給出學生的實踐能力成績,找出差距與改正方法,并最終納入到課程考核成績中。最后,還應(yīng)指導(dǎo)學生分組撰寫實踐報告。

6 教學效果分析。基于項目的教學實施之后,與上一學年的學長相比,本學年的學生的學習積極性明顯提高,學生不僅積極完成課堂上的任務(wù),同時也開始自主學習,積極組織及參與各種形式的討論,課后提問明顯增多,學習氣氛濃厚。同時。學生開發(fā)編寫的代碼數(shù)量和質(zhì)量有了質(zhì)的提升,并對于一些較為深入的內(nèi)容也有所主動涉及,如設(shè)計模式等,真正實現(xiàn)了“學為所用”和“學以致用”。此外,在設(shè)計過程中還培養(yǎng)了團隊協(xié)作精神和集體榮譽感,鍛煉了溝通能力和合作意識。而對于設(shè)計過程中不斷出現(xiàn)的新問題和新思路,也促使教師加深思考,根據(jù)不同學生的不同理解補充新的教學內(nèi)容,教學相長。

四、項目教學中應(yīng)注意的問題

1 正確處理項目教學與傳統(tǒng)課堂講授教學的關(guān)系。項目教學并不能完全取代傳統(tǒng)課堂講授,教師對一門學科的重點和難點進行適當講授,是教學中不能缺少的。另一方面,課堂講授應(yīng)當是誘導(dǎo)式的、啟發(fā)式的,應(yīng)與項目教學結(jié)合起來,只有把兩者有機地結(jié)合起來才能取得更好的效果。因此,項目教學的優(yōu)勢是明顯的,但也不是完美無缺的,我們應(yīng)在教學中充分發(fā)揮項目教學與傳統(tǒng)講授各自的優(yōu)勢,取長補短,培養(yǎng)適應(yīng)社會發(fā)展的實用型人才。

2 正確處理項目教學與其他教學手段的關(guān)系。在教學過程中,除了項目教學、傳統(tǒng)講授教學以外,還有許多其他教學手段,例如模擬實驗等手段,對于學生各方面知識與技能的培養(yǎng)都是非常有利的。因此,在教學過程中,我們不能囿于項目教學與傳統(tǒng)講授兩種方法,應(yīng)該根據(jù)課程內(nèi)容的不同特點。選擇不同的教學方法,以此激發(fā)學生的學習熱情。

3 項目教學對教師和學生都提出了更新、更多的要求。教師必須具備完成一個項目所需的全部理論知識和專業(yè)技能,尋找到一個能覆蓋學生學習領(lǐng)域所涉及的全部或絕大多數(shù)內(nèi)容的合適項目,必須充分收集、熟悉、掌握相關(guān)資料。并從中歸納要點,提供分析、討論的框架,必須做大量的準備工作以應(yīng)對學生可能提出的各種問題,還要求教師具有很強的調(diào)控能力。從學生方面來看,再不能像以前那樣被動地接受“滿堂灌”,而必須充分發(fā)揮自己的主動性,查閱大量參考資料。提前預(yù)習,發(fā)現(xiàn)問題,與他人合作,開展調(diào)查研究,提出解決問題的對策,運用適當?shù)姆椒ê褪侄?,表達、交流、反思自己學習和設(shè)計的見解及成果。

第9篇:驅(qū)動程序設(shè)計范文

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

引言

Linux是一個遵循POSIX標準的免費操作系統(tǒng)。具有BSD和SYSV的擴展特性。與其他操作系統(tǒng)相比,嵌入式Linux系統(tǒng)以其可應(yīng)用于多種硬件平臺、內(nèi)核高效穩(wěn)定、源碼開放、軟件豐富、網(wǎng)絡(luò)通信和文件管理機制完善等優(yōu)良特性而正被作為研究熱點,越來越多的研究人員采用Linux平臺來開發(fā)自己的產(chǎn)品。Linux設(shè)備驅(qū)動程序在Linux內(nèi)核源代碼中占有很大比例,從2.0、2.2到2.4版本的內(nèi)核,源代碼的長度日益增加,其實主要是設(shè)備驅(qū)動程序在增加。

設(shè)備驅(qū)動程序的編寫

設(shè)備驅(qū)動程序是linux內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核和機器硬件之間的接口,它由一組函數(shù)和一些私有數(shù)據(jù)組成,是連接應(yīng)用程序與具體硬件的橋梁。Linux的一個基本特點是它對硬件設(shè)備的管理抽象化,系統(tǒng)中的每一個設(shè)備都用一個特殊的文件來表示。所有的硬件設(shè)備都像普通的文件一樣看待,使用與操作系統(tǒng)相同的標準系統(tǒng)來進行打開、讀寫和關(guān)閉。

在Linux操作系統(tǒng)下有3類主要的設(shè)備文件類型:塊設(shè)備、字符設(shè)備、網(wǎng)絡(luò)設(shè)備。字符設(shè)備是指存取時沒有緩存的設(shè)備??上裎募粯釉L問字符設(shè)備,字符設(shè)備驅(qū)動程序負責實現(xiàn)這些行為。系統(tǒng)的控制臺和并口就是字符設(shè)備的例子,它們可以很好地用“流”來描述。塊設(shè)備是文件系統(tǒng)的宿主,如磁盤。Linux允許像字符設(shè)備那樣讀取塊設(shè)備――允許一次傳輸任意數(shù)目的字節(jié)。結(jié)果是,字符設(shè)備和塊設(shè)備讀取數(shù)方式一致。而網(wǎng)絡(luò)設(shè)備不同于字符設(shè)備和塊設(shè)備,它面向的上一層不是文件系統(tǒng)而是網(wǎng)絡(luò)協(xié)議層,是通過BSD套接口訪問數(shù)據(jù)。與設(shè)備相對應(yīng)的是三類設(shè)備驅(qū)動程序,字符設(shè)備驅(qū)動程序、塊設(shè)備驅(qū)動程序、網(wǎng)絡(luò)設(shè)備驅(qū)動程序。

字符設(shè)備驅(qū)動程序、塊設(shè)備驅(qū)動程序與網(wǎng)絡(luò)設(shè)備驅(qū)動程序的結(jié)構(gòu)體是不同的。

在linux源代碼linux/include/linux/fs.h中定義了字符設(shè)備和塊設(shè)備驅(qū)動程序中必須使用的file_operations結(jié)構(gòu),每個設(shè)備驅(qū)動都實現(xiàn)這個接口所定義的部分或全部函數(shù)。隨著內(nèi)核的不斷升級,file_operations結(jié)構(gòu)也越來越大,不同的版本的內(nèi)核會稍有不同。

應(yīng)用程序只有通過對設(shè)備文件的open、release、read、write、ioctl等才能訪問字符設(shè)備和塊設(shè)備。用戶自己定義好file_operations結(jié)構(gòu)后,編寫出設(shè)備實際所需要的各操作函數(shù),對于不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊到內(nèi)核,當應(yīng)用程序?qū)υO(shè)備相應(yīng)的設(shè)備文件進行文件操作時,內(nèi)核會找到相應(yīng)的操作函數(shù),并進行調(diào)用。如果操作函數(shù)使用NULL,操作函數(shù)就進行默認處理。

對于字符設(shè)備而言,llseek(),read(),write(),ioctl(),open(),release()這些函數(shù)是不可缺的;對十塊設(shè)備,open(),release(),ioctl(),check_media_change(),revalidate()是不可缺少的。

網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)體net_device定義在include\linuxhletdevice.h里,如下所示:

定義好net_device結(jié)構(gòu)體后,根據(jù)實際情況編寫操作函數(shù),其中hard_start_xmit()函數(shù)是用來發(fā)送數(shù)據(jù)的,set mac address()是進行網(wǎng)絡(luò)參數(shù)設(shè)置的。

當linux初始化時將調(diào)用初始化函數(shù)intdevice_init(),該函數(shù)包括以下內(nèi)容:

注冊所用設(shè)備。linux用設(shè)備號來標識字符設(shè)備和塊設(shè)備。設(shè)備號分為主設(shè)備號和從設(shè)備號,最終形成設(shè)備接點。設(shè)備節(jié)點在訪問字符設(shè)備和塊設(shè)備的設(shè)備驅(qū)動程序時將使用。通常主設(shè)備號標識設(shè)備對應(yīng)的驅(qū)動程序,大多數(shù)設(shè)備是“一個主設(shè)備號對應(yīng)一個驅(qū)動程序”,如:虛擬控制臺和串口終端由驅(qū)動程序4管理。次設(shè)備號由內(nèi)核使用,用于確定設(shè)備文件所指的設(shè)備。字符設(shè)備和塊設(shè)備注冊時必須先定義好設(shè)備號。

字符設(shè)備注冊函數(shù)如下:

int register_chrdev(unsigned int major,constchar*name,struct file_oprations*fops);其中major是主設(shè)備號。

由于對網(wǎng)絡(luò)設(shè)備驅(qū)動程序的訪問不需要設(shè)備節(jié)點,它的注冊函數(shù)如下:

int register_netdev(struct net_device*dev)

注冊設(shè)備所用的中斷。中斷在現(xiàn)代計算機結(jié)構(gòu)中有重要的地位,操作系統(tǒng)必須提供程序響應(yīng)中斷的能力。一般是把一個中斷處理程序注冊到系統(tǒng)中去。操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動程序的處理程序。

注冊中斷所用的函數(shù)如下:其中,irq是中斷向量;handler是中斷處理函數(shù);flags是中斷處理中的掩碼;devices是設(shè)備名;dev_id是在中斷共享使用的id。

當linux不使用該設(shè)備時,就要調(diào)用清除函

編寫服務(wù)子程序

服務(wù)于I/O請求的子程序,又稱為驅(qū)動程序的上半部分。調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時候,系統(tǒng)仍認為是和進行調(diào)用的進程屬于同一個進程,只是用戶態(tài)變成了核心態(tài),具有進行此系統(tǒng)調(diào)用的用戶程序的運行環(huán)境,因此可以在其中調(diào)用sleep等與進程運行環(huán)境有關(guān)的函數(shù)。

中斷服務(wù)子程序,又稱為驅(qū)動程序的下半部分。在Linux系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以產(chǎn)生在任何一個進程運行的時候,因此在中斷服務(wù)程序被調(diào)用的時候,不能依賴于任何進程的狀態(tài),也就不能調(diào)用任何與進程運行環(huán)境相關(guān)的函數(shù)。因為設(shè)備驅(qū)動程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)程序的時候,都帶有一個或多個參數(shù),以唯一標識請求服務(wù)的設(shè)備。

設(shè)備驅(qū)動程序的使用

直接將驅(qū)動程序編譯進linux內(nèi)核

將設(shè)備驅(qū)動程序復(fù)制到linux/drivers相關(guān)的子目錄下,比如字符設(shè)備驅(qū)動程序就放在linux/drivers/char下。

修改linux/drivers相關(guān)的子目錄的Makefile,

如obj-$(config_dev_driver)+=dev_driver.o,這樣在編譯內(nèi)核時將會編譯dev_driver.c,生成dev_driver.o.

對內(nèi)核進行重新編譯時,進行相關(guān)的配置,比如要使用AT91RM9200的UART,就要如下配置:

Character devices->Serial drivers.>AT91RM9200 serial port suppot

將驅(qū)動程序編譯成驅(qū)動模塊

在設(shè)備驅(qū)動程序中要有兩個重要函數(shù):

module_init(dev-init),module_exit(dev_exit)

利用相應(yīng)的交叉編譯器以及編譯命令將驅(qū)動程序dev_driver.c編譯成dev_driver.o這樣的動態(tài)驅(qū)動模塊。利用insmod命令給系統(tǒng)安裝驅(qū)動模塊,如果在/dev目錄下沒有相應(yīng)的設(shè)備文件,就可以使用mknod創(chuàng)建一個設(shè)備文件。利用rmmod命令卸載驅(qū)動模塊,設(shè)備文件的刪除可以用rm命令。