前言:一篇好文章的誕生,需要你不斷地搜集資料、整理思路,本站小編為你收集了豐富的驅(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ù)前綴名。現(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ū)動工作流程。
通信卡的硬件設(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)存儲器中??ㄉ蟂RAM不占用主機內(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)崩潰。
關(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.
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的啟動過程
關(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].北京:北方交通大學(xué),2003.
0、引言
“面向?qū)ο蟪绦蛟O(shè)計”是軟件工程專業(yè)和計算機科學(xué)與技術(shù)專業(yè)的一門專業(yè)核心課程。該課程是軟件工程等課程的先修課程,同時又是進行軟件開發(fā)的直接工具,是把所學(xué)的專業(yè)知識轉(zhuǎn)化為應(yīng)用的橋梁,是學(xué)生就業(yè)專業(yè)知識的關(guān)鍵技術(shù),所以該課程在整個教學(xué)體系中占據(jù)非常重要的地位。目前該課程在教學(xué)中仍普遍采用傳統(tǒng)的以語法講授為主線的課堂教學(xué)模式,從而導(dǎo)致學(xué)生學(xué)習該課程的主動性和積極性不高,缺乏知識運用和解決實際問題的能力,教學(xué)效果也不理想。針對目前“面向?qū)ο蟪绦蛟O(shè)計”課程教學(xué)中存在的問題,課程組將基于項目的教學(xué)方法應(yīng)用于該課程的教學(xué)實踐,并取得了初步成效。筆者從教學(xué)目標、教學(xué)內(nèi)容、教學(xué)方法和手段、教學(xué)組織和教學(xué)評價等幾個方面介紹項目驅(qū)動在“面向?qū)ο蟪绦蛟O(shè)計”課程教學(xué)改革中的應(yīng)用,并希望可以與工作在教學(xué)改革第一線的教學(xué)同行進行交流和探討。
1、項目驅(qū)動教學(xué)的理論基礎(chǔ)與認知研究
1.1 目前課程教學(xué)中存在的問題
面向?qū)ο蟪绦蛟O(shè)計(OOP)是一種全新的程序設(shè)計思想。但目前該課程大都以演繹的方式來教授,教學(xué)中存在重語言介紹、輕對象思想和方法傳授的情況,即在教學(xué)內(nèi)容的組織上是以特定的面向?qū)ο蟪绦蛟O(shè)計語言結(jié)構(gòu)組織的,從基本語言要素、語法和語句結(jié)構(gòu)組織,然后再舉一些例子說明這些語句的應(yīng)用,而這些例子都是一些語言語法層面上的簡單應(yīng)用,很少涉及實際問題的解決。這種教學(xué)方式不僅不利于學(xué)生領(lǐng)會和理解面向?qū)ο蟮乃枷牒头椒?,更不利于培養(yǎng)學(xué)生使用面向?qū)ο蠓椒ń鉀Q實際問題能力。
1.2 建構(gòu)主義
工程與科學(xué)教學(xué)中主要采用的演繹式教學(xué)法將課程或知識點作為學(xué)科內(nèi)一個自成系統(tǒng)的知識體系來處理。教師按照從一般原理到數(shù)學(xué)模型再到模型應(yīng)用這樣的方式進行教學(xué),很少會提到為什么要這樣做,以及這樣的模型可以用來解決什么實際問題,學(xué)生為什么要學(xué)習這些東西等,而學(xué)生的任務(wù)就是被動地吸收這些知識。
在教育心理學(xué)中有一個公認的準則,就是只有當人們清楚地意識到有必要去了解某個事物時,他才會最為強烈地去主動學(xué)習。如果只是告訴學(xué)生某項知識或技能在日后會用得到,并不能起到有效的激勵作用。
與傳統(tǒng)教育模式不同的建構(gòu)主義認為學(xué)生的學(xué)習是將新的信息納入到自己已有的認知框架中。因此,教育應(yīng)該從學(xué)生可能熟悉的內(nèi)容與經(jīng)歷出發(fā),與學(xué)生已有的知識結(jié)構(gòu)聯(lián)系起來。教學(xué)內(nèi)容應(yīng)該與實際應(yīng)用有關(guān),并與其他知識領(lǐng)域相關(guān)聯(lián),而不應(yīng)是抽象的或獨立的。教育者要創(chuàng)造條件引導(dǎo)學(xué)生自行建構(gòu)知識,并從實踐經(jīng)歷中獲得證據(jù)來修正自己的知識建構(gòu)。
建構(gòu)主義支持歸納式的教學(xué),即教學(xué)不是從一般原理到應(yīng)用,而是首先從具體事物出發(fā),提出一個有待解決的實際問題;然后教師在學(xué)生解決問題的過程中向?qū)W生提供所需的信息,幫助學(xué)生把握事實、了解規(guī)則、知道程序、明白原理。項目驅(qū)動的教學(xué)也是歸納式教學(xué)的一種。
1.3 認知研究
心理學(xué)與神經(jīng)學(xué)方面的研究對歸納式的項目驅(qū)動教學(xué)提供了強有力的支持。
布蘭斯福德(Bmnsf-ord)等人在文獻中指出:“凡是新的學(xué)習都涉及先前學(xué)習所得信息的轉(zhuǎn)移”,即學(xué)生對新知識的接受程度受已有知識的影響是很強的。如果新知識與學(xué)生已有知識或認知有聯(lián)系或一致的話,學(xué)生學(xué)習起來較容易。項目驅(qū)動教學(xué)是在學(xué)生能聯(lián)系起來的情景、問題或應(yīng)用的背景下提出新的知識。因此,這樣的教學(xué)內(nèi)容能夠與學(xué)生已有的認知結(jié)構(gòu)結(jié)合起來,是有易于學(xué)生接受的。
學(xué)生的學(xué)習動機會影響到學(xué)生愿意投入學(xué)習的時間的多少。如果學(xué)生發(fā)現(xiàn)學(xué)習的東西有用,而且能夠用來做一些對別人有影響的事情的話,學(xué)習就會更有積極性。項目驅(qū)動的教學(xué)通過與實際應(yīng)用相關(guān)的項目來提供一門課程的教學(xué)內(nèi)容與技能。學(xué)生在學(xué)習的過程中能夠親身體會到所學(xué)知識的實用性。因此,這樣的教學(xué)方法能夠大大增進學(xué)生學(xué)習的積極性。
此外,如果教學(xué)環(huán)境與實際工作環(huán)境相似,學(xué)生在日后就能夠很容易地將課程所學(xué)得的知識與技能移用到實際工作場景中。項目驅(qū)動的教學(xué)圍繞真實的項目來組織教學(xué),因此有助于彌補學(xué)生的學(xué)習環(huán)境與實際工作環(huán)境兩者之間的不一致,從而有利于學(xué)生將所學(xué)的東西應(yīng)用到實際工作中去。
綜上所述,把項目驅(qū)動教學(xué)應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程的教學(xué)中,能夠激發(fā)學(xué)生的學(xué)習興趣,有效地提高學(xué)生學(xué)習的積極性和主動性,改善教學(xué)效果,并有利于學(xué)生的職業(yè)素質(zhì)和能力的培養(yǎng)。
2、項目驅(qū)動教學(xué)的應(yīng)用
課程組將項目驅(qū)動的教學(xué)模式應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程的教學(xué)過程中,教學(xué)以項目為核心,學(xué)生為主體。教師在教學(xué)中起主導(dǎo)作用,將軟件工程化思想融入到教學(xué)內(nèi)容中,以軟件產(chǎn)品的生產(chǎn)周期作為課程內(nèi)容的主框架,教學(xué)內(nèi)容包括若干個不同層次的軟件項目,通過項目引出知識點。項目驅(qū)動教學(xué)模式在課程教學(xué)中的應(yīng)用激發(fā)學(xué)生動手實踐和分析思考,提高了學(xué)生的綜合應(yīng)用能力。
下面從教學(xué)內(nèi)容、教學(xué)方法和手段、教學(xué)組織和教學(xué)評價等方面介紹將項目驅(qū)動教學(xué)應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”課程改革的具體做法。
2.1 基于項目驅(qū)動的教學(xué)內(nèi)容改革
課程組通過選用國外原版經(jīng)典教材,引進國外的先進教學(xué)理念,依據(jù)課程教學(xué)大綱,以職業(yè)活動為導(dǎo)向,以學(xué)生為教學(xué)主體,以項目為中心,對課程教學(xué)內(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)學(xué)生的職業(yè)素養(yǎng)、主動學(xué)習和創(chuàng)新的能力。
在上述4個教學(xué)模塊中,教學(xué)內(nèi)容是按項目驅(qū)動的。在講授課程內(nèi)容時直接從面向?qū)ο蟪绦蛟O(shè)計入手,將語言基礎(chǔ)的知識分散到其他模塊中進行講解。在2、3、4級模塊中,通過項目來詳細展示每個單元的重要理論和概念,所涉及的語法知識會隨著解決問題的需要而引入?;陧椖框?qū)動教學(xué)的2、3、4級模塊所包含的項目如圖2所示。
項目驅(qū)動教學(xué)實施的關(guān)鍵在于項目的設(shè)計與選取。教學(xué)項目的設(shè)計與選取遵循有的放矢、與實際應(yīng)用相關(guān)聯(lián)的原則。同時項目的難易程度要以不將學(xué)生逼到其“最近發(fā)展區(qū)(Zone ofProximal development)”之外為原則,即選擇的項目要比學(xué)生可以獨立完成的項目難一些,但是在教師指導(dǎo)下或與其他學(xué)生合作能夠完成。
2.2 基于項目驅(qū)動的教學(xué)方法改革
根據(jù)軟件設(shè)計開發(fā)的工程性特點,“面向?qū)ο蟪绦蛟O(shè)計”課程的教學(xué)靈活地運用了“基于項目的教學(xué)方法”,突出了“理論教學(xué)構(gòu)筑學(xué)生的知識結(jié)構(gòu),實踐教學(xué)構(gòu)筑學(xué)生的職業(yè)技能結(jié)構(gòu)”的教學(xué)原則,并將面向?qū)ο蟪绦蛟O(shè)計的基本原理、軟件編程的基本規(guī)范和軟件設(shè)計建模的教學(xué)完全地融合在一起。
項目驅(qū)動教學(xué)法與傳統(tǒng)的教學(xué)法相比,有很大的區(qū)別,主要表現(xiàn)在改變了傳統(tǒng)的3個中心,將以“教師”為中心轉(zhuǎn)變?yōu)橐浴皩W(xué)生”為中心,以“知識體系”為中心轉(zhuǎn)變?yōu)橐浴绊椖俊睘橹行?,以“理論講解”為中心轉(zhuǎn)變?yōu)橐浴绊椖繉嵺`”為中心。在教學(xué)過程中,學(xué)生可以參與軟件產(chǎn)品的構(gòu)思、設(shè)計、實施和運行,這給學(xué)生創(chuàng)造了感知軟件、動手實踐、分析思考的機會。通過解決問題,學(xué)生的學(xué)習興趣被激發(fā),基本的工程素質(zhì)和能力得到了培養(yǎng)?!盎陧椖康慕虒W(xué)方法”目的在于創(chuàng)造條件引導(dǎo)學(xué)生通過親自參與,自行構(gòu)建知識,而不是簡單地接受教師的詮釋。
2.3 教學(xué)評價和考核方法改革
項目驅(qū)動教學(xué)重在知識的應(yīng)用與集成,因此教學(xué)的考核與評價要強調(diào)對概念的理解,重視對知識、技能學(xué)習過程的評價,關(guān)注實踐環(huán)節(jié)及工程應(yīng)用能力,應(yīng)對學(xué)生進行多視角、多方位的綜合測評,力求知識與能力的協(xié)調(diào)統(tǒng)一和考核評價的客觀與公正。課程組將考試形式由筆試改為機試,并增加課程設(shè)計考核環(huán)節(jié)。學(xué)生最終成績的評定方法是:機試占20%,日常表現(xiàn)(出勤率、作業(yè)與實驗成績)占20%,自我評價與同學(xué)生評價占10%,項目設(shè)計和參與程度占20%,答辯情況占20%,撰寫論文或報告占10%??己诵问降母母飼龑?dǎo)學(xué)生在課程學(xué)習中注重編程能力和解決問題能力的培養(yǎng)。
3、項目驅(qū)動在教學(xué)中的應(yīng)用效果與評價
從2009~2010學(xué)年的第一學(xué)期開始,課程組將項目驅(qū)動應(yīng)用于“面向?qū)ο蟪绦蛟O(shè)計”的課程教學(xué)中。通過與傳統(tǒng)教學(xué)進行對比,我們得出以下兩方面的結(jié)論。
3.1 項目驅(qū)動對教學(xué)產(chǎn)生的正面效果
項目驅(qū)動教學(xué)增進了學(xué)生在概念理解方面的思維能力,增強了學(xué)生分析問題、解決問題的能力,能夠有效地調(diào)動學(xué)生學(xué)習的積極性,提高學(xué)習的責任心,改善了學(xué)生與學(xué)生、教師與學(xué)生之間的互動關(guān)系,在學(xué)生的團隊合作與溝通能力培養(yǎng)方面起到積極的作用,特別是對于那些學(xué)習風格不適于傳統(tǒng)課堂授課的學(xué)生的教學(xué)效果特別好。
3.2 項目驅(qū)動教學(xué)在應(yīng)用中存在的問題
項目驅(qū)動教學(xué)并不是一種很容易開展的教學(xué)。從教師方面而言,該方法要求教師對課程知識的把握程度要深,要有豐富的教學(xué)經(jīng)驗,能夠根據(jù)教學(xué)情況隨機應(yīng)變。就學(xué)生方面而言,基于項目的教學(xué)方法要求學(xué)生對自身的學(xué)習負有更多的責任。在項目實施過程中,各種項目管理與人際沖突等問題還會出現(xiàn),這些都是學(xué)生所不習慣的,同時也對教師的教學(xué)組織能力提出了更高的要求。因此,有些教師和學(xué)生在一開始會對它感到不適應(yīng),在學(xué)習過程中也會出現(xiàn)兩極分化現(xiàn)象。此外,如文獻中所描述的,基于項目的教學(xué)容易產(chǎn)生內(nèi)容知識方面的空白,忽視和遺漏一些關(guān)鍵知識點,從而影響學(xué)生今后對一些重要內(nèi)容的進一步學(xué)習。
關(guān)鍵詞:C#程序設(shè)計;任務(wù)驅(qū)動;工作過程;共享資源;課程開發(fā)
1 引言
程序設(shè)計是一項實踐性很強的活動,項目的完成,需要整合各個知識點,還需要具備綜合應(yīng)用知識的能力?!禖#程序設(shè)計》是我校計算機應(yīng)用專業(yè)的一門核心課程,2008年立項為院精品課程,2010年立項為浙江省精品課程。本課程幾年來完成了基于工作過程的課程開發(fā),課程開發(fā)遵循了趙志群教授所講的工學(xué)結(jié)合課程的基本原則:學(xué)生通過對技術(shù)(或服務(wù))工作的任務(wù)、過程和環(huán)境進行整體化的感悟和反思,實現(xiàn)知識與技能、過程與方法、情感態(tài)度與價值觀學(xué)習的統(tǒng)一。課程從提出一個具體的應(yīng)用項目的需求開始,到最終完成項目開發(fā)交給用戶為止,通過若干相對獨立而又逐步發(fā)展的任務(wù)組織知識點,每一個任務(wù)都是先提出要解決的問題,然后明確目標和解決問題的步驟,在.NET Framework基礎(chǔ)上,運用Visual C#進行面向?qū)ο蟮某绦蛟O(shè)計,充分利用面向?qū)ο蟮姆庋b性、繼承性和多態(tài)性等特性實現(xiàn)項目,步步為營,逐步發(fā)展,給學(xué)生持續(xù)的動力、興趣和成就感。課程開發(fā)側(cè)重工學(xué)結(jié)合,知識和能力的統(tǒng)一。
2 課程開發(fā)的主要步驟
2.1 尋找一系列具有典型意義的綜合性的工作任務(wù)
以就業(yè)為導(dǎo)向是課程體系設(shè)置核心的特征。職業(yè)教育的本質(zhì)就是就業(yè)教育,學(xué)習的目標就是為了就業(yè),有助于就業(yè)的我們就學(xué)、并且學(xué)精,無助于就業(yè)的我們就不學(xué)。為了能夠滿足就業(yè)的需求,我們做的第一件事情就是去軟件開發(fā)企業(yè)了解用人狀況和技術(shù)需求,通過對掌握的一手數(shù)據(jù)進行詳細分析和多次專家研討,比較全面地掌握企業(yè)用人需求。尋找一系列具有典型意義的綜合性的工作任務(wù)。
整體化的工作分析的結(jié)果不是獨立的、點狀的“能力點”或者“技能點”,而是過程完整的“典型工作任務(wù)”。
2.2 在典型工作任務(wù)的基礎(chǔ)上設(shè)計學(xué)習領(lǐng)域課程及其學(xué)習任務(wù)
學(xué)習情境的載體是一個“學(xué)習與工作任務(wù)”,即“內(nèi)容是工作的學(xué)習任務(wù)”,“用于學(xué)習的工作任務(wù)”,簡稱“學(xué)習任務(wù)”或“學(xué)習性任務(wù)”。
學(xué)習任務(wù)是學(xué)習情境的物質(zhì)化表現(xiàn),它來源于企業(yè)生產(chǎn)或服務(wù)實踐,能夠建立起學(xué)習和工作的直接聯(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)容的安排要以學(xué)習任務(wù)為中心來開展,并適當?shù)匕讯鄠€學(xué)習任務(wù)聯(lián)結(jié)成一個工程項目。在每一個學(xué)習領(lǐng)域課程中,都采用一個實際的開發(fā)項目來組織技術(shù)內(nèi)容,課上老師會通過項目的講解來引出技術(shù)內(nèi)容,而上機課要求同學(xué)自己逐步完成一個類似的項目。
在項目的選擇上,在考慮到項目的實用性的同時,也盡可能地提高項目的趣味性、并加強與日常生活中遇到的問題和現(xiàn)象的 聯(lián)系,從而幫助同學(xué)理解項目內(nèi)容。
2.3 課程學(xué)習任務(wù)舉例
課程體系中典型工作任務(wù)之一:開發(fā)三層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序。
學(xué)習任務(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:完成學(xué)員窗體的登錄。
首先教師指導(dǎo)學(xué)生實現(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。
學(xué)生在數(shù)據(jù)庫管理員表中找到存在的用戶名及密碼并輸入登錄窗體,選擇用戶類別為管理員,進入管理員窗體界面。至此完成管理員窗體的登錄,學(xué)生已有了小小的成就感,接下來讓學(xué)生獨立完成子任務(wù)2:完成學(xué)員窗體的登錄,同時培養(yǎng)了學(xué)生對知識的再學(xué)習能力。
學(xué)習任務(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 基于“共享型教學(xué)資源”的教學(xué)模式
創(chuàng)建基于共享型教學(xué)資源平臺,建成以“共享型教學(xué)資源庫”為核心,以“開放型教學(xué)平臺”為載體,具有行業(yè)企業(yè)參與、滿足廣大師生自我學(xué)習和自我提高、滿足服務(wù)地方經(jīng)濟需要為一體的具有高可用性、開放性、共享性、伸縮性和可靠性的教學(xué)資源共享、管理和服務(wù)平臺。
基于“共享型教學(xué)資源”的高職教學(xué)平臺能使高職院校和企業(yè)間的需求信息及時、順利地對接,使學(xué)校能充分尊重學(xué)生職業(yè)生涯的發(fā)展需求,充分調(diào)動學(xué)生學(xué)習技術(shù)業(yè)務(wù)的自覺性,大力營造崗位成才的環(huán)境和氛圍,使學(xué)生盡快適應(yīng)企業(yè)的環(huán)境,實現(xiàn)向“社會人”和“職業(yè)人”的轉(zhuǎn)變。做到學(xué)校出人才、企業(yè)用人才、學(xué)生實現(xiàn)崗位成才。
基于“共享型教學(xué)資源”的高職教學(xué)平臺強調(diào)在線學(xué)習,重視發(fā)揮學(xué)生的主體作用,指導(dǎo)學(xué)生利用教學(xué)平臺自主探究,引導(dǎo)學(xué)生進行發(fā)現(xiàn)學(xué)習。
教師利用平臺整合教學(xué)資源,提出學(xué)習任務(wù),引導(dǎo)學(xué)生學(xué)習新知識。運用自主學(xué)習與協(xié)作學(xué)習相結(jié)合的方式進行探究式學(xué)習,對任務(wù)進行交流與討論,通過協(xié)作完成并在線提交任務(wù)。教師和企業(yè)專家給出任務(wù)評價標準,并做為課程考核的重要評價指標之一。
3 總結(jié)
浙江省教育廳廳長劉希平說:“我們應(yīng)該高度重視課程開發(fā),尤其是二次開發(fā)。我們應(yīng)該鼓勵和要求教師在教學(xué)過程中進行二次開發(fā),即對已有的課程,教師應(yīng)根據(jù)自己的理解、研究,針對學(xué)生的實際,進行一些教學(xué)創(chuàng)新。教師只有對教材有獨特的理解、系統(tǒng)的分析,才能夠把課教得生動,教得有針對性?!?/p>
本門課程的教學(xué)團隊經(jīng)過幾年的教學(xué)實踐,針對學(xué)生的實際,對課程進行了二次開發(fā),將一個大的項目分解成幾個小的學(xué)習任務(wù),再分解成幾個子任務(wù),明確提出任務(wù)的需求和目標,給學(xué)生持續(xù)的動力、興趣和成就感。
在項目實施過程中,根據(jù)需要進行分組,以組為單位完成任務(wù),學(xué)生的收獲既有交流中的炫耀引發(fā)的自豪感,又有互通有無、相互學(xué)習、相互補充中對知識的逐步完善。通過項目教學(xué)能夠更好地促進學(xué)生實踐能力和綜合素質(zhì)的提高。
在今后的教學(xué)中要繼續(xù)完善《基于共享型教學(xué)平臺》的建設(shè),使學(xué)生通過這個平臺能更好地了解企業(yè)需求,并學(xué)會自主學(xué)習,能完成平臺提出的相應(yīng)任務(wù)需求,為社會、企業(yè)不斷創(chuàng)造價值,真正實現(xiàn)崗位成才。
參考文獻
[1]北京阿博泰克北大青鳥信息技術(shù)有限公司.在.NET框架下開發(fā)三層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用系統(tǒng)[M].北京:科學(xué)技術(shù)文獻出版社,2008.
[關(guān)鍵詞]項目驅(qū)動 實踐應(yīng)用 教學(xué)改革
[作者簡介]湯海蓉(1974-),女,湖南常德人,湖南文理學(xué)院計算機學(xué)院,講師,碩士,主要研究方向為數(shù)據(jù)庫、計算機教育。(湖南 常德 415000)李錫輝(1974-),女,湖南望城人,湖南信息職業(yè)技術(shù)學(xué)院,副教授,碩士,主要研究方向為WEB應(yīng)用開發(fā),視頻圖像處理。(湖南 長沙 410200)
[中圖分類號]G642 [文獻標識碼]A [文章編號]1004-3985(2012)06-0140-03
在互聯(lián)網(wǎng)時代,JAVA語言已經(jīng)是使用最廣泛的編程語言之一。由于免費、跨平臺、語言本身技術(shù)先進,它已經(jīng)成為許多學(xué)科研究、課程和計算的首選語言。有關(guān)資料顯示,IT人才屬國內(nèi)人才緊缺指數(shù)較高的一類,優(yōu)秀的JAVA編程人員更是尤其缺乏。隨著3G、物聯(lián)網(wǎng)時代的到來,JAVA語言不僅不會“過時”,相反,它將會在新的業(yè)務(wù)領(lǐng)域有著更輝煌的發(fā)展前景。正因如此,目前各類高校均將JAVA作為計算機專業(yè)的主要教學(xué)語言之一,通過學(xué)習,學(xué)生可以獲得一定的編程能力,鍛煉自己的邏輯思維,為將來的就業(yè)打好基礎(chǔ)。
一、JAVA語言目前教學(xué)中存在的問題
傳統(tǒng)實踐教學(xué)中,由于受諸多因素的影響,教學(xué)效果不甚理想。具體表現(xiàn)在:
1 教學(xué)手法單一。傳統(tǒng)的教學(xué)是以教師、教材為中心。教師負責教,學(xué)生負責學(xué),教材怎么寫,教師就怎么講,學(xué)生就怎么學(xué)。一般方法是教師根據(jù)大綱和教材,針對某個知識點進行重點講授,列舉若干驗證性的實驗加以佐證,學(xué)生亦通過上機編寫一些小的算法,對課堂上的某一到兩個知識點加以理解和吸收。一定程度上忽視了學(xué)生作為學(xué)習主體的存在,忽視了JA―VA語言具有極強實踐性的特征,使學(xué)生喪失了學(xué)習的積極性、自主性和創(chuàng)造性。
2 學(xué)生對課程的難度認識不夠。源于JAVA在行業(yè)中的廣泛應(yīng)用,許多學(xué)生初次接觸JAVA,對學(xué)成之后的前景是非常期待的,因而興趣十分濃厚,又由于有C及C++語言的基礎(chǔ),會認為不過是C++的向上封裝。但隨著學(xué)習的深入,面對大量不斷涌現(xiàn)的各類環(huán)境配置、OOP思想、類庫、乃至設(shè)計模式、架構(gòu)等,繁多而枯燥,在沒有實際成果激勵的情況下,無法達到原來的預(yù)期,就會產(chǎn)生畏難心理,進而影響后續(xù)的學(xué)習。
3 實踐能力差。傳統(tǒng)教學(xué)模式下培養(yǎng)出的學(xué)生,被動接受知識,理論掌握得較好,也能在實驗中實現(xiàn)一些孤立算法,各個知識點之間沒有建立相關(guān)串聯(lián),一旦被要求完成一個實際的完整項目時,則會茫然得不知從何下手。更不用說運用軟件工程的思想進行開發(fā)和團隊合作了。
4 考核標準單一。傳統(tǒng)教學(xué)對學(xué)生的考核是通過筆試完成的,掌握了教師所交給的課本知識,通過記憶,考試就能夠取得好成績,學(xué)校對教師的評價也基本上是看教學(xué)成績,使部分學(xué)生產(chǎn)生了只要背背知識點通過考試就行、實踐無所謂的錯誤傾向。這種重結(jié)果而不重過程。重考試成績而不重全面發(fā)展的考核方式,不能充分地發(fā)揮出考核作為指導(dǎo)教學(xué)、檢驗學(xué)生學(xué)習能力的指揮棒作用。
以上諸多問題究其根源是學(xué)生學(xué)習動力的缺乏,解決的辦法就在于激發(fā)其學(xué)習興趣和信心,最好的途徑就是能夠讓學(xué)生自己動手解決實際問題,讓其能力得到肯定和承認,讓其體會到成功的快樂,從而增強學(xué)習動力。針對于此,有必要對傳統(tǒng)的課程教學(xué)模式進行改革,經(jīng)過不斷實踐,筆者在教學(xué)中總結(jié)了一套行之有效的基于項目驅(qū)動的教學(xué)方法。
二、基于項目驅(qū)動的教學(xué)法
基于項目驅(qū)動的教學(xué)法是指根據(jù)大綱所規(guī)定的教學(xué)內(nèi)容、教學(xué)目的和教學(xué)要求,將一個實際管理活動中與課程相關(guān)的內(nèi)容,加以收集、歸納、整理,形成項目任務(wù)。依托這些資料,教師通過巧妙設(shè)計教學(xué)內(nèi)容,深入淺出地講解知識點,形象地指導(dǎo)學(xué)生實施理論聯(lián)系實際,讓學(xué)生通過完成項目來達到掌握知識的目的。學(xué)生在強烈的問題動機驅(qū)動下,通過對教學(xué)資源的主動應(yīng)用,進行自主探索和互動協(xié)作,根據(jù)項目要求進行需求分析、數(shù)據(jù)庫設(shè)計、代碼編寫以及測試,針對項目中各種實際問題,獨立思考,協(xié)同探索,研究解決問題的方法,通過實踐實現(xiàn)目標,提高概括分析問題、解決實際問題以及編程的能力。
基于項目驅(qū)動的教學(xué)目的是以學(xué)生為中心,但不是要求學(xué)生只會解釋問題,而是要培養(yǎng)學(xué)生具有解決實際問題的能力,解決“干什么”“怎么干”的問題。強調(diào)以直接經(jīng)驗的形式來掌握融合在各實踐活動中的最新知識、技能和技巧。在項目教學(xué)中,學(xué)生不但學(xué)習了新知識,更學(xué)會了探究解決問題的一般研究規(guī)律和方法,這為學(xué)生分析新的項目,達到舉一反三的目標,打下了良好的專業(yè)基礎(chǔ),讓其能在將來的工作中,很快進入角色。
三、具體操作
經(jīng)過實踐總結(jié),筆者將項目驅(qū)動教學(xué)的過程劃分成以下幾個步驟,具體如圖1所示:
1 確定項目。課程學(xué)習開始之初,先選取一個與學(xué)生聯(lián)系較為緊密的實際項目,比如學(xué)生管理系統(tǒng)、網(wǎng)上商城等。項目的選擇要求如下:(1)具有典型性、符合實際;(2)項目設(shè)計的問題具有啟發(fā)性,符合教學(xué)的要求;(3)符合教學(xué)目標的需要;(4)內(nèi)容的深淺應(yīng)符合學(xué)生學(xué)習的需求;(5)項目的設(shè)計應(yīng)體現(xiàn)知識的系統(tǒng)性和整合性。以學(xué)生管理系統(tǒng)為例,首先將教師在以往工作中編寫的系統(tǒng)運行展示給學(xué)生,讓其大致了解將來要求設(shè)計完成的效果,激起學(xué)生的興趣,然后有的放矢地設(shè)計自己的目標項目。
2 任務(wù)劃分及小組分工。根據(jù)軟件工程的思想,以項目功能模塊為單位進行小組劃分,并選定小組負責人,培養(yǎng)團隊精神。具體劃分見圖2。在項目的需求分析階段,小組成員可以通過集體討論,集思廣益,給出設(shè)計方案;在設(shè)計過程中,由組長安排各成員的分工協(xié)作,確定每人所承擔的任務(wù)。成員可以輪流承擔各階段的設(shè)計、編碼和測試任務(wù),使學(xué)生在過程中扮演不同的角色,培養(yǎng)各方面的能力,加強與他人的溝通;要求每個小組既要實現(xiàn)獨立的子系統(tǒng)的功能,又應(yīng)當與其他小組建立聯(lián)系,最后要求整合以共同完成整個項目。
3 教學(xué)安排。在教學(xué)過程中,教師要對教材上的知識點進行重新組織和安排。不是不加選擇地從頭講到尾,而是根據(jù)知識點的難易程度、實用性以及與實踐項目的關(guān)系密切程度,有選擇地進行講解。由于前期已有相關(guān)課程的學(xué)習基礎(chǔ),比如在C++課程中已經(jīng)學(xué)習了OOP的思想及相關(guān)語法知識,只需對其差異部分稍加講解;數(shù)據(jù)庫相關(guān)知識的掌握,使得學(xué)生可以較早著手分析和數(shù)據(jù)庫相關(guān)的內(nèi)容,進行概念結(jié)構(gòu)設(shè)計和邏輯結(jié)構(gòu)設(shè)計。另外,針對教材一般只定位于J2SE中的一部分基礎(chǔ)知識,根據(jù)項目實踐需要以及學(xué)生的能力水平,還需將一部分高級和擴展部分內(nèi)容穿插到課堂和實踐中,如網(wǎng)絡(luò)編程、系統(tǒng)的邏輯架構(gòu)及物理架構(gòu)的設(shè)計等,以幫助學(xué)生提高項目實踐能力。部分教學(xué)安排見下表:
4 過程指導(dǎo)。在項目進行過程中,主要依靠學(xué)生自身的能力和團隊的協(xié)作,通過查閱資料及網(wǎng)絡(luò)自主學(xué)習,以團隊為單位
獨立解決遇到的困難;教師亦必須全程指導(dǎo)、策劃,協(xié)調(diào)各個子項目之間的協(xié)同進展,通過多種教學(xué)手段答疑解惑,如推薦網(wǎng)絡(luò)版教程、Email答疑、QQ群集體討論、定期當面探討等,對設(shè)計過程中可能遇到的較深入的知識點進行有效學(xué)習指導(dǎo),在項目的一些關(guān)鍵階段進行適當?shù)狞c評,并對設(shè)計過程中出現(xiàn)的偏差及時糾正,鼓勵學(xué)生獨立思考和團隊協(xié)作,引導(dǎo)學(xué)生變注重知識為注重能力,使他們完善設(shè)計,促進自身的不斷提高。
5 綜合評估。學(xué)期結(jié)束,需要對完成的較完整的項目進行檢查與評價。首先應(yīng)由學(xué)生對自己的工作進行評定,闡述包括在項目準備、具體設(shè)計、測試過程中碰到的各種疑難問題、解決的手法以及結(jié)果如何,總結(jié)團隊合作的感受,并對本組負責的模塊的運行效果加以點評。教師最后進行工作總結(jié),總結(jié)團隊中各成員在設(shè)計過程中的分工和職能的完成情況,依據(jù)各組負責模塊的難易程度、總體完成情況、個人對團隊的貢獻等因素進行綜合評判,給出學(xué)生的實踐能力成績,找出差距與改正方法,并最終納入到課程考核成績中。最后,還應(yīng)指導(dǎo)學(xué)生分組撰寫實踐報告。
6 教學(xué)效果分析?;陧椖康慕虒W(xué)實施之后,與上一學(xué)年的學(xué)長相比,本學(xué)年的學(xué)生的學(xué)習積極性明顯提高,學(xué)生不僅積極完成課堂上的任務(wù),同時也開始自主學(xué)習,積極組織及參與各種形式的討論,課后提問明顯增多,學(xué)習氣氛濃厚。同時。學(xué)生開發(fā)編寫的代碼數(shù)量和質(zhì)量有了質(zhì)的提升,并對于一些較為深入的內(nèi)容也有所主動涉及,如設(shè)計模式等,真正實現(xiàn)了“學(xué)為所用”和“學(xué)以致用”。此外,在設(shè)計過程中還培養(yǎng)了團隊協(xié)作精神和集體榮譽感,鍛煉了溝通能力和合作意識。而對于設(shè)計過程中不斷出現(xiàn)的新問題和新思路,也促使教師加深思考,根據(jù)不同學(xué)生的不同理解補充新的教學(xué)內(nèi)容,教學(xué)相長。
四、項目教學(xué)中應(yīng)注意的問題
1 正確處理項目教學(xué)與傳統(tǒng)課堂講授教學(xué)的關(guān)系。項目教學(xué)并不能完全取代傳統(tǒng)課堂講授,教師對一門學(xué)科的重點和難點進行適當講授,是教學(xué)中不能缺少的。另一方面,課堂講授應(yīng)當是誘導(dǎo)式的、啟發(fā)式的,應(yīng)與項目教學(xué)結(jié)合起來,只有把兩者有機地結(jié)合起來才能取得更好的效果。因此,項目教學(xué)的優(yōu)勢是明顯的,但也不是完美無缺的,我們應(yīng)在教學(xué)中充分發(fā)揮項目教學(xué)與傳統(tǒng)講授各自的優(yōu)勢,取長補短,培養(yǎng)適應(yīng)社會發(fā)展的實用型人才。
2 正確處理項目教學(xué)與其他教學(xué)手段的關(guān)系。在教學(xué)過程中,除了項目教學(xué)、傳統(tǒng)講授教學(xué)以外,還有許多其他教學(xué)手段,例如模擬實驗等手段,對于學(xué)生各方面知識與技能的培養(yǎng)都是非常有利的。因此,在教學(xué)過程中,我們不能囿于項目教學(xué)與傳統(tǒng)講授兩種方法,應(yīng)該根據(jù)課程內(nèi)容的不同特點。選擇不同的教學(xué)方法,以此激發(fā)學(xué)生的學(xué)習熱情。
3 項目教學(xué)對教師和學(xué)生都提出了更新、更多的要求。教師必須具備完成一個項目所需的全部理論知識和專業(yè)技能,尋找到一個能覆蓋學(xué)生學(xué)習領(lǐng)域所涉及的全部或絕大多數(shù)內(nèi)容的合適項目,必須充分收集、熟悉、掌握相關(guān)資料。并從中歸納要點,提供分析、討論的框架,必須做大量的準備工作以應(yīng)對學(xué)生可能提出的各種問題,還要求教師具有很強的調(diào)控能力。從學(xué)生方面來看,再不能像以前那樣被動地接受“滿堂灌”,而必須充分發(fā)揮自己的主動性,查閱大量參考資料。提前預(yù)習,發(fā)現(xiàn)問題,與他人合作,開展調(diào)查研究,提出解決問題的對策,運用適當?shù)姆椒ê褪侄危磉_、交流、反思自己學(xué)習和設(shè)計的見解及成果。
關(guān)鍵詞:實例操作;可視化程序設(shè)計;教學(xué)研究
中圖分類號:G642.0 文獻標識碼:A 文章編號:1007-0079(2014)11-0163-02
可視化程序設(shè)計是學(xué)習可視化程序設(shè)計基本理論和原理的實踐性、綜合性、應(yīng)用性很強的課程。在計算機、信息等相關(guān)專業(yè)的教學(xué)體系中,實際上存在相當多的可視化程序設(shè)計類課程,如:C#、Visual Basic、Delphi等等。這些可視化程序設(shè)計課程的宗旨是使學(xué)生了解現(xiàn)代程序設(shè)計理論中的面向?qū)ο缶幊毯涂梢暬绦蛟O(shè)計等的基本思想,培養(yǎng)學(xué)生應(yīng)用程序設(shè)計技術(shù)來解決實際問題的能力。本文結(jié)合該課程性質(zhì)與定位分析,針對該課程傳統(tǒng)教學(xué)中存在的問題,以強化實際動手操作能力培養(yǎng)為目標,探索實例操作驅(qū)動的教學(xué)方法在該課程教學(xué)中的應(yīng)用。
一、課程定位與分析
教學(xué)方法是由課程性質(zhì)及教學(xué)目標所決定的,無論采用什么教學(xué)方法都要緊緊圍繞課程性質(zhì)和教學(xué)目標展開。在探討可視化程序設(shè)計的教學(xué)方法之前有必要對課程性質(zhì)及教學(xué)目標進行分析。
1.課程性質(zhì)與目標
可視化程序設(shè)計課程要求學(xué)生既要掌握理論知識,更要掌握操作技能并能在實際中應(yīng)用??梢暬绦蛟O(shè)計課程集編程理論與操作實踐于一身,然而課程本身的抽象性與復(fù)雜性使學(xué)生無法完全理解并有效應(yīng)用所學(xué)理論知識。只有在實踐中學(xué)生才能真正學(xué)會編寫和調(diào)試程序,從而更好地掌握程序設(shè)計的理論知識,提高利用理論知識解決實際問題的能力。
可視化程序設(shè)計類課程由于實踐性很強,所以其性質(zhì)應(yīng)該定位在實踐性課程、操作性課程。也就是說,課程歸根結(jié)底應(yīng)該教會學(xué)生怎么做,讓學(xué)生愿動手、能動手、會動手來實際操作,強調(diào)實踐性,培養(yǎng)動手能力應(yīng)該是第一位的。
2.實例教學(xué)
針對可視化程序設(shè)計的課程性質(zhì)與目標,按照學(xué)生的認知規(guī)律組織教學(xué),毫無疑問實例教學(xué)是一個理想選擇。實例教學(xué)法已經(jīng)在多個學(xué)科的教學(xué)中應(yīng)用,并收到了良好的效果。豐富的教學(xué)實例能夠提高學(xué)生的學(xué)習興趣,實例教學(xué)增強了課堂教學(xué)的靈活性和易懂性,極大地提高學(xué)生的學(xué)習興趣和主動性。實例教學(xué)有利于學(xué)生理論與實際的結(jié)合,有利于培養(yǎng)出實用型人才。在實例教學(xué)中,教師要本著理論與實際相結(jié)合的宗旨,遵循教學(xué)目的要求,以實例為基本素材,展開教學(xué)內(nèi)容,培養(yǎng)學(xué)生分析和解決問題的能力,加深他們對可視化程序設(shè)計理論知識的理解。在實例教學(xué)中始終堅持以用為本,將語法、命令、控件等具體使用融于實例開發(fā)過程中。以學(xué)生的已有知識為基礎(chǔ),按照學(xué)生的認知規(guī)律,遵循先易后難、先具體后抽象的原則,通過觀看、模仿、理解、總結(jié)、提高等階段進行教學(xué)。
3.實例與編程思想
可視化程序設(shè)計實例教學(xué)中有一個重要的階段就是學(xué)生模仿,也就是依葫蘆畫瓢,照葫蘆畫樣。毋庸置疑,編程思想對于程序開發(fā)人員至關(guān)重要,教師應(yīng)該在程序設(shè)計課程中幫助學(xué)生形成和訓(xùn)練良好的編程思想。巧婦難為無米之炊,學(xué)生只有在具備一定量的實例編程基礎(chǔ)之上,才能構(gòu)建和形成編程思想,否則,沒有較多的實際操作體驗,編程思想的訓(xùn)練只是空談。實例的模仿、學(xué)習與演練也有利于學(xué)生熟悉編程步驟、形成編程規(guī)范,然而編程步驟與規(guī)范并不等同于編程思想的僵化。實例教學(xué)能使學(xué)生從課堂和課后實例的反復(fù)練習中總結(jié)一般的算法,進而從算法升華為編程思想。
此外,編程思想的訓(xùn)練是一個系統(tǒng)工程,從縱向維度來看,它貫穿于可視化程序設(shè)計課程所在的整個課程體系中??梢暬绦蛟O(shè)計課程的前置課程如C/C++程序設(shè)計側(cè)重程序設(shè)計基礎(chǔ)與語法,同時涉及算法與編程思想,后置或關(guān)聯(lián)課程如算法設(shè)計與分析等更是著重解決編程思想的問題,因而沒必要將編程思想的形成和訓(xùn)練畢其功于一役,完全集中在可視化程序設(shè)計課程中,盡管這一點在該課程中必要而且十分重要。因為學(xué)生有了編程思想以后就可以遵循編程規(guī)范來指導(dǎo)自己的編程過程,能獨立完成編程任務(wù)了。
二、傳統(tǒng)的多媒體教學(xué)不足
教學(xué)過程是對教學(xué)思想和教學(xué)方法的具體體現(xiàn)??梢暬幊陶Z言教學(xué)基于面向?qū)ο蟮木幊虣C制,它繼承了順序程序設(shè)計的思想,重點講述類、對象、控件的方法、事件與屬性,在教學(xué)中以多媒體教學(xué)為主,以體現(xiàn)可視化程序設(shè)計對控件等對象操作的特點,問題的關(guān)鍵在于如何借助多媒體實施可視化程序設(shè)計課堂教學(xué)。傳統(tǒng)的多媒體課堂教學(xué)方法包括以下三種:
方法一:課堂借助多媒體投影主要講授可視化編程理論知識,較少加入實例項目到課堂中。可視化程序設(shè)計實踐性非常強,并且可視化程序設(shè)計理論知識抽象性和復(fù)雜性強,缺少實例將很難保證課堂講授效果。
方法二:課下在課件中編寫實例代碼,課上利用多媒體投影展示代碼。教師課前將代碼放在幻燈片上,在課堂上將含有代碼的幻燈片打開,直接展示給學(xué)生,甚至教師還針對代碼做一些必要的講解。該方法無法直接運行程序,缺乏程序結(jié)果的可見性,并且學(xué)生也看不到項目或解決方案的詳細建立過程。
方法三:課下利用開發(fā)環(huán)境建立好實例,課上利用多媒體投影展示實例并演示。該方法相對方法二來講,可以直接運行出程序結(jié)果,增加了一定的趣味性和直觀性。缺點仍然在于學(xué)生看不到項目或解決方案是如何建立的。
以上的這些教學(xué)方法,學(xué)生需要自己琢磨詳細操作過程,其結(jié)果是不少學(xué)生因為實例操作步驟不清晰而花費了很長時間也沒能成功編程完成實例。多次這樣的經(jīng)歷就使得這些學(xué)生對可視化程序設(shè)計失去了信心,自然也就對課程失去了興趣,這樣的現(xiàn)象在課程開始之初表現(xiàn)得尤為突出。
三、教學(xué)實施分析
試想,倘若人們在實際生活中需要學(xué)習一項之前從不會的技能或?qū)W做一件之前從不會做的事情,比如說學(xué)習汽車駕駛,最希望得到什么樣的指導(dǎo)?毫無疑問,絕大部分的人都希望有人能手把手地教他這項技能或教他做這件事情。同樣,經(jīng)過調(diào)查,對于程序設(shè)計,尤其是可視化程序設(shè)計,幾乎所有學(xué)生希望得到的也是有教師能手把手地教他如何操作。由教師一對一實實在在手把手來教所有學(xué)生,在課堂教學(xué)甚至實驗教學(xué)中實際實施起來具有很大的難度,尤其是在學(xué)生人數(shù)較多的情況下。事實上,手把手的教學(xué)過程可以由展示實例詳細操作過程來近似替代。于是,實例的詳細操作過程的展示就成為基于實例的教學(xué)方法的至關(guān)重要的一環(huán)。
1.展示實例操作過程
如何展示實例的詳細操作過程?現(xiàn)場開發(fā)實例是一個直觀的選擇,這其中包括兩種做法。第一,現(xiàn)場利用開發(fā)環(huán)境建立實例及編寫代碼,利用多媒體投影展示。[1]該方法將完整建立過程展示給學(xué)生,但現(xiàn)場編寫代碼費時,講授課堂內(nèi)容效率較低。第二,課下編寫實例代碼,現(xiàn)場利用開發(fā)環(huán)境建立實例,利用多媒體投影展示。該方法將完整建立過程展示給學(xué)生,并且期間直接粘貼課下已編寫好的代碼,相比第一點提高了課堂教學(xué)的效率。這兩種現(xiàn)場建立實例項目的方法在項目簡單、代碼量少的情況固然能取得一定效果,但畢竟即使是具有豐富開發(fā)經(jīng)驗的教師,在課堂上現(xiàn)場開發(fā)實例也可能遇到意料之外的程序錯誤,甚至數(shù)次調(diào)試都無法成功解決。其直接結(jié)果就是一直卡在出錯處,課程無法繼續(xù)進行,浪費了大量的課堂時間,最嚴重的后果可能導(dǎo)致學(xué)生對教師失去信心。事實上,任何編程者都無法保證在遇到每個程序問題時都能迅速解決。
實例的詳細操作過程的動畫錄制與展示看似是對現(xiàn)場開發(fā)實例的一種互補,但它是相比現(xiàn)場開發(fā)實例更為可取的一種做法。教師課前進行實例操作過程的動畫錄制,準備課堂實例的動畫演示課件,演示課件主要包含實例的詳細操作全過程錄像,也可以加上必要的文字甚至語音解說。實例操作過程的錄制通??梢越柚聊讳浵耦惖能浖?,比如屏幕錄像專家、RoboDemo等來完成。學(xué)生可以下載這些演示課件并對實例進行模仿操練,這樣就使得教師實際編程的過程可以回放,課堂的實例教學(xué)得以延續(xù)。
2.實例的準備
實施實例教學(xué)前要進行充分的準備,實例教學(xué)的成敗與準備充分與否關(guān)系緊密,要有充足的準備時間,而且要認真思考學(xué)生的學(xué)習興趣點。要對學(xué)生的己有的知識水平和能力進行調(diào)查和了解分析,也就是要了解學(xué)生已有的計算機知識水平和對面向?qū)ο蟪绦蛟O(shè)計的了解程度,只有這樣才能在具體內(nèi)容的講解和實例的選擇演示方面有所把握。
實例的選取是實例教學(xué)的關(guān)鍵環(huán)節(jié),由于實例教學(xué)是以實例展開的,實例選取的好壞直接影響到教學(xué)的效果及質(zhì)量,所以要精心選編實例。實例選擇時要注意:[2]第一,實例要精。實例選取要有針對性、典型性和代表性,緊扣教學(xué)重點、難點、編程理論進行選編,這種實例的教學(xué)有助于達到舉一反三的效果。第二,實例要實。實例選取不僅要從學(xué)生的實際情況出發(fā),還要從實際生活出發(fā),既要體現(xiàn)教學(xué)目的和要求,也要反映實際生活的需求,更要能提高學(xué)生的學(xué)習興趣。實例的選取除了選擇教材上的典型實例外,可以由教師自己編制一些源自于實際項目的更為實際的例子。
3.課后及時操練
實例教學(xué)實施過程中,課后操練這一環(huán)節(jié)是非常重要的,它是讓學(xué)生理解掌握可視化程序設(shè)計理論、培養(yǎng)解決問題能力的主戰(zhàn)場。學(xué)生觀看了實例的詳細操作過程后,只有反復(fù)模仿、操練,才能理解、總結(jié),并進行實例的拓展,獲得能力的提高。操練的實例一方面來源于課堂上講解的實例或教師錄制好的實例,另一方面來源于接近但超越這些實例的作業(yè),這些題材包含了對實例的分層次拓展與完善。此外,教師有必要設(shè)計良好的類游戲規(guī)則激發(fā)學(xué)生對于實例操練的興趣,自覺地去實施這一過程,這些規(guī)則比如有積分動態(tài)排行榜等。教師也可以借助自己創(chuàng)建的教學(xué)論壇解決學(xué)生在完成作業(yè)和學(xué)習過程中遇到的問題,并在論壇上開展關(guān)于可視化編程學(xué)習的討論,激發(fā)學(xué)生的學(xué)習興趣,培養(yǎng)學(xué)習氛圍。
四、總結(jié)
實例操作驅(qū)動的可視化程序設(shè)計教學(xué)方法強調(diào)實例教學(xué),并且著重展示實例的詳細操作構(gòu)建過程,目的在于教會學(xué)生怎么做,讓學(xué)生愿動手、能動手、會動手來實際操作。在這種教學(xué)方法中,學(xué)生可以獲知編程任務(wù)如何下手,也能成功地完成編程實例,給其可視化編程奠定良好的起步,極大激發(fā)了學(xué)生的學(xué)習興趣,提高了學(xué)生的學(xué)習主動性與積極性。在教學(xué)實施中教師本著實而精的原則準備好實例,包括花功夫精心選取、編制實例,認真細致地進行實例詳細操作過程的動畫錄制,給學(xué)生模仿操練、拓展提高打下良好的基礎(chǔ),使課堂教學(xué)得以延續(xù)。學(xué)生課后針對實例和作業(yè)及時操練、鞏固所學(xué),也就不僅能掌握可視化編程理論知識,還能扎實地培養(yǎng)動手能力,培養(yǎng)應(yīng)用可視化編程解決實際問題的能力。實例操作驅(qū)動的可視化程序設(shè)計教學(xué)基于實例操作的詳細展示,突破課堂教學(xué)的時間與空間限制,融教、學(xué)和做為一體,提高了教學(xué)實效。
參考文獻: