前言:一篇好文章的诞生,需要你不断地搜集资料、整理思路,本站小编为你收集了丰富的驱动程序设计主题范文,仅供参考,欢迎阅读并收藏。
关键词:CPCI 422;驱动设计;模块互换;IVI规范
中图分类号:TP311.11
0 引 言
可互换虚拟仪器(Interchangeable Virtual Instrument,IVI)驱动程序规范是由IVI基金会在VPP\[1\]基础上为仪器驱动制定的编程接口规范。它扩展了VPP仪器驱动程序的标准,并增加了仪器的可互换性、仿真和状态缓存等特点,从而实现不同型号仪器之间的互换,在测试系统硬件组成发生变化时,测试程序代码可以重用。RS 422总线通常用于串行数据通信,采用平衡的差分数据传输方式,最大传输速率能达到10 Mb/s,最大传输距离为300 m。目前有关422的接口模块种类很多,为了实现各种型号422模块的互换,使用IVI标准进行驱动设计是很必要的。
1 IVI驱动程序的结构
IVI驱动程序体系结构主要包括IVI类驱动库、IVI专用驱动库、IVI引擎、IVI配置实用程序、IVI配置信息文件。其中,IVI 类驱动器是仪器的功能和属性集,通过这些功能和属性集实现对一种仪器类进行控制。它是一组接口函数,并不直接控制仪器工作。目前,已经了示波器、数字万用表等8类仪器规范\[2\]。IVI专用驱动库封装了用于控制某一种仪器所需要的信息,能够直接与仪器硬件通信。IVI 引擎主要完成状态缓存、仪器属性跟踪、类驱动器到专用驱动器的映像功能,是实现 IVI 仪器驱动程序完成状态缓存和其他增强性能的关键支持库。IVI 配置实用程序用于配置仪器无关测试系统,创建和配置 IVI逻辑名称,在测试程序中通过传送逻辑名称将操作映像到具体仪器驱动程序。具体IVI体系层次结构如图1所示\[3\]。
[HT5”K][JZ]图1 IVI体系结构[HT5]
目前,国内外只有NI公司,比较系统地提出了实现仪器互换的体系结构。该公司已经实现了8类仪器的IVI驱动开发,而且也提供一个名为“MAX”的IVI配置程序,用于配置仪器无关测试系统。同时也提供了一个专用驱动库开发向导,用以开发专用驱动\[4\]。但该向导不能对已有驱动程序进行升级和IVI标准封装,NI公司也没有提供类驱动库的开发向导,加上类驱动库数量的局限性,导致部分模块无法用NI公司提供的开发向导进行IVI驱动设计,比如文中所涉及的CPCI 422基于IVI标准的驱动开发\[5\]。
2 CPCI 422驱动开发
在此,以自研CPCI 422模块为例,介绍422驱动程序开发过程。CPCI 422模块具有CPCI总线接口,能通过422总线发送数据,并且能接收被测设备通过422总线传来的数据,并把数据传送给上位机进行处理。该模块具有8个通道,每个通道均能实现接收或者发送功能,通道能够单独工作也可一起工作,并且能对数据传输参数进行设置。
针对IVI体系结构,首先设计422类驱动函数库。然后在类驱动函数库基础上开发专用驱动函数库,驱动函数最后以.dll形式存在,采用 LabWindows/CVI,Visual Basic和 Visual C++等开发环境均可以开发。同时设计具备IVI引擎功能函数或者程序。对于IVI 配置信息文件可以通过专门的IVI配置实用软件(如NI公司提供的MAX)或者其他文本编辑器进行编辑。
基于IVI标准的驱动程序配置引擎是整个IVI体系中的核心支柱。其主要功能就是实现类驱动库到专用驱动库的映射,使应用程序在调用类驱动库时能自动加载相应配置的专用驱动库。
该设计中,IVI配置引擎设计的主要思路是通过读取配置信息文件,由配置文件中所设置的模块逻辑名找到对应的专用驱动库信息字段。此字段主要包括专用驱动库路径文件名、专用驱动库函数前缀等,然后通过这些一一对应的映射关系,自动加载专用驱动库。其工作流程如图2所示。
该设计运用函数ivi422Class_SpecificDriver实现自动加载功能。下面为具体的函数设计:
该函数核心是以代表专用驱动库文件名称为形式参数,调用LoadLibrary( )函数加载专用驱动库。应用程序只需通过类驱动库及模块的配置信息作为参数,调用ivi422Class_SpecificDrive()函数,即可实现专用驱动库的自动加载。根据上面介绍可知,读取配置文件以及根据配置文件自动加载专用驱动库,即可实现配置引擎的功能。
类驱动库是IVI体系的外观框架,用来控制一个特定类型仪器的一系列功能和属性。它是一组编程接口,而不对仪器进行直接操作。该设计中,为了实现422模块的正常通信,作为连接虚拟仪器硬件和应用测试程序的纽带,将422类驱动函数规划如表1所示。序号函数功能描述
1Init打开并初始化仪器
2Close关闭仪器
3SerialRead开始接收数据
4SetClock设置每个通道波特率模式
5SetUART通道工作参数设置
6SetDivisor通道具体波特率设置
7ChannelControl设置每个通道的工作状态
8SerialWriteData开始发送数据
9SpecificDriver动态加载专用驱动库[HJ0][HJ][HT5SS]
根据IVI规范,类驱动函数由函数名前缀加具体函数名构成。在参数设置上均采用VISA数据类型。在该设计中,类驱动函数均采用ivi422Class作为函数前缀名。现举例如下:
该函数的功能是提供仪器初始化函数接口,其中返回值定义为ViStatus型,具体表示形式,参照IVI标准,如IVI_SUCCESS。参数为ViSession型指针,用来返回仪器资源句柄。
根据前面介绍可知,类驱动函数只提供接口功能,不涉及具体仪器操作,现仍以初始化函数为例,介绍类驱动函数如何实现接口功能。其具体实现如下:
该函数的核心部分就是调用GetProcAddress(hDLL,FuncName)函数,获取专用驱动库函数对应函数地址。其中,hDLL为在配置引擎功能中调用ivi422Class_SpecificDriver()函数获取的专用驱动库句柄,FuncName为对应函数名称。
对于专用驱动动态链接库的开发,该设计未借助Labwindows/CVI中的专用驱动开发向导,而是直接在VC中进行编制。专用驱动库函数的主体函数名和参数类型与类驱动是完全一致的,否则类驱动和专用驱动之间的参数传递会出错\[8\]。为了与类驱动前缀名相区别,在该设计中,专用驱动函数前缀名一律为ivi422。举例如下:
函数则具体针对仪器操作,完成模块初始化功能。
对于上层应用程序,专用驱动函数隐藏了具体硬件工作细节,只以函数的形式提供了完成一项具体功能的接口。上层应用程序只需要通过类驱动库间接调用专用驱动库提供的函数,即可完成对硬件的操作控制。规划表中已经列出了422操控的基本函数,如果需要再增加函数,只需要在类驱动的专用驱动中同时增加,便能实现功能扩展。
[BT3]2.3 CPCI 422模块IVI驱动程序中配置文件编辑
对于IVI 配置信息文件,可以通过专门的IVI配置实用软件(如NI公司提供的MAX)进行编辑。在该设计中,利用图形化编程软件自己设计以对话框为基础的配置实用程序,通过此程序对配置文件进行编辑。图3为此程序的主界面。
通过此程序,修改配置文件中的逻辑名字段、描述字段、驱动库加载路径字段,以及驱动函数前缀字段、仿真调试字段。然后通过配置引擎对于配置文件的读操作,建立类驱动库和专用驱动库的正确映射。当改变模块时,只需要改变模块的逻辑名,以及模块专用驱动库的加载路径和前缀,而不需要修改类驱动库,也不会影响上层应用程序,从而实现了仪器的互换特性。
2.4 应用程序调用驱动工作流程
首先,应用程序通过一个逻辑名调用 IVI 类驱动库,配置引擎,将该逻辑名与配置文件中的所有逻辑名进行匹配,得到实际的 IVI专用驱动库指针,并实现该驱动器的动态加载;然后将 IVI 类驱动器中的函数和属性与IVI 类专用驱动器的对应函数和属性进行链接,使应用程序可以间接地访问这些函数和属性。在编制应用程序时,应同时包含类驱动库的动态链接库和头文件,编制过程中,对开发人员只需调用类驱动函数。┩4为应用IVI体系基于422模块的应用程序调用驱动工作流程。
通信卡的硬件设计
1 通信卡的主要特点
通信卡的硬件设计目的是智能化通信:在卡上具有4个DMA通道及相应的数据缓冲存储区。在数据的接收过程中,通信卡会自动接收帧数据,判别帧长度,在帧尾将接收到的帧数据提交系统。在发送数据过程中,系统只须把发送的数据提交给本卡,具体的发送过程由该卡自行完成,不因多路通信而使主机增加开销。该卡有内/外时钟两种工作方式,近距离可省去调制解调器,波特率为600b/s-64Kb/s,提供2路符合RS-232/CCITT V.24和RS-422A标准的接口信号。
2 通信卡的电路设计
通信卡组成框图如图1所示。其主要由DMA控制器、总线竞争仲裁器、串行通信控制器、数据缓冲存储器SRAM、存储器I/O映像和物理地址产生器、总线接口及防护、波特率产生器、接口电路等单元电路组成。
DMA控制器作为通信卡的主设备,控制卡上的数据接收和发送(来自通信控制器和CPU),并负责仲裁优先权。由于在进行数据通信时,允许主机CPU访问本卡SRAM,且主机对其中某一路发控制命令时,不影响其余三路通信,这样将会使主机CPU与本卡DMA竞争本卡总线控制权。而总线上没有给出主机CPU指令排队状态序列,故不能直接设计多主竞争,因而在本卡总线上用门阵列设计了一个状态机,不断地监视总线争用情况,完成本卡总线竞争、仲裁功能。完成HDLC规程的串行通信的器件是INTEL 8274多规程串行控制器,它能完成2个独立的串行接收/发送全双工通信。为了使4个信道在一帧数据的发送或接收过程中,主机不干预,故将发送的一帧数据在发送开始前由CPU用批命令放入卡上的SRAM中,同样,在接收过程中,卡上DMA将接收到的数据放入SRAM中,等一帧接收完成后,再用批命令取出,放入系统存储器中。卡上SRAM不占用主机内存地址,采用I/O映像,该适配器插入主机之后,主机通过系统I/O地址对其访问,这由地址产生器完成。总线接口包括数据收发器,数据开关电路,读、写及中断等控制电路,地址译码等。波特率产生器提供了一个可编程的时钟信号发生器,用户可自行设置通信速率,供工作于内时钟方式时使用。接口电路提供符合RS-232/C CITT V.24和RS-422A标准的接口信号。
3 通信流程设计
如果要发送一帧数据,CPU用批命令将数据放到本卡SRAM中,然后设置相应的发送DMA通道。DMA通道是非自动重装方式,启动8274控制器发送,然后CPU就不需要管理,由卡上硬件自动发送。
如果需要接收数据,启动接收通道。接收通路自动搜索输入信号,搜索到数据帧时,由卡上DMA控制器来管理,将接收的数据放人本卡SRAM中,并向CPU请求中断,读出数据。
4 总线竞争设计
由于同时可进行四路通信,且CPU可随时对某一路发控制命令或访问卡上SRAM存储器,就将出现CPU与本卡主设备DMA争用本卡总线的状况。由于ISA总线没能给出CPU指令排队状态序列,这给总线仲裁带来了困难,而本卡的总线竞争、仲裁是由可编程逻辑器件设计的状态机来完成的。状态机使用一个4MHz信号作为时钟,共设3种状态:
①CPU控制状态。
②DMA控制状态。
③空闲状态,CPU及DMA均未能得到控制权。
当状态机检测到无CPU及DMA申请总线使用权时,就进入空闲状态,而一旦CPU或DMA请求总线,状态机立即将总线使用权交给CPU或DMA。如果正在CPU控制状态期间,DMA申请总线使用权,状态机仍然判定CPU控制总线,让DMA处于等待,直到检测CPU指令完成,状态机才转为DMA控制状态。如果在DMA控制状态时,CPU申请总线使用权,状态机仍然判定DMA控制总线,让CPU处于等待,直至DMA字节传送完,状态机转为CPU控制状态。CPU及DMA对总线的使用权是单个指令或字节传送,不设置总线封锁,因而CPU、DMA可频繁交换使用权,不会出现等待时间过长的现象。
通信卡的驱动程序设计
1 设备驱动程序的I/O模型
通信卡的驱动程序是利用Windows XP的DDK软件开发的标准的核心态设备驱动程序。它使用统一的“文件”形式,用户可以通过代表通信卡设备的文件名,在WIN32子系统中用文件操作函数来访问。该设备驱动和程序可以根据用户的需要,设置为自动加载,或手动加载,也可以动态的加载该驱动程序。通信卡的驱动程序设计成为支持同步I/O模型,也可以为异步I/O模型。
2 发送数据I/O例程设计
在用户态提交发送任务到核心态,由I/O管理程序负责调用驱动程序,驱动程序发送IRP交给硬件,假若当前发送器不忙,则具体的发送操作全部由发送器自行完成,而驱动程序则返回已经一个本帧可以发送的标志。具体的发送完成结果则可以在发送任务完成后查询得到。可是,如果程序向当前设备发送器提交发送任务时,该发送器正在处理上一帧,那么则有两种方法处理。
①立即方式:立即返回一个错误,当前设备忙,不能发送。
②阻塞方式:I/O管理器程序会调度相应的异步处理例程,将当前的发送任务放进任务队列中,返回一个标志:I/O挂起,当前设备忙,发送任务提交任务队列。驱动程序会在发送器空闲时,提交任务队列中的发送任务给发送器。完成发送任务后,将相关文件句柄设为有信号状态,通知本次发送任务完成。
3 接收数据I/O例程
接收数据例程采用客户/服务器的模式设计。由于用户的接收请求和硬件的接收并不是同步的,所以在设计中,为避免丢失数据,考虑创造一个专门的接收线程。这样,同步用户请求、接收线程、硬件层之间的通信就必须仔细地设计。图2示意了用户态接收请求、接收线程以及硬件层之间的通信同步。
①硬件层与接收线程之间通信
硬件层与接收线程之间通信的同步是通过同步事件对象来实现的。同步事件对象通常处于无信号状态,只有当成功地接收到一帧时,才将该事件置为有信号状态。接收线长久等待同步事件对象,在没有收到数据时,因同步事件对象处于无信号状态而阻塞。当硬件检测到数据时,实时中断服务程序负责将同步事件对象置为有信号状态,接收线程就会释放阻塞。将通信卡SRAM上的接收数据读进接收线程缓冲区队列,然后将同步事件对象置为无信号状态,接收线程再次阻塞,等待接收下一帧数据。
②用户层和接收线程之间的通信
当用户提交接收任务时,由驱动程序的调度程序读取接收线程的缓冲区队列,并将标志置为“空”,同时将缓冲队列事件置为无信号状态,并返回,如果缓冲区是空,则
・立即方式:立即返回无数据。
・阻塞方式:阻塞直到有数据队列进入。接收队列的每个缓冲区都对应一个通知事件,如果接收线程将SRAM中的数据读进队列,就将相应的通知事件置为有信号状态,用户请求就等待该通知事件,只要有数据在队列中,就读取返回,否则被阻塞。
4 硬中断服务程序设计
通信卡在全双工的通信中具有实时性,而且在较高的波特率,硬中断非常多。为了防止高优先级中断过多地抢占CPU时间,设计中采用了实时中断服务程序和延迟过程调用的方法。
在Windows XP系统中,每个内核函数和过程都运行于特定的优先级。较高优先级的函数或事件可以抢占较低优先级,反之则不然。实时中断服务程序ISR运行于DIRQL级,具有较高的优先级,它只能被更高级的硬中断所抢占,不会对同级或较低优先级的硬中断的响应。所以,在实时中断服务程序中,只做尽量少的必须工作,即读出中断向量,而将大量的数据传送及处理等工作交给延迟过程DPC去完成。因为DPC过程运行于DISPATCH_LEVEL级,是相对较低的优先级,它可以被任何级的硬中断所抢占。这样,既保证了硬中断的及时响应,又提高了程序的性能。
5 驱动程序人口例程
Windows XP为每个核心态的驱动程序提供了一个默认的标准入口点DriverEntry()。设计中,考虑到该例程运行于PASSIVE_LEVE级,系统只运行该例程一次就抛弃了,所以在驱动程序中用到的重要数据、对象等都不能保存在DriverEntry()例程中,必须在初始化过程中分配一块NoPaged内存来保存。通信卡的驱动程序的DriverEntry()例程主要完成如下功能。
读取Registry的硬件配置信息,声明I/O地址、中断等资源;创建代表通信卡的设备名MPSC,该名字对WIN32子系统是可见的;设置调度例程入口点;分配一块NoPaged的内存,存储重要信息;连接硬中断,设置中断服务程序,初始化线程、事件、信号灯、DPC等内核对象,返回状态STATUS_SUCCESS。
如果在以上过程中遇到错误,则需要做以下工作:断开硬中断;释放硬件资源;将相关的错误信息打包,并记录;返回错误信息。
6 设计驱动程序中需要注意的问题
由于通信卡在应用中具有一定的实时性,为了克服中断的不确定性。提高系统的性能,开发了Windows XP系统所有驱动程序中最难的异步驱动程序。在系统的内核开发,异步模型I/O操作中,内核对象的同步十分复杂,细微的差错都会导致系统彻底崩溃。在设计驱动程序中需要注意以下问题。
・在程序中用到的内核对象:事件、信号灯、线程以及连锁等,都必须将其存储在Nopaged内存中,否则,会造成系统崩溃。
关键词:嵌入式;CF卡;低层驱动;存储设备
中图分类号:TB文献标识码:A 文章编号:1672-3198(2012)12-0162-01
0 引言
设备驱动程序是构成Linux内核的主要部分,不合理的驱动设计会导致系统内核出现紊乱,由于不稳定而导致系统崩溃,使行成重要数据丢失或严重后果。因此,设计合理的驱动程序,有助于保障系统的整体稳定性。在S3C2410开发板下设计合理的驱动程序是本文研究的重点。
S3C2410的硬件平台是基于ARM公司的ARM920T处理器核,采用32位微控制器,价格低,功耗低,性能高;软件平台通过u-boot移植和内核编译完成,所有这些特性使S3C2410为 linux操作系统内核驱动程序设计提供了较好的解决方案。
目前,嵌入式系统中应用最广泛的存储卡是CF卡。多数情况下,使用PCMCIA控制器实现CF卡的操作,为了减少设备使用和成本降低,本文在没有PCMCIA控制器情况下,探讨分析设备驱动程序设计步骤,CF卡的配置及底层驱动如何工作等问题,研究实现了利用CF卡作为存储设备的嵌入式Linux系统。
1 系统设计
嵌入式系统使用CF卡作为存储设备的设计目前有很多,而开发设备的选型不同,开发的方法不同,本系统使用Linux操作系统,以S3C2410为开发平台,以ARM920T处理器为模板来实现CF卡的嵌入式系统。
驱动程序开发首先需对Linux操作系统中原有的IDE程序进行改造,用后台程序管理CF卡的热插拔事务,同时CF卡以Memory寻址访问方式进行8位寻址。在对Linux设备进行驱动程序设计时,具体设计步骤如下:
(1)启动系统,将设备登记到相应的设备数组,并返回设备的主驱动号。利用设备号对此数组进行索引。调用设备注册函数module_register_chrdev()进行设备注册。
(2)为驱动函数定义功能函数,当系统调用这些功能函数时,系统将自动运行函数定的模块实现特有的功能。
(3)当一个模块使用完成时,启动动态的卸载模块函数,调用cleanup_module()函数,并调用设备注销函数即可卸载函数。
在进行设计时,需注意Linux设备驱动程序接口和几个重要的数据结构。具体有以下四层接口:应用进程与内核、内核与文件、文件系统与设备驱动程序、设备驱动程序与硬件设备。
每个驱动程序都有一个数据结构,包含的函数指针指向所开发的接口,内核用主设备号作为索引访问数据结构。
2 接口和重要的数据结构
设备驱动程序是操作系统硬件设备和内核的接口,Linux 操作系统中,Linux 操作系统采用统一的接口,在硬件设备、设备驱动程序、文件系统、内核、应用程序进程间有相连的接口。
驱动程序有一个file_operations的数据结构,该数据结构提供了很多接口,其中常用的接口有open、read、write、seek、release等,为驱动程序开发提供了保障。驱动程序中struct inode数据结构为设备和文件对应了唯一的inode号,驱动程序中同时也使用了struct file、struct device 数据结构。
3 CF卡基本配置
CF卡在存储操作前,对CF卡进行的相关配置主要有以下几个方面:配置GPIO并分配寻址端口,用于传输CF卡信号。配置CF卡的属性存储空间和寻址访问方式。在系统中CF卡使用Memory寻址访问方式,将属性寄存器配置为0x00,其他属性寄存器保持默认值。验证对属性寄存器的值,当驱动属性值与默认值不匹配时,则说明Memory寻址访问方式没有正确使用CF卡,此时需修改属性值为默认值即可。
4 CF卡驱动程序设计
4.1 底层驱动实现
CF卡存储备份需要通过CF卡的底层驱动实现,这就要求CF卡能准确的接收及响应系统对它的I/0请求。具体流程如下:
(1)在读写命令时,使用LBA寻址模式来访问CF卡。当驱动对CF卡的I/O请求进行正确接收后,此时把相关参数值和ATA命令值写入对应的寄存器,并向CF卡ATA命令,即完成了ATA命令。
(2)填写ATA命令控制块后,CF卡可以利用轮询的方法对发送的命令做出响应。
(3)受外部环境影响造成CF卡没有接收到命令或者接收命令出错时,可以使用软重置将其恢复到初始状态,并重新发送该ATA命令。
快捷的实现存储备份需使CF卡能及时响应热插拔,把CF卡设定为TureIDE工作模式,这样CF卡就可以随意移动。在系统层注册字符型设备CFMGR文件实现探测热插拔事件、与应用层通信,实现分配或释放系统资源,从而驱动CF卡;在应用层及时监听热插拔事件并采用Select阻塞机制,达到尽量少的占用CPU资源。
4.2 驱动程序实现
驱动程序的作用在于为应用程序提供机制,它是内核的一部分。该驱动程序实现了设备初始化,在内核和设备间相互传送数据,读取、回送数据,检测错误等功能,开发的难点在于高效请求处理、中断、1/O操作等方面功能设计。
5 结语
本文通过系统驱动程序的设计流程分析,研究程序开发的接口和数据结构,对CF卡进行配置,研究开发驱动程序,实现了CF卡存储备份和快速热插拔,使其便于在其他系统中应用。
参考文献
[1]嵌入式Linux 中CF卡的管理研究[EB/OL].140.112.99.135/ntu/showthread.php?threadid=67.
windows nt是一个功能全面的操作系统,具有完全集成式的连网能力,它的网络模型开始于mac子层,网络接口卡(network interface card以后简称网卡或nic)驱动程序驻留在其中。通过相关的网卡把windows nt与网络连接起来,但一直到80年代后期,许多传输协议的实现受限于mac层接口的独特实现,因为mac层定义了协议与网卡之间的转换机制。
1989年,microsoft和3com两公司提出了一个定义mac层与osi模型高层协议驱动程序之间的网络设备接口规范(network device interface specification : ndis),ndis给数据交换提出了一个灵活的环境,它规范了软件接口──称为ndis接口,传输协议可用它与网卡驱动程序进行通信。因此在windows nt环境下开发核心态网卡驱动程序应遵循ndis规范。
对于高速网络fddi(fiber distributed data interface)网卡驱动程序还需要smt(station management)站管理功能的实现,否则将不能作为一个fddi站连入环结构中,只能实现点到点间的数据通信。故有必要将smt软件移植到网卡驱动程序中,这将又导致对miniport nic驱动程序编程框架的破坏,于是有必要形成fddi网卡驱动程序(包含smt)与windows nt操作系统的良好接口──由逻辑网卡的注册和mac层驱动程序的初始化来完成。
所以,本课题旨在深入研究应用microsoft公司的ddk(device driver kit)将smt移植于windows nt的fddi网卡驱动程序过程中如何注册miniport nic驱动程序。即怎样正确注册逻辑网卡和mac驱动程序的初始化。着重讨论与初始化相关的上边缘函数的使用和调用关系以及初始化过程中遇到的各种问题的具体解决。
第一章windows nt环境下fddi网卡驱动程序
总体结构介绍
第一节windows nt网络结构
§1.1.1 windows nt网络体系结构
windows nt的网络体系结构是基于国际标准化(iso)制定的标准模型──开放式系统互连(open system interconnection:osi)参考模型分层建立的,这种方式有利于随时扩展其它功能和服务。
windows nt网络模型开始于mac子层,网卡驱动程序就驻留在其中。它通过相关的网卡把windows nt与网络连接起来,图中的多个网卡表明在一台运行windows nt的计算机上能使用多种网卡。
这一网络体系结构包括两个重要接口──ndis接口与传输驱动
程序接口(tdi)。这两个接口把两个层隔离开来,办法是相邻的部件只允许按单一的标准来写,不允许多重标准。例如一个网卡驱动程序(在ndis接口的下面)就不需要特地按每个传输协议来写它的代码块,恰恰相反,该驱动程序是写给ndis接口的,它通过符合ndis的相应传输协议来请求服务。这些接口包含在windows nt的网络体系结构中,以容纳可移植、可互换的模块。
在两个接口之间,是传输协议。它在网络中起着组织者的作用。一个传输协议规定了数据以何种方式呈递给下一个接收层,以及如何对数据相应地进行打包。它通过ndis把数据传给网卡驱动程序,并通过tdi把数据传给转发程序(redirector)
tdi之上是转发程序,它把本地的网络资源申请转送给网络。
为了能和其他厂商的网络互连,windows nt允许有多个转发程序。对于每一个转发程序windows nt计算机必须也有一个相应的供应者(provider)(由网络厂商提供)。多供应者路由选择程序决定适当的供应者,然后借助于供应者,对应用请求到相应的转发程序做出选择。
§1.1.2 windows nt网络驱动程序
windows nt支持两种类型的网络驱动程序
传输驱动程序
实现数据链路层中的逻辑链路控制子层协议和传输层协议。向 下与ndis接口,向上与tdi接口。
网卡驱动程序
实现对物理层的管理和数据链路层中介质访问控制子层协议,通过ndis向下管理物理网卡,向上与传输驱动程序通信。
§1.1.3 windows nt网卡驱动程序
windows nt环境下的网卡驱动程序也分为两种:
miniport网卡驱动程序:miniport驱动程序只须实现与网络硬件相关的操作(包括发送和接收)。而所有底层网卡驱动程序的通用操作(如同步),一般由ndis接口程序来实现。
full网卡驱动程序:full网卡驱动程序必须实现所有硬件相关和同步、排队等操作。例如full网卡驱动程序为了响应数据接收,需要保持本身的捆绑信息,而miniport就可以由ndis接口库来实现。
在windows nt的早期版本中,full网卡驱动程序要求开发者实现许多底层操作,来处理多处理器的核心问题以及处理器、线程的同步,这样不同的开发者在大量重复着许多相同的工作。
而miniport网卡驱动程序允许开发者仅仅写一些与网络硬件相关的代码即可,而那些通用的函数由ndis接口库来实现,这样开发出来的驱动程序减少了不必要的工作。
第二节miniport驱动程序的结构
ndis接口规范了网卡驱动程序的实现,同时也对tdi驱动程序的实现提出了一定的要求,在nt中,ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系如下图所示:
图2.0 ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系
miniport驱动程序包括驱动程序对象、驱动程序源代码和ndis接口库代码。windows nt ddk提供ndis.h作为miniport驱动程序的主要头文件,定义了miniport驱动程序的入口点、ndis接口库函数和通用数据结构。
上边缘函数的作用是网卡驱动与ndis接口库进行通信,而下边缘函数是tdi协议驱动程序与ndis通信的手段。
§1.2.1 miniport网卡对象
ndis用一个叫做逻辑网卡的软件对象来描述系统中的每块网卡,而逻辑网卡与windows nt设备对象的通信由i/o子系统来管理,描述网卡的设备对象包括相关的网络信息如名字、网络地址和网卡内存基地址等,它还包含与硬件相关的驱动程序状态数据(捆绑数目,捆绑句柄,包过滤数据库等)。ndis分配一个句柄到miniportinitialize这个上边缘函数的一个结构中,然后miniport网卡驱动程序将在以后提供这个句柄来给ndis调用,这个结构一直被ndis保持,并且对miniport驱动程序不透明。
当miniport网卡驱动程序初始化一块网卡时,它创立自己的内部数据结构来描述网卡,记录需要它管理的与设备相关的状态信息。当miniport网卡驱动程序调用ndismsetatttibutes或ndismsetattributesex两ndis库函数时,它传递一个句柄给这数据结构。这样,当调用miniport驱动程序入口点时,它就传递这个句柄来验证驱动程序所对应的网卡的正确性。这个数据结构为miniport网卡驱动程序所拥有并维护。
§1.2.2网络对象标识符
miniport nic驱动程序还需要维护一组对象,这些对象是系统定义的对象标识符(object idetifier:oid)来标识,以描述驱动程序的性能和当前状态信息。为查询这些信息,上层驱动程序调用ndisrequest向ndis接口库指示oid。oid表示了调用所需的信息类型,如miniport驱动程序所支持的lookahead缓冲区大小等。ndis接到上层驱动程序的查询请求,将oid传递给上边缘函数miniportqueryinformation实现对oid的查询,如果上层驱动程序请求改变状态信息则调用miniportsetinformation实现对oid的设置。
§1.2.3 miniport网卡驱动程序代码
典型的miniport nic驱动程序必须有一些函数来通过ndis接口实现上层驱动程序与硬件的通信。这些函数称为上边缘服务函数。
这些上边缘服务函数由驱动程序的开发者根据驱动程序面向的特定低层网络类型和硬件以及相应环境,可以有选择地实现,但必须保证驱动程序最基本的功能,这些基本功能包括初始化、发送、中断处理、重置、参数查询与设置和报文接收。
miniportinitialize:操作系统根据系统配置信息,检测出网卡已安装时,由ndis接口在初始化时调用,主要完成低层网络类型确定,对应于物理网卡的逻辑网卡初始化,中断信息注册,网卡与主机通讯方式的确认。i/o端口的申请与注册,内存映像,mib的初始化,物理网卡的验证与初始化等。
miniportreconfigure:支持网卡参数动态变化,和miniportinitilize一样由ndis接口以初始化级别调度执行(不能屏蔽中断,必须由驱动程序承认并清除在此期间产生的中断),支持即插即用和软配置的网卡在动态改变参数时,必须提供此函数。
miniportqueryinformation:查询网卡的状态以及网卡驱动程序的操作或统计参数,如是否支持组通讯、网卡的物理速率是否支持回环、是否支持直接拷贝等,这些参数以oid方式统一管理。
miniportsetinformation:ndis接口或协议驱动程序通过调用此接口改变驱动程序维护的oid库,一些操作参数的改变也将同时改变驱动程序状态,例如组地址的设置。
miniportreset:包括网卡硬件重置和驱动程序软件重置,软件重置包括驱动程序状态重置,以及一些相关的参数重置,还需考虑有些参数的恢复,重置时不必完成所有正在活跃的外部请求,但必须释放已占用的外部资源。
miniporthalt:挂起网卡并释放该网卡驱动程序占用的所有资源,在此期间不屏蔽中断。
miniportisr:高优先级的中断处理程序,进行的工作包括初始中断处理类型,决定是否进行中断转交,对卡上中断进行处理 等,该服务类型只在以下情况被调用:
ndis接口调用miniportinitialize和miniporthalt两函数时。
.中断处理类型设为每此中断处理过程都调用时。
为使系统能及时响应所有硬件中断,高优先级的硬件中断处理程序应尽可能的减少运行时间,防止长时间的屏蔽低优先级中断,避免造程中断丢失。
miniporthandleinterrupt:由中断延时处理程序在中断延时处理时进行调用。ndis排队所有的延时处理,该服务主要处理发送完成、报文接收、描述符用尽、溢出、网卡异常等中断。
miniportsend:ndis收到上层发送请求时经过若干协议处理再向下调用此服务过程,发送的packet已含有llc和mac头,该服务过程进行边界对齐、packet约束重整、描述符映射和报文发送、以及发送资源和packet缓冲队列管理。
miniporttransferdata:多个已和网卡捆绑的协议驱动程序在接收到报文到达指示后,向网卡驱动程序发出传送请求以拷贝各自所需的报文数据部分,网卡驱动程序根据各协议驱动程序对单个packet是否进行多次拷贝,以决定是否暂存只允许单次拷贝的packet等。
miniportcheckhandle:ndis每秒调用此服务函数一次,驱动程序发现网卡异常时报告给ndis由ndis调用miniportreset进行硬件重恢复。
miniportenableintrrupt:中断使能。
miniportdisableinterrupt:中断屏蔽。
另外,每个网卡驱动程序必须有一个初始化入口点,由driver entry函数实现,它和系统相关,由操作系统在装入驱动程序时调用,主要完成初始化ndis wrapper,再由wrapper初始生成驱动程序管理块并完成相应各种初始化工作,登录网卡驱动程序所有上边缘服务入口点,同时写入ndis版本信息。
§1.2.4 ndis接口库
ndis接口库包括在ndis.sys中,它是一个核态函数库,有一套抽象的函数,无论协议驱动程序还是nic驱动程序都连接到这个库中,以实现上下层之间的操作。
第二章fddi网卡驱动程序的加载和运行
第一节 网卡驱动程序的安装
windows nt网卡驱动程序安装的目的是实现网卡相应硬件信息和驱动程序在windows nt注册库中的注册,使windows nt能够正确识别网卡,了解所必需的软硬件信息并能在windows nt启动时加载相应驱动程序。
网卡驱动程序安装时,首先在主群组的控制面板中选择“网络”,然后添加网卡,指定相应信息文件──oemsetup.inf的路径,以完成以下两个必要的操作:
复制驱动程序到相应的系统目录(windows nt根目录\system32\drivers\)中;
在windows nt注册库中存入相应软硬件信息。
下面主要以fddi网卡为例介绍安装驱动程序所必需的工作:
§2.1.1网卡一般硬件参数
对于fddi网卡,必须在编写其oemsetup.inf文件时确定以下硬件参数:
总线类型:pci(5)……括号中的数字5表示pci总线在ndis中的总线类型代码;
厂商代号:0x5588……系统加载时确定网卡的标记,也是编程时确定pci槽号的标识;
cfid: 0x01;
介质类型:光纤(3) ……括号中的数字表示光纤在ndis中的介质类型代码;
是否支持全双工:支持。
对于其它的硬件信息在此inf配置信息文件中可有可无,如若配置,则可在驱动程序的编写时利用这些信息,方便编程,同时有利于其它应用对其参数的确定和使用。
§2.1.2 fddi网卡加载时需在注册库登录表里做的网络配置
网卡驱动程序的安装通常将创建登录表中的四个不同子键:
software registrion键,对应于驱动程序,存在于hkey_local_machine\software\company\ productname\version中。我们的fddi网卡驱动程序所对应的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
网卡的软件登录键,存在于hkey_local_machine\software\microsoft\ windows nt\nt3.51\networkcards\yhfddi1;
驱动程序的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services
网卡的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services
对于每一个网络部件,一个名为netrules的特殊子键在邻近的驱动程序或网卡登录子键里创建,netrules标识网络部件为网络整体的一部分。
fddi网卡驱动程序对应的标准软件登录表项将出现在以下路径:
hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
驱动程序对应的标准项的值为:
description =yhfddi/pci adapter controller
install date =……
……
refcount =0x01
servicename =yhfddi
softwaretype =driver
title =yhfddi/pci adapter controller
而且在yhfddi驱动程序相关的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网卡在如下路径的networkcards子键里介绍:
hkey_local_machine\software\microsoft\
windows nt\nt3.51\networkcards\yhfddi1;
网卡的标准项包括以下这些值:
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用以书写系统所有部件的配置文件,当然也可以用以书写网络系统各部件的配置文件,该配置文件描述了网络部件安装、配置、删除的执行过程。当网络部件进行初始安装或二次安装(通常通过ncpa进行)时,安装程序读取部件对应的配置文件,进行解释执行。gui inf描述语言由节、命令、逻辑操作、变量规范、流程控制以及一套调用dll或外部程序的机制组成,其中,节是配置文件的主体,节可分为install节(类似于函数),shell节(也类似于函数,但可调用insall和shell节),detect节(不包含命令),一个配置文件一般由若干不同类型的节组成。驱动程序的开发者根据需要可以在配置文件中编写相应代码,使得用户和系统之间能进行交互,并且由用户决定一些配置参数。
nt网卡配置文件有其一套规范,驱动程序开发者必须按规范编写配置文件,一般来说,一个配置文件至少应该提供下面三个节:
安装入口点:[identify]shell节。该节主要功能是给出安装部件的类型名,系统通过它识别该部件属于哪一大类(display,mouse,scsi,network等)中的哪一类(网络adapter,driver,transport,service,network和netprovidor),同时,还需要给出映像文件和配置文件所在的源介质及标识。
[returnoption]shell节。系统执行安装identify节后,执行该节。它主要功能是检查所需安装的部件是否支持的硬件平台和语言,并给出网卡名(有些配置文件支持多类网卡,此时必须让用户进行选择,并获得选择结果)。
[installoption]shell节。该节是配置文件得主体,也是上次安装完后再次进行配置、删除、更新的入口点。主要功能是拷贝映像文件和配置文件,生成配置的各种选项,创建该部件在注册库中对应的各种登录子树并更新重写。
第二节 驱动程序的加载过程
§2.2.1 windows nt的启动过程
关键词: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
在计算机应用系统和控制系统的开发过程中,通常需要在Windows 环境下,直接访问和控制具有特定功能的硬件设备。由于操作系统版本不同,其运行机制必然存在差异。在这里针对驱动程序的运行机制主要分为两类。一类是以前的Dos 和Windows98系统,在这类环境下可以直接完成对I/O 端口的读写;另一类是NT4.0以上版本Windows系统,在这类环境下,为了使系统变得更为安全,Windows对系统底层操作采取了屏蔽策略,不允许用户态的应用程序直接访问I/O端口,而是通过编写驱动程序,这样可以使用Kernel层设备驱动程序提供的各种服务间接地访问I/O,因此编写I/O设备驱动程序极为重要。
为了解决I/O设备驱动程序和不同结构操作系统的兼容性[3],微软公司在 1997年提出了一种全新的Windows 驱动程序模式(WDM),支持即插即用、电源管理和WMI技术,为存在于Windows 9x 和Windows 2000 操作系统中的设备驱动程序提供了统一的参考框架。
1 WDM系统函数
WDM 驱动程序包含了许多子例程,操作系统通过调用相关例程来执行针对I/O 请求包的各种操作[1]。WDM 驱动程序可执行包中的内容如下:
1.1 基本驱动程序与设备操作
DrvierEntry、 AddDevice
① DriverEntry例程负责初始化程序范围的数据结构和资源。
② AddDevice例程是被系统调用,进行初始化一个被枚举的新设备。
1.2 I/O 控制
DpcForIsr、OnInterrupt、StartIo、AdapterControl
① StartIo例程进行串行处理,对IRP进行排队。
② AdaperControl例程负责执行DMA 传输。
③ OnInterrupt是一个中断服务例程。
④ DPC是一个延迟过程调用例程。
1.3 派发功能函数
DispatchWriter、DispatchRead、DispatchWmi、DispatchPnp DispatchPower
Dispatch为调度例程,负责处理应用程序与驱动程序之间的通信,包括Writer,Read等,开发人员必须选择特定驱动中需要的例程。
1.4 设备的创建和初始化
1) 内核模式驱动程序没有main或WinMain,而是由I/O管理器根据需要调用一个驱动程序例程:① 驱动程序被装入时;② 驱动程序被卸出或系统关闭时;③ 用户程序发出I/O系统服务调用时;④ 共享硬件资源对驱动程序可用时;⑤ 设备操作过程中的任何时候。
2) 相关内容:① 所有驱动程序必须包含DriverEntry例程,进行驱动程序初始化。② 利用AddDevice函数负责创建一个设备对象,并建立一个私有的设备扩展对象。③ 给出设备名并创建符号连接名或者注册设备接口。④ 初始化设备扩展和设备对象的标志位。⑤ 把新设备对象附着到设备堆栈中。
2 硬件的访问及资源分配
PnP管理器使用IRP来指导驱动程序启动、停止和删除设备,并查询驱动程序的设备,WDM是PnP驱动程序,必须具备PnP例程。IRP是DDK定义的一个数据结构。当驱动程序接收到PnP子码IRP_MN_START_DEVICE 时,IRP堆栈列表内的两个字段AllocatedResourcesTranslated 和AllocatedResources,列出分配的资源。
用来描述这些资源的结构是CM_PARTIAL_RESOURCE_LIST 类型,它包括一个CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的计数数组。
数组中每一个资源描述符都有一个Type 成员[3],它表示所代表的资源的类型。主要有4个重要的共同体类型是Port(端口)、Interrupt(中断)、Memory(内存)、Dma(直接内存访问)。得到了设备的I/O地址,就可以对设备进行读取了,在读写端口地址和内存时应该使用标准的内核读取例程,在WDM 中应使用HAL宏等。这样就可以不用考虑不同操作平台的特性,也可以更好的适应Windows 2000 多任务,多进程环境的要求。
在分配硬件资源时,首先必须编辑安装文件(inf文件),它包含了WDM 设备驱动程序的制造商信息、要复制的文件列表、要创建的注册表项等。INF 安装文件向操作系统添加了硬件资源。当驱动程序收到IRP_MJ_PNP 的IRP_MN_START_DEVICE 的子码时,驱动程序获得设备的硬件资源。
3 动态链接库(.dll)
虽然驱动程序是为设备硬件层编程服务的,但同样需要和应用程序进行通信,从而最终达到应用程序控制设备的目的。
通常情况下,应用程序通过专用的API 函数操作硬件,但由于这些函数携带参数很多,使用起来并不方便,因此可以另外开发一套用于中转数据的功能函数集(动态链接库),可以使得底层驱动设备对用户是透明的[2]。采用这种分层结构,应用程序通过动态链接库(.dll)来存取I/O设备。动态链接库(.dll)提供给应用程序最常用的接口函数,包括设备初始化,关闭设备,存取端口等。在应用程序中加入特定的动态链接库可以很方便的操作端口,并且可以重复使用,缩短了开发周期。
4 结束语
WDM驱动程序模型具有较好的可移植性:编写驱动程序时,WDM规定只使用ANSI C标准规定的语言元素;硬件和软件的可配置性灵活:使用HAL工具调用低级总线驱动程序或实现一个标准控制接口,避免直接引用硬件;使用注册表作为配置信息的容器;可运行在多处理器平台上。基于 WDM 驱动模型设计的驱动程序可以稳定地在Windows 2000/XP/NT下运行,可以更好的实现分布式的数据监测和控制。
参考文献:
[1] 武安河.WDM设备驱动程序开发[M].北京:电子工业出版社,2003.
[2] Cant C.Writing Windows WDM Device Drivers[M].孙义,译.北京:机械工业出版社,2007.
[3] 李建.Windows2000下I/O设备驱动程序设计[D].北京:北方交通大学,2003.
0、引言
“面向对象程序设计”是软件工程专业和计算机科学与技术专业的一门专业核心课程。该课程是软件工程等课程的先修课程,同时又是进行软件开发的直接工具,是把所学的专业知识转化为应用的桥梁,是学生就业专业知识的关键技术,所以该课程在整个教学体系中占据非常重要的地位。目前该课程在教学中仍普遍采用传统的以语法讲授为主线的课堂教学模式,从而导致学生学习该课程的主动性和积极性不高,缺乏知识运用和解决实际问题的能力,教学效果也不理想。针对目前“面向对象程序设计”课程教学中存在的问题,课程组将基于项目的教学方法应用于该课程的教学实践,并取得了初步成效。笔者从教学目标、教学内容、教学方法和手段、教学组织和教学评价等几个方面介绍项目驱动在“面向对象程序设计”课程教学改革中的应用,并希望可以与工作在教学改革第一线的教学同行进行交流和探讨。
1、项目驱动教学的理论基础与认知研究
1.1 目前课程教学中存在的问题
面向对象程序设计(OOP)是一种全新的程序设计思想。但目前该课程大都以演绎的方式来教授,教学中存在重语言介绍、轻对象思想和方法传授的情况,即在教学内容的组织上是以特定的面向对象程序设计语言结构组织的,从基本语言要素、语法和语句结构组织,然后再举一些例子说明这些语句的应用,而这些例子都是一些语言语法层面上的简单应用,很少涉及实际问题的解决。这种教学方式不仅不利于学生领会和理解面向对象的思想和方法,更不利于培养学生使用面向对象方法解决实际问题能力。
1.2 建构主义
工程与科学教学中主要采用的演绎式教学法将课程或知识点作为学科内一个自成系统的知识体系来处理。教师按照从一般原理到数学模型再到模型应用这样的方式进行教学,很少会提到为什么要这样做,以及这样的模型可以用来解决什么实际问题,学生为什么要学习这些东西等,而学生的任务就是被动地吸收这些知识。
在教育心理学中有一个公认的准则,就是只有当人们清楚地意识到有必要去了解某个事物时,他才会最为强烈地去主动学习。如果只是告诉学生某项知识或技能在日后会用得到,并不能起到有效的激励作用。
与传统教育模式不同的建构主义认为学生的学习是将新的信息纳入到自己已有的认知框架中。因此,教育应该从学生可能熟悉的内容与经历出发,与学生已有的知识结构联系起来。教学内容应该与实际应用有关,并与其他知识领域相关联,而不应是抽象的或独立的。教育者要创造条件引导学生自行建构知识,并从实践经历中获得证据来修正自己的知识建构。
建构主义支持归纳式的教学,即教学不是从一般原理到应用,而是首先从具体事物出发,提出一个有待解决的实际问题;然后教师在学生解决问题的过程中向学生提供所需的信息,帮助学生把握事实、了解规则、知道程序、明白原理。项目驱动的教学也是归纳式教学的一种。
1.3 认知研究
心理学与神经学方面的研究对归纳式的项目驱动教学提供了强有力的支持。
布兰斯福德(Bmnsf-ord)等人在文献中指出:“凡是新的学习都涉及先前学习所得信息的转移”,即学生对新知识的接受程度受已有知识的影响是很强的。如果新知识与学生已有知识或认知有联系或一致的话,学生学习起来较容易。项目驱动教学是在学生能联系起来的情景、问题或应用的背景下提出新的知识。因此,这样的教学内容能够与学生已有的认知结构结合起来,是有易于学生接受的。
学生的学习动机会影响到学生愿意投入学习的时间的多少。如果学生发现学习的东西有用,而且能够用来做一些对别人有影响的事情的话,学习就会更有积极性。项目驱动的教学通过与实际应用相关的项目来提供一门课程的教学内容与技能。学生在学习的过程中能够亲身体会到所学知识的实用性。因此,这样的教学方法能够大大增进学生学习的积极性。
此外,如果教学环境与实际工作环境相似,学生在日后就能够很容易地将课程所学得的知识与技能移用到实际工作场景中。项目驱动的教学围绕真实的项目来组织教学,因此有助于弥补学生的学习环境与实际工作环境两者之间的不一致,从而有利于学生将所学的东西应用到实际工作中去。
综上所述,把项目驱动教学应用于“面向对象程序设计”课程的教学中,能够激发学生的学习兴趣,有效地提高学生学习的积极性和主动性,改善教学效果,并有利于学生的职业素质和能力的培养。
2、项目驱动教学的应用
课程组将项目驱动的教学模式应用于“面向对象程序设计”课程的教学过程中,教学以项目为核心,学生为主体。教师在教学中起主导作用,将软件工程化思想融入到教学内容中,以软件产品的生产周期作为课程内容的主框架,教学内容包括若干个不同层次的软件项目,通过项目引出知识点。项目驱动教学模式在课程教学中的应用激发学生动手实践和分析思考,提高了学生的综合应用能力。
下面从教学内容、教学方法和手段、教学组织和教学评价等方面介绍将项目驱动教学应用于“面向对象程序设计”课程改革的具体做法。
2.1 基于项目驱动的教学内容改革
课程组通过选用国外原版经典教材,引进国外的先进教学理念,依据课程教学大纲,以职业活动为导向,以学生为教学主体,以项目为中心,对课程教学内容进行整合、序化,构建了模块化课程结构,如图1所示。该结构将课程内容划分为4个模块:语言基础、面向对象程序设计基础、面向对象程序设计的方法理论和开发应用,并细化每个模块的知识点和职业素质、技能和能力培养的要求,突出面向对象程序设计的方法理论和开发应用,着重培养学生的职业素养、主动学习和创新的能力。
在上述4个教学模块中,教学内容是按项目驱动的。在讲授课程内容时直接从面向对象程序设计入手,将语言基础的知识分散到其他模块中进行讲解。在2、3、4级模块中,通过项目来详细展示每个单元的重要理论和概念,所涉及的语法知识会随着解决问题的需要而引入。基于项目驱动教学的2、3、4级模块所包含的项目如图2所示。
项目驱动教学实施的关键在于项目的设计与选取。教学项目的设计与选取遵循有的放矢、与实际应用相关联的原则。同时项目的难易程度要以不将学生逼到其“最近发展区(Zone ofProximal development)”之外为原则,即选择的项目要比学生可以独立完成的项目难一些,但是在教师指导下或与其他学生合作能够完成。
2.2 基于项目驱动的教学方法改革
根据软件设计开发的工程性特点,“面向对象程序设计”课程的教学灵活地运用了“基于项目的教学方法”,突出了“理论教学构筑学生的知识结构,实践教学构筑学生的职业技能结构”的教学原则,并将面向对象程序设计的基本原理、软件编程的基本规范和软件设计建模的教学完全地融合在一起。
项目驱动教学法与传统的教学法相比,有很大的区别,主要表现在改变了传统的3个中心,将以“教师”为中心转变为以“学生”为中心,以“知识体系”为中心转变为以“项目”为中心,以“理论讲解”为中心转变为以“项目实践”为中心。在教学过程中,学生可以参与软件产品的构思、设计、实施和运行,这给学生创造了感知软件、动手实践、分析思考的机会。通过解决问题,学生的学习兴趣被激发,基本的工程素质和能力得到了培养。“基于项目的教学方法”目的在于创造条件引导学生通过亲自参与,自行构建知识,而不是简单地接受教师的诠释。
2.3 教学评价和考核方法改革
项目驱动教学重在知识的应用与集成,因此教学的考核与评价要强调对概念的理解,重视对知识、技能学习过程的评价,关注实践环节及工程应用能力,应对学生进行多视角、多方位的综合测评,力求知识与能力的协调统一和考核评价的客观与公正。课程组将考试形式由笔试改为机试,并增加课程设计考核环节。学生最终成绩的评定方法是:机试占20%,日常表现(出勤率、作业与实验成绩)占20%,自我评价与同学生评价占10%,项目设计和参与程度占20%,答辩情况占20%,撰写论文或报告占10%。考核形式的改革会引导学生在课程学习中注重编程能力和解决问题能力的培养。
3、项目驱动在教学中的应用效果与评价
从2009~2010学年的第一学期开始,课程组将项目驱动应用于“面向对象程序设计”的课程教学中。通过与传统教学进行对比,我们得出以下两方面的结论。
3.1 项目驱动对教学产生的正面效果
项目驱动教学增进了学生在概念理解方面的思维能力,增强了学生分析问题、解决问题的能力,能够有效地调动学生学习的积极性,提高学习的责任心,改善了学生与学生、教师与学生之间的互动关系,在学生的团队合作与沟通能力培养方面起到积极的作用,特别是对于那些学习风格不适于传统课堂授课的学生的教学效果特别好。
3.2 项目驱动教学在应用中存在的问题
项目驱动教学并不是一种很容易开展的教学。从教师方面而言,该方法要求教师对课程知识的把握程度要深,要有丰富的教学经验,能够根据教学情况随机应变。就学生方面而言,基于项目的教学方法要求学生对自身的学习负有更多的责任。在项目实施过程中,各种项目管理与人际冲突等问题还会出现,这些都是学生所不习惯的,同时也对教师的教学组织能力提出了更高的要求。因此,有些教师和学生在一开始会对它感到不适应,在学习过程中也会出现两极分化现象。此外,如文献中所描述的,基于项目的教学容易产生内容知识方面的空白,忽视和遗漏一些关键知识点,从而影响学生今后对一些重要内容的进一步学习。
关键词:C#程序设计;任务驱动;工作过程;共享资源;课程开发
1 引言
程序设计是一项实践性很强的活动,项目的完成,需要整合各个知识点,还需要具备综合应用知识的能力。《C#程序设计》是我校计算机应用专业的一门核心课程,2008年立项为院精品课程,2010年立项为浙江省精品课程。本课程几年来完成了基于工作过程的课程开发,课程开发遵循了赵志群教授所讲的工学结合课程的基本原则:学生通过对技术(或服务)工作的任务、过程和环境进行整体化的感悟和反思,实现知识与技能、过程与方法、情感态度与价值观学习的统一。课程从提出一个具体的应用项目的需求开始,到最终完成项目开发交给用户为止,通过若干相对独立而又逐步发展的任务组织知识点,每一个任务都是先提出要解决的问题,然后明确目标和解决问题的步骤,在.NET Framework基础上,运用Visual C#进行面向对象的程序设计,充分利用面向对象的封装性、继承性和多态性等特性实现项目,步步为营,逐步发展,给学生持续的动力、兴趣和成就感。课程开发侧重工学结合,知识和能力的统一。
2 课程开发的主要步骤
2.1 寻找一系列具有典型意义的综合性的工作任务
以就业为导向是课程体系设置核心的特征。职业教育的本质就是就业教育,学习的目标就是为了就业,有助于就业的我们就学、并且学精,无助于就业的我们就不学。为了能够满足就业的需求,我们做的第一件事情就是去软件开发企业了解用人状况和技术需求,通过对掌握的一手数据进行详细分析和多次专家研讨,比较全面地掌握企业用人需求。寻找一系列具有典型意义的综合性的工作任务。
整体化的工作分析的结果不是独立的、点状的“能力点”或者“技能点”,而是过程完整的“典型工作任务”。
2.2 在典型工作任务的基础上设计学习领域课程及其学习任务
学习情境的载体是一个“学习与工作任务”,即“内容是工作的学习任务”,“用于学习的工作任务”,简称“学习任务”或“学习性任务”。
学习任务是学习情境的物质化表现,它来源于企业生产或服务实践,能够建立起学习和工作的直接联系,但并不一定是企业真实工作任务的忠实再现。
软件开发领域内所涉及到的技术内容是非常多的,不同的行业会使用不同的技术,不同的项目也会使用不同的技术,在技术选择上我们遵循实用原则:所选择的技术一定是能够解决实际工作中的实际问题的技术。课程主要内容集中在如何解决软件开发项目中所涉及到的技术工具、技术框架、开发流程和编码调试经验等方面。“不要去背诵对象有哪些方法、属性,而是要去使用这个对象去解决实际问题”。
课程内容的安排要以学习任务为中心来开展,并适当地把多个学习任务联结成一个工程项目。在每一个学习领域课程中,都采用一个实际的开发项目来组织技术内容,课上老师会通过项目的讲解来引出技术内容,而上机课要求同学自己逐步完成一个类似的项目。
在项目的选择上,在考虑到项目的实用性的同时,也尽可能地提高项目的趣味性、并加强与日常生活中遇到的问题和现象的 联系,从而帮助同学理解项目内容。
2.3 课程学习任务举例
课程体系中典型工作任务之一:开发三层结构数据库应用程序。
学习任务1:用三层结构实现不同类型用户登录考试管理系统(应用面向对象实现三层结构数据库应用程序的开发)。
子任务1:完成管理员窗体的登录。
子任务2:完成学员窗体的登录。
首先教师指导学生实现管理员窗体的登录过程,项目在三层结构的基础上具体实现步骤如下:
(1)实现业务实体层。包括新增实体层项目、添加其它项目对实体项目的引用、添加数据表对应的实体类、编写实体类。(2)设计用户界面。(3)实现数据访问层。(4)实现业务逻辑层。(5)实现表示层数据绑定。
关键技术:使用实体类消除关系数据与类之间的差别,通过将关系数据封装成实体对象,用实体对象实现三层结构中数据传递的载体。见图1。
运行完成的应用系统,首先进入系统登录窗体。见图2。
学生在数据库管理员表中找到存在的用户名及密码并输入登录窗体,选择用户类别为管理员,进入管理员窗体界面。至此完成管理员窗体的登录,学生已有了小小的成就感,接下来让学生独立完成子任务2:完成学员窗体的登录,同时培养了学生对知识的再学习能力。
学习任务2:用实体类实现教员账户创建、实现教员信息预览、编辑。
子任务1:用实体类实现教员账户创建。
子任务2:用实体类实现教员信息预览。
子任务3:用实体类实现教员信息编辑。
2.4 基于“共享型教学资源”的教学模式
创建基于共享型教学资源平台,建成以“共享型教学资源库”为核心,以“开放型教学平台”为载体,具有行业企业参与、满足广大师生自我学习和自我提高、满足服务地方经济需要为一体的具有高可用性、开放性、共享性、伸缩性和可靠性的教学资源共享、管理和服务平台。
基于“共享型教学资源”的高职教学平台能使高职院校和企业间的需求信息及时、顺利地对接,使学校能充分尊重学生职业生涯的发展需求,充分调动学生学习技术业务的自觉性,大力营造岗位成才的环境和氛围,使学生尽快适应企业的环境,实现向“社会人”和“职业人”的转变。做到学校出人才、企业用人才、学生实现岗位成才。
基于“共享型教学资源”的高职教学平台强调在线学习,重视发挥学生的主体作用,指导学生利用教学平台自主探究,引导学生进行发现学习。
教师利用平台整合教学资源,提出学习任务,引导学生学习新知识。运用自主学习与协作学习相结合的方式进行探究式学习,对任务进行交流与讨论,通过协作完成并在线提交任务。教师和企业专家给出任务评价标准,并做为课程考核的重要评价指标之一。
3 总结
浙江省教育厅厅长刘希平说:“我们应该高度重视课程开发,尤其是二次开发。我们应该鼓励和要求教师在教学过程中进行二次开发,即对已有的课程,教师应根据自己的理解、研究,针对学生的实际,进行一些教学创新。教师只有对教材有独特的理解、系统的分析,才能够把课教得生动,教得有针对性。”
本门课程的教学团队经过几年的教学实践,针对学生的实际,对课程进行了二次开发,将一个大的项目分解成几个小的学习任务,再分解成几个子任务,明确提出任务的需求和目标,给学生持续的动力、兴趣和成就感。
在项目实施过程中,根据需要进行分组,以组为单位完成任务,学生的收获既有交流中的炫耀引发的自豪感,又有互通有无、相互学习、相互补充中对知识的逐步完善。通过项目教学能够更好地促进学生实践能力和综合素质的提高。
在今后的教学中要继续完善《基于共享型教学平台》的建设,使学生通过这个平台能更好地了解企业需求,并学会自主学习,能完成平台提出的相应任务需求,为社会、企业不断创造价值,真正实现岗位成才。
参考文献
[1]北京阿博泰克北大青鸟信息技术有限公司.在.NET框架下开发三层结构数据库应用系统[M].北京:科学技术文献出版社,2008.
[关键词]项目驱动 实践应用 教学改革
[作者简介]汤海蓉(1974-),女,湖南常德人,湖南文理学院计算机学院,讲师,硕士,主要研究方向为数据库、计算机教育。(湖南 常德 415000)李锡辉(1974-),女,湖南望城人,湖南信息职业技术学院,副教授,硕士,主要研究方向为WEB应用开发,视频图像处理。(湖南 长沙 410200)
[中图分类号]G642 [文献标识码]A [文章编号]1004-3985(2012)06-0140-03
在互联网时代,JAVA语言已经是使用最广泛的编程语言之一。由于免费、跨平台、语言本身技术先进,它已经成为许多学科研究、课程和计算的首选语言。有关资料显示,IT人才属国内人才紧缺指数较高的一类,优秀的JAVA编程人员更是尤其缺乏。随着3G、物联网时代的到来,JAVA语言不仅不会“过时”,相反,它将会在新的业务领域有着更辉煌的发展前景。正因如此,目前各类高校均将JAVA作为计算机专业的主要教学语言之一,通过学习,学生可以获得一定的编程能力,锻炼自己的逻辑思维,为将来的就业打好基础。
一、JAVA语言目前教学中存在的问题
传统实践教学中,由于受诸多因素的影响,教学效果不甚理想。具体表现在:
1 教学手法单一。传统的教学是以教师、教材为中心。教师负责教,学生负责学,教材怎么写,教师就怎么讲,学生就怎么学。一般方法是教师根据大纲和教材,针对某个知识点进行重点讲授,列举若干验证性的实验加以佐证,学生亦通过上机编写一些小的算法,对课堂上的某一到两个知识点加以理解和吸收。一定程度上忽视了学生作为学习主体的存在,忽视了JA―VA语言具有极强实践性的特征,使学生丧失了学习的积极性、自主性和创造性。
2 学生对课程的难度认识不够。源于JAVA在行业中的广泛应用,许多学生初次接触JAVA,对学成之后的前景是非常期待的,因而兴趣十分浓厚,又由于有C及C++语言的基础,会认为不过是C++的向上封装。但随着学习的深入,面对大量不断涌现的各类环境配置、OOP思想、类库、乃至设计模式、架构等,繁多而枯燥,在没有实际成果激励的情况下,无法达到原来的预期,就会产生畏难心理,进而影响后续的学习。
3 实践能力差。传统教学模式下培养出的学生,被动接受知识,理论掌握得较好,也能在实验中实现一些孤立算法,各个知识点之间没有建立相关串联,一旦被要求完成一个实际的完整项目时,则会茫然得不知从何下手。更不用说运用软件工程的思想进行开发和团队合作了。
4 考核标准单一。传统教学对学生的考核是通过笔试完成的,掌握了教师所交给的课本知识,通过记忆,考试就能够取得好成绩,学校对教师的评价也基本上是看教学成绩,使部分学生产生了只要背背知识点通过考试就行、实践无所谓的错误倾向。这种重结果而不重过程。重考试成绩而不重全面发展的考核方式,不能充分地发挥出考核作为指导教学、检验学生学习能力的指挥棒作用。
以上诸多问题究其根源是学生学习动力的缺乏,解决的办法就在于激发其学习兴趣和信心,最好的途径就是能够让学生自己动手解决实际问题,让其能力得到肯定和承认,让其体会到成功的快乐,从而增强学习动力。针对于此,有必要对传统的课程教学模式进行改革,经过不断实践,笔者在教学中总结了一套行之有效的基于项目驱动的教学方法。
二、基于项目驱动的教学法
基于项目驱动的教学法是指根据大纲所规定的教学内容、教学目的和教学要求,将一个实际管理活动中与课程相关的内容,加以收集、归纳、整理,形成项目任务。依托这些资料,教师通过巧妙设计教学内容,深入浅出地讲解知识点,形象地指导学生实施理论联系实际,让学生通过完成项目来达到掌握知识的目的。学生在强烈的问题动机驱动下,通过对教学资源的主动应用,进行自主探索和互动协作,根据项目要求进行需求分析、数据库设计、代码编写以及测试,针对项目中各种实际问题,独立思考,协同探索,研究解决问题的方法,通过实践实现目标,提高概括分析问题、解决实际问题以及编程的能力。
基于项目驱动的教学目的是以学生为中心,但不是要求学生只会解释问题,而是要培养学生具有解决实际问题的能力,解决“干什么”“怎么干”的问题。强调以直接经验的形式来掌握融合在各实践活动中的最新知识、技能和技巧。在项目教学中,学生不但学习了新知识,更学会了探究解决问题的一般研究规律和方法,这为学生分析新的项目,达到举一反三的目标,打下了良好的专业基础,让其能在将来的工作中,很快进入角色。
三、具体操作
经过实践总结,笔者将项目驱动教学的过程划分成以下几个步骤,具体如图1所示:
1 确定项目。课程学习开始之初,先选取一个与学生联系较为紧密的实际项目,比如学生管理系统、网上商城等。项目的选择要求如下:(1)具有典型性、符合实际;(2)项目设计的问题具有启发性,符合教学的要求;(3)符合教学目标的需要;(4)内容的深浅应符合学生学习的需求;(5)项目的设计应体现知识的系统性和整合性。以学生管理系统为例,首先将教师在以往工作中编写的系统运行展示给学生,让其大致了解将来要求设计完成的效果,激起学生的兴趣,然后有的放矢地设计自己的目标项目。
2 任务划分及小组分工。根据软件工程的思想,以项目功能模块为单位进行小组划分,并选定小组负责人,培养团队精神。具体划分见图2。在项目的需求分析阶段,小组成员可以通过集体讨论,集思广益,给出设计方案;在设计过程中,由组长安排各成员的分工协作,确定每人所承担的任务。成员可以轮流承担各阶段的设计、编码和测试任务,使学生在过程中扮演不同的角色,培养各方面的能力,加强与他人的沟通;要求每个小组既要实现独立的子系统的功能,又应当与其他小组建立联系,最后要求整合以共同完成整个项目。
3 教学安排。在教学过程中,教师要对教材上的知识点进行重新组织和安排。不是不加选择地从头讲到尾,而是根据知识点的难易程度、实用性以及与实践项目的关系密切程度,有选择地进行讲解。由于前期已有相关课程的学习基础,比如在C++课程中已经学习了OOP的思想及相关语法知识,只需对其差异部分稍加讲解;数据库相关知识的掌握,使得学生可以较早着手分析和数据库相关的内容,进行概念结构设计和逻辑结构设计。另外,针对教材一般只定位于J2SE中的一部分基础知识,根据项目实践需要以及学生的能力水平,还需将一部分高级和扩展部分内容穿插到课堂和实践中,如网络编程、系统的逻辑架构及物理架构的设计等,以帮助学生提高项目实践能力。部分教学安排见下表:
4 过程指导。在项目进行过程中,主要依靠学生自身的能力和团队的协作,通过查阅资料及网络自主学习,以团队为单位
独立解决遇到的困难;教师亦必须全程指导、策划,协调各个子项目之间的协同进展,通过多种教学手段答疑解惑,如推荐网络版教程、Email答疑、QQ群集体讨论、定期当面探讨等,对设计过程中可能遇到的较深入的知识点进行有效学习指导,在项目的一些关键阶段进行适当的点评,并对设计过程中出现的偏差及时纠正,鼓励学生独立思考和团队协作,引导学生变注重知识为注重能力,使他们完善设计,促进自身的不断提高。
5 综合评估。学期结束,需要对完成的较完整的项目进行检查与评价。首先应由学生对自己的工作进行评定,阐述包括在项目准备、具体设计、测试过程中碰到的各种疑难问题、解决的手法以及结果如何,总结团队合作的感受,并对本组负责的模块的运行效果加以点评。教师最后进行工作总结,总结团队中各成员在设计过程中的分工和职能的完成情况,依据各组负责模块的难易程度、总体完成情况、个人对团队的贡献等因素进行综合评判,给出学生的实践能力成绩,找出差距与改正方法,并最终纳入到课程考核成绩中。最后,还应指导学生分组撰写实践报告。
6 教学效果分析。基于项目的教学实施之后,与上一学年的学长相比,本学年的学生的学习积极性明显提高,学生不仅积极完成课堂上的任务,同时也开始自主学习,积极组织及参与各种形式的讨论,课后提问明显增多,学习气氛浓厚。同时。学生开发编写的代码数量和质量有了质的提升,并对于一些较为深入的内容也有所主动涉及,如设计模式等,真正实现了“学为所用”和“学以致用”。此外,在设计过程中还培养了团队协作精神和集体荣誉感,锻炼了沟通能力和合作意识。而对于设计过程中不断出现的新问题和新思路,也促使教师加深思考,根据不同学生的不同理解补充新的教学内容,教学相长。
四、项目教学中应注意的问题
1 正确处理项目教学与传统课堂讲授教学的关系。项目教学并不能完全取代传统课堂讲授,教师对一门学科的重点和难点进行适当讲授,是教学中不能缺少的。另一方面,课堂讲授应当是诱导式的、启发式的,应与项目教学结合起来,只有把两者有机地结合起来才能取得更好的效果。因此,项目教学的优势是明显的,但也不是完美无缺的,我们应在教学中充分发挥项目教学与传统讲授各自的优势,取长补短,培养适应社会发展的实用型人才。
2 正确处理项目教学与其他教学手段的关系。在教学过程中,除了项目教学、传统讲授教学以外,还有许多其他教学手段,例如模拟实验等手段,对于学生各方面知识与技能的培养都是非常有利的。因此,在教学过程中,我们不能囿于项目教学与传统讲授两种方法,应该根据课程内容的不同特点。选择不同的教学方法,以此激发学生的学习热情。
3 项目教学对教师和学生都提出了更新、更多的要求。教师必须具备完成一个项目所需的全部理论知识和专业技能,寻找到一个能覆盖学生学习领域所涉及的全部或绝大多数内容的合适项目,必须充分收集、熟悉、掌握相关资料。并从中归纳要点,提供分析、讨论的框架,必须做大量的准备工作以应对学生可能提出的各种问题,还要求教师具有很强的调控能力。从学生方面来看,再不能像以前那样被动地接受“满堂灌”,而必须充分发挥自己的主动性,查阅大量参考资料。提前预习,发现问题,与他人合作,开展调查研究,提出解决问题的对策,运用适当的方法和手段,表达、交流、反思自己学习和设计的见解及成果。
关键词:实例操作;可视化程序设计;教学研究
中图分类号:G642.0 文献标识码:A 文章编号:1007-0079(2014)11-0163-02
可视化程序设计是学习可视化程序设计基本理论和原理的实践性、综合性、应用性很强的课程。在计算机、信息等相关专业的教学体系中,实际上存在相当多的可视化程序设计类课程,如:C#、Visual Basic、Delphi等等。这些可视化程序设计课程的宗旨是使学生了解现代程序设计理论中的面向对象编程和可视化程序设计等的基本思想,培养学生应用程序设计技术来解决实际问题的能力。本文结合该课程性质与定位分析,针对该课程传统教学中存在的问题,以强化实际动手操作能力培养为目标,探索实例操作驱动的教学方法在该课程教学中的应用。
一、课程定位与分析
教学方法是由课程性质及教学目标所决定的,无论采用什么教学方法都要紧紧围绕课程性质和教学目标展开。在探讨可视化程序设计的教学方法之前有必要对课程性质及教学目标进行分析。
1.课程性质与目标
可视化程序设计课程要求学生既要掌握理论知识,更要掌握操作技能并能在实际中应用。可视化程序设计课程集编程理论与操作实践于一身,然而课程本身的抽象性与复杂性使学生无法完全理解并有效应用所学理论知识。只有在实践中学生才能真正学会编写和调试程序,从而更好地掌握程序设计的理论知识,提高利用理论知识解决实际问题的能力。
可视化程序设计类课程由于实践性很强,所以其性质应该定位在实践性课程、操作性课程。也就是说,课程归根结底应该教会学生怎么做,让学生愿动手、能动手、会动手来实际操作,强调实践性,培养动手能力应该是第一位的。
2.实例教学
针对可视化程序设计的课程性质与目标,按照学生的认知规律组织教学,毫无疑问实例教学是一个理想选择。实例教学法已经在多个学科的教学中应用,并收到了良好的效果。丰富的教学实例能够提高学生的学习兴趣,实例教学增强了课堂教学的灵活性和易懂性,极大地提高学生的学习兴趣和主动性。实例教学有利于学生理论与实际的结合,有利于培养出实用型人才。在实例教学中,教师要本着理论与实际相结合的宗旨,遵循教学目的要求,以实例为基本素材,展开教学内容,培养学生分析和解决问题的能力,加深他们对可视化程序设计理论知识的理解。在实例教学中始终坚持以用为本,将语法、命令、控件等具体使用融于实例开发过程中。以学生的已有知识为基础,按照学生的认知规律,遵循先易后难、先具体后抽象的原则,通过观看、模仿、理解、总结、提高等阶段进行教学。
3.实例与编程思想
可视化程序设计实例教学中有一个重要的阶段就是学生模仿,也就是依葫芦画瓢,照葫芦画样。毋庸置疑,编程思想对于程序开发人员至关重要,教师应该在程序设计课程中帮助学生形成和训练良好的编程思想。巧妇难为无米之炊,学生只有在具备一定量的实例编程基础之上,才能构建和形成编程思想,否则,没有较多的实际操作体验,编程思想的训练只是空谈。实例的模仿、学习与演练也有利于学生熟悉编程步骤、形成编程规范,然而编程步骤与规范并不等同于编程思想的僵化。实例教学能使学生从课堂和课后实例的反复练习中总结一般的算法,进而从算法升华为编程思想。
此外,编程思想的训练是一个系统工程,从纵向维度来看,它贯穿于可视化程序设计课程所在的整个课程体系中。可视化程序设计课程的前置课程如C/C++程序设计侧重程序设计基础与语法,同时涉及算法与编程思想,后置或关联课程如算法设计与分析等更是着重解决编程思想的问题,因而没必要将编程思想的形成和训练毕其功于一役,完全集中在可视化程序设计课程中,尽管这一点在该课程中必要而且十分重要。因为学生有了编程思想以后就可以遵循编程规范来指导自己的编程过程,能独立完成编程任务了。
二、传统的多媒体教学不足
教学过程是对教学思想和教学方法的具体体现。可视化编程语言教学基于面向对象的编程机制,它继承了顺序程序设计的思想,重点讲述类、对象、控件的方法、事件与属性,在教学中以多媒体教学为主,以体现可视化程序设计对控件等对象操作的特点,问题的关键在于如何借助多媒体实施可视化程序设计课堂教学。传统的多媒体课堂教学方法包括以下三种:
方法一:课堂借助多媒体投影主要讲授可视化编程理论知识,较少加入实例项目到课堂中。可视化程序设计实践性非常强,并且可视化程序设计理论知识抽象性和复杂性强,缺少实例将很难保证课堂讲授效果。
方法二:课下在课件中编写实例代码,课上利用多媒体投影展示代码。教师课前将代码放在幻灯片上,在课堂上将含有代码的幻灯片打开,直接展示给学生,甚至教师还针对代码做一些必要的讲解。该方法无法直接运行程序,缺乏程序结果的可见性,并且学生也看不到项目或解决方案的详细建立过程。
方法三:课下利用开发环境建立好实例,课上利用多媒体投影展示实例并演示。该方法相对方法二来讲,可以直接运行出程序结果,增加了一定的趣味性和直观性。缺点仍然在于学生看不到项目或解决方案是如何建立的。
以上的这些教学方法,学生需要自己琢磨详细操作过程,其结果是不少学生因为实例操作步骤不清晰而花费了很长时间也没能成功编程完成实例。多次这样的经历就使得这些学生对可视化程序设计失去了信心,自然也就对课程失去了兴趣,这样的现象在课程开始之初表现得尤为突出。
三、教学实施分析
试想,倘若人们在实际生活中需要学习一项之前从不会的技能或学做一件之前从不会做的事情,比如说学习汽车驾驶,最希望得到什么样的指导?毫无疑问,绝大部分的人都希望有人能手把手地教他这项技能或教他做这件事情。同样,经过调查,对于程序设计,尤其是可视化程序设计,几乎所有学生希望得到的也是有教师能手把手地教他如何操作。由教师一对一实实在在手把手来教所有学生,在课堂教学甚至实验教学中实际实施起来具有很大的难度,尤其是在学生人数较多的情况下。事实上,手把手的教学过程可以由展示实例详细操作过程来近似替代。于是,实例的详细操作过程的展示就成为基于实例的教学方法的至关重要的一环。
1.展示实例操作过程
如何展示实例的详细操作过程?现场开发实例是一个直观的选择,这其中包括两种做法。第一,现场利用开发环境建立实例及编写代码,利用多媒体投影展示。[1]该方法将完整建立过程展示给学生,但现场编写代码费时,讲授课堂内容效率较低。第二,课下编写实例代码,现场利用开发环境建立实例,利用多媒体投影展示。该方法将完整建立过程展示给学生,并且期间直接粘贴课下已编写好的代码,相比第一点提高了课堂教学的效率。这两种现场建立实例项目的方法在项目简单、代码量少的情况固然能取得一定效果,但毕竟即使是具有丰富开发经验的教师,在课堂上现场开发实例也可能遇到意料之外的程序错误,甚至数次调试都无法成功解决。其直接结果就是一直卡在出错处,课程无法继续进行,浪费了大量的课堂时间,最严重的后果可能导致学生对教师失去信心。事实上,任何编程者都无法保证在遇到每个程序问题时都能迅速解决。
实例的详细操作过程的动画录制与展示看似是对现场开发实例的一种互补,但它是相比现场开发实例更为可取的一种做法。教师课前进行实例操作过程的动画录制,准备课堂实例的动画演示课件,演示课件主要包含实例的详细操作全过程录像,也可以加上必要的文字甚至语音解说。实例操作过程的录制通常可以借助屏幕录像类的软件,比如屏幕录像专家、RoboDemo等来完成。学生可以下载这些演示课件并对实例进行模仿操练,这样就使得教师实际编程的过程可以回放,课堂的实例教学得以延续。
2.实例的准备
实施实例教学前要进行充分的准备,实例教学的成败与准备充分与否关系紧密,要有充足的准备时间,而且要认真思考学生的学习兴趣点。要对学生的己有的知识水平和能力进行调查和了解分析,也就是要了解学生已有的计算机知识水平和对面向对象程序设计的了解程度,只有这样才能在具体内容的讲解和实例的选择演示方面有所把握。
实例的选取是实例教学的关键环节,由于实例教学是以实例展开的,实例选取的好坏直接影响到教学的效果及质量,所以要精心选编实例。实例选择时要注意:[2]第一,实例要精。实例选取要有针对性、典型性和代表性,紧扣教学重点、难点、编程理论进行选编,这种实例的教学有助于达到举一反三的效果。第二,实例要实。实例选取不仅要从学生的实际情况出发,还要从实际生活出发,既要体现教学目的和要求,也要反映实际生活的需求,更要能提高学生的学习兴趣。实例的选取除了选择教材上的典型实例外,可以由教师自己编制一些源自于实际项目的更为实际的例子。
3.课后及时操练
实例教学实施过程中,课后操练这一环节是非常重要的,它是让学生理解掌握可视化程序设计理论、培养解决问题能力的主战场。学生观看了实例的详细操作过程后,只有反复模仿、操练,才能理解、总结,并进行实例的拓展,获得能力的提高。操练的实例一方面来源于课堂上讲解的实例或教师录制好的实例,另一方面来源于接近但超越这些实例的作业,这些题材包含了对实例的分层次拓展与完善。此外,教师有必要设计良好的类游戏规则激发学生对于实例操练的兴趣,自觉地去实施这一过程,这些规则比如有积分动态排行榜等。教师也可以借助自己创建的教学论坛解决学生在完成作业和学习过程中遇到的问题,并在论坛上开展关于可视化编程学习的讨论,激发学生的学习兴趣,培养学习氛围。
四、总结
实例操作驱动的可视化程序设计教学方法强调实例教学,并且着重展示实例的详细操作构建过程,目的在于教会学生怎么做,让学生愿动手、能动手、会动手来实际操作。在这种教学方法中,学生可以获知编程任务如何下手,也能成功地完成编程实例,给其可视化编程奠定良好的起步,极大激发了学生的学习兴趣,提高了学生的学习主动性与积极性。在教学实施中教师本着实而精的原则准备好实例,包括花功夫精心选取、编制实例,认真细致地进行实例详细操作过程的动画录制,给学生模仿操练、拓展提高打下良好的基础,使课堂教学得以延续。学生课后针对实例和作业及时操练、巩固所学,也就不仅能掌握可视化编程理论知识,还能扎实地培养动手能力,培养应用可视化编程解决实际问题的能力。实例操作驱动的可视化程序设计教学基于实例操作的详细展示,突破课堂教学的时间与空间限制,融教、学和做为一体,提高了教学实效。
参考文献: