前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇程序设计论文范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
一、前言
Windows提供强大的功能以及友好的图形用户界面(GUI),使得它不仅广泛的用作管理事务型工作的支持平台,也被工业领域的工程人员所关注。但Windows3.1并非基于优先级来调度任务,无法立即响应外部事件中断,也就不能满足工业应用环境中实时事件处理和实时控制应用的要求。因此,如何在Windows环境中处理外部实时事件一直是技术人员尤其是实时领域工程人员所关注的问题。目前已有的方法大都采用内挂实时多任务内核的方式,如Windows下的实时控制软件包FLX等,而iRMX实时操作系统则把Windows3.1当作它的一个任务来运行。对于大型的工程项目,开发人员可采用购买实时软件然后集成方式。
对中小项目,从投资上考虑就不很经济。如何寻找一种简明的方法来处理外部实时事件依然显得很必要。
本文首先阐述Windwos的消息机制及中断机制,然后结合DPMI接口,给出一种保护模式下中断程序的设计方法,以处理外部实时事件。经实际运行结果表明,该方法具有简洁、实用、可靠的特点,并同样可运行于Win95。
二、Windows的消息机制
Windows是一消息驱动式系统,见图1。Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。
Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中。应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必需经历上述过程。值得注意的是消息的非抢先性,即不论事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。
图1
三、Windows的保护模式及中断机制
1.Windows的保护模式
保护模式指的是线性地址由一个选择符间接生成的,该选择符指向描述表中的某一项;而实模式中则通过一个段/偏移量对来直接寻址。80386(486)CPU提供的保护模式能力包括一个64K的虚拟地址空间和一个4G的段尺寸。Windows3.1实现时有所差别,它支持标准模式和增强模式。标准模式针对286机器,不属本文探讨范围。增强模式是对386以上CPU而言,Windows正是使用保护模式来打破1M的屏障并且执行简单的内存保护。它使用选择器、描述器和描述器表控制访问指定内存的位置和段。描述器表包括全局描述器表、局部描述器表、中断描述器表。保护模式与实模式有许多不同。其中显著的差异是访问内存的机制不同。
2.中断机制
(1)实模式中断
为了便于理解,我们先回顾实模式中断。
在实模式下,中断向量表IVT起到相当重要的作用。无论来自外部硬件的中断或是内部的软中断INTn,在CPU中都产生同样的响应。
①CPU将当前的指令指针寄存器(IP)、代码段寄存器(CS)、标志寄存器压入堆栈。
②然后CPU使用n值作为指向中断向量表IVT的索引,在IVT中找出服务例程的远地址。
③CPU将此远地址装入CS:IP寄存器中,并开始执行服务例程。
④中断例程总以IRET指令结束。此指令使存在堆栈中的三个值弹出并填入CS、IP和标志寄存器,CPU继续执行原来的指令。
(2)保护模式中断
保护模式中断过程与实模式中断过程类似,但它不再使用中断向量表IVT,而使用中断描述符表(IDT)。值得一提的是,Windows运行时IVT还存在,应用程序并不使用它,Windows仍然使用,但含义已不同。
①IVT结构:IVT在RAM的0000∶0000之上,占据开始的1024字节。
它仍然由BIOS启动例程设置,由DOS填充到RAM中。
②IDT中断描述符表:保护模式下,Windows操作系统为实现中断机制而建立的一个特殊表,即中断描述符表IDT。该表被用来保存中断服务例程的线性地址,它们是真正的24位或32位地址,没有段:偏移值结构。中断描述器表最多可含有256个例程说明,详细说明请见【3】。I
DT结构见图2。
图2
③当中断或异常发生时,处理过程与实模式类同。当前的CS∶IP值和标志寄存器值被存储。保存的内容还包括CPU其他内部寄存器的值,以及目前正在被执行的任务的有关信息(若必须发生任务切换的话)。CPU设法获取中断向量后,以它为索引值,查找IDT中的服务例程远地址,接着将控制转移到该处的服务例程。这是与实模式转移到IVT的不同所在。保护模式使用IDTR寄存器分配和定位内存中的IDT中断描述符表。IDT在内存中是可移动的,与IVT固定在内存中刚好相反。IDT中断描述符表在Windows中起决定性的作用。理解了Windows下保护模
式的中断机制。有助于我们理解中断服务程序的设计,它的关键就在于如何将服务例程的地址放入IDT中断描述符表中。当中断发生时,如何将断点地址及CPU各寄存器值保护起来;中断结束时,如何将保护的值恢复。Windows系统本身并不提供实现上述功能的API,而DOS保护模式接口DPMI正具备了上述的功能。
下面我们首先介绍DPMI接口,然后基于它实现Windows下中断服务程序的设计。
四、DOS保护模式接口DPMI
Windows除了标准服务外,还支持一组特殊的DOS服务,称为DOS保护模式接口DPMI,由一些INT2FH和INT31H服务组成。它使应用程序能够访问PC系列计算机的扩充内存,同时维护系统的保护功能。DPMI通过软件中断31h来定义了一个新的接口,使得保护模式的应用程序能够用它作分配内存,修改描述符以及调用实模式软件等工作。
Windows为应用程序提供DPMI服务。即Windows是DPMI的宿主(host),应用程序是DPMI的客户(client),可通过INT-31H调用得到DPMI服务。INT-31H本身提供多功能。其中它的中断管理服务允许保护模式用于拦截实模式中断,并且挂住处理器异常。有些服务能够和DPMI宿主合作,以维护应用程序的虚拟中断标志。
可以用INT31H来挂住保护模式中断向量,以中断方式处理外部实时事件。利用INT31H,功能0205H:设置保护模式中断向量,将特定中断的保护模式处理程序的地址置入中断向量里。调用方式:AX=0205H,BL=中断号,CX∶(E)DX=中断处理程序选择符:偏移值。返回:执行成功CF=清零,执行失败CF=置位。
挂住/解挂中断向量的时机很重要。主窗口第一次被创建时会传送它WM-CREATE消息,这时是挂住中断向量的最好时机。退出时需解挂向量,否则Windows可能崩溃。主窗口接收到WM-DE-STROY之后进行解挂工作,是最适合的。解挂向量可先用INT35H,0204H功能将老的中断向量保存,退出时用INT35H,0205H恢复。
五、编程实现
有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台BC3.1/BC4.5,其本身支持0.9版的DPMI,无需运行其它支持DPMI的软件。编程语言C,可与C++混合编译。
初始化COM1,9600波特率,每字符8bits,1个停止位,中断接收,查询发送。
//windowsasycommunication
//byLiXiuming
//lastmodifiedonJune25,1996
#include〈windows.h〉
#include〈dos.h〉
voidinterruptfarDataReceive();
voidinterruptfar(*old-vector)();
unsignedchardatacom-r[1024],datacom-s[1024];
intinflag=0;
unsignedints8259;
intInitCom1()
{//串口1初使化
s8259=inportb(0x21);//读入8259当前状态并保存
outportb(0x21,s8259&0xe8);//初始化8259,允许0x0c号中断
outportb(0x3fb,0x83);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x03);
outportb(0x3fc,0x08);//允许中断信号送到8259A,以便能中断
outportb(0x3f9,0x01);//0x01,中断允许
return1;
}
voidinterruptfarDataReceive()
{//中断接收子程序
staticinti=0;//静态局部变量
charrechar=0;//每中断一次,i自动加1
rechar=inportb(0x3f8);//从数据口读出发送过来的数据
if(inflag==0)
{
if(rechar!=s&&i==0)//帧起始
{
i=0;
gotoll;
}
datacom-r[i++]=rechar;//存入datacom-r[](通信缓冲区)
if(rechar==e)//帧结束
{
inflag=1;
i=0;
}
}
ll:outportb(0x20,0x20);//回送中断结束标志
}
//调用DPMI
//保存旧的0CH号保护模式中断向量
//设置新的保护模式中断服务例程
voidInitCom(void)
{
asm{
cli
movax,204h
movbl,0ch
int31h
sti
}
old-vector=MK-FP(-CX,-DX);//保存
asm{cli//设置新的0x0c中断服务例程
movax,205h
movbl,0ch
movcx,segdatareceive
movdx,offsetdatareceive
int31h
sti
}
InitCom1();
}
//恢复8259状态
//恢复0CH保护模式向量
voidRestoreComm(void)
{
outportb(0x21,s8259);
asm{
cli
movax,205h
movbl,0ch
movcx,segold-vector
movdx,offsetold-vector
int31h
sti
}
}
在窗口第一次被创建时会传送它WM-CREATE消息,这时调用InitCom()即可。在主窗口关闭时,即主窗口中收到WM-DESTROY消息时,调用RestoreComm()恢复原来的状态。
这样在对串口初始化,设置中断服务例程后,通信事件发生时,会立即跳入中断子程序中执行,越过系统的消息队列,达到实时处理通信事件的目的。而数据处理模块可通过全局标志flag访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的Windows通信API实现相比具有实时性强的特点,因为它超过Windows系统的两极消息机制。
上述程序已在实际系统中得到应用。在Windows3.1支持下,同时运行三个Windows任务:服务器SERVER(内有实时串行通信,多个网络数据子服务),客户CLIENT,FOXPRO数据库系统。整个系统运行良好。切换到WIN95平台下(支持0.9版DPMI),系统也运行良好。
参考文献
1张豫夫、曹建文译.【澳】BarryKauler著.Windows汇编语言及系统程序设计.北京大学出版社,1995
案例需要选取复杂程度适中,学生比较感兴趣的实例,使课堂变得生动活泼。每位同学设计自己的实施方案,鼓励大家去思考、去创造,经过老师的讲解,可以完成整个案例的实现。学生之间可以通过讨论,经验交流,互相取长补短,完善自己的案例制作。当学生完成作品时,教师应当对此次案例的实施进行总结,并且在此基础上,将问题延伸,对其进行完善或改进,根据课时情况,鼓励学生设计并实现。
2与自身专业相结合
为了提高VisualBasic程序设计的实用性,增强学生学以致用的能力,需要将该门课程与学生所学专业有机的结合在一起,这样能够使学生的学习兴趣更加浓厚,提高学习热情。以交通运输专业为例,课程开展至图形图像的使用时,可以选取红绿灯变换例题作为学生的操作案例,如图2所示。在这个案例中,与交通专业的专业知识也许还有一定的差距,但这样一个简单的实例足以吸引学生的注意力,控件要求也比较简单,代码结构并不复杂,但是需要提醒学生注意的是需要对于Image3控件需要添加具有3个元素的控件数组,来存储红、黄、绿三种颜色。类似的案例教师可以通过网络搜索或图书资料等多种方法搜集,难度不能太大,如果太复杂,反而会影响学生学习的积极性,以上就是对于非专业学生,将案例教学法应用于理论教学中的一些建议。
3程序实践教学改革
程序设计课程具有很强的实践性,在培养学生学会自己分析问题、使用计算机解决问题能力的同时提倡学生创新意识和创新能力的培养,主要采用的教学模式有项目教学法、案例分析法、任务驱动法等。
1.1《VB程序设计》课程中项目的设计
1.1.1章节项目
在整个教学过程当中,采用了“大项目、小案例、任务驱动不断”的教学模式,设计并选取与生活相联系的合理的能够调动学生学习积极性的项目。针对课程教学的最终目的,设计了一个比较完整的图书馆管理系统综合项目,但是这门课程知识点较多,要想完成这个综合项目,学生首先必须熟悉VB开发环境、掌握VB程序设计的基本概念和基础知识、各章节的知识点内容。为了配合整个课程最后综合项目的完成,在具体的教学中按照教学内容由易到难,针对教学中的重点和难点安排了13个章节项目,帮助学生更好地学习教材各章节中的知识点。项目一:由现实生活中的汉诺塔游戏、交换两个杯子中饮料的问题,引入一个利用VB程序解决两幅图片对换位置的具体案例,使学生熟悉VB集成开发环境以及各种窗口的使用、掌握常用控件对象的建立以及布局、利用VB开发简单应用程序的步骤、并初步引入程序设计思想,引导学生思考两数互换的问题,使学生通过观察、思考、总结得出两数互换的问题和两幅图片互换位置是一类问题。项目二:编写一程序,在屏幕上显示“欢迎来到VB世界!”,并输入自己的名字。使学生熟悉VB编程四部曲———界面设计、相关对象的属性设置、相关对象的代码编写、调试运行,尤其注意程序的调试过程。项目三:设计一个华氏温度与摄氏温度之间转换的程序。通过这个项目熟悉VB的数据类型及其运算,掌握VB的常用标准函数、变量以及常量的使用等语法知识点。项目四:利用输入函数输入一元二次方程的系数a、b、c,编写程序计算一元二次方程的两个实根或虚根,用输出语句输出结果。熟悉常用的输入输出控件、掌握Print方法、Inputbox()函数、Msgbox()函数和Msgbox过程的使用方法。项目五:设计一个账号和密码的输入检验程序。规范整理英文文章,即对输入的任意大小写的英文文章进行整理,规则是:所有句子开头应为大写字目(句子是以符号“?”、“.”、“!”作为结束符的),其他都是小写字母。使学生熟练掌握程序三大结构中的选择和循环结构。项目六:对一个班级的学生成绩进行输入统计,找出所有成绩中的最高分和最低分、全班成绩的平均分等。使学生掌握数组的使用。项目七:编写一个函数,在已知的字符串中找出最长的单词。假定已知字符串中只含有字符和空格,空格用来分隔不同的单词。通过该项目的学习使学生掌握过程程序的设计、实参、形参等基本概念。项目八:常用控件的使用。设计一个类似Win-dows记事本的应用程序,并完善其各项功能。通过该项目使学生掌握菜单、对话框和多重窗体程序设计。项目九:导入手机号码文件,编写一个手机选号程序,比如说选出手机尾号后四位相同的手机号码等。要求学生通过学习,掌握文件的相关操作,利用文件能够建立简单的应用程序。项目十:建立本班同学信息库,具体包括:学号、姓名、性别、出生日期、寝室电话、手机号码,并用数据控件及绑定控件实现对同学信息的浏览,并实现按姓名查询相关人员的基本信息。通过该项目掌握VB数据库的相关技术。项目十一:设计多文档应用程序,熟悉VB高级界面的设计。项目十二:用MMControl控件设计一个录音机,用API函数设计一个用户化的CD播放器。通过学习,使学生掌握VB多媒体程序设计。
1.1.2阶段项目
为了使整个学期的教学内容具有连贯性,糅合各章节零散的知识点,使教学实践具有可操作性,将整个学期的教学实践分成了三个阶段,每个阶段选用一个打破章节限制的阶段项目,使学生对所学知识内容有一个阶段性较完整的认识。这三个阶段依次是实践的开始阶段、实践的展开阶段、实践的结束阶段,分别对应阶段项目一、阶段项目二和阶段项目三。每个阶段中抓住关键教学环节,按照“大项目、小案例、任务驱动不断”的具体教学流程组织教学。阶段项目一:选用简单的项目,如蝴蝶飞舞、字幕滚动的项目。由于是初次接触计算机编程语言,所以对于非计算机专业的学生来说,这门课程的入门学习很关键,如果按照常规授课方法,依据书本上的章节内容安排依次讲授VB语言发展史、VB语言特点以及编程环境等内容的话,学生很难接受,往往是听得稀里糊涂,不知道学习VB究竟有什么实际作用,从而会产生畏难情绪,最终导致学生对VB知识学习失去兴趣和信心。为消除初学者的畏难情绪,第一阶段主要以激发学生的学习兴趣为主,让学生对VB有一个直观的认识,同时让学生在轻松的气氛中了解VB的编程环境和编程步骤,以及VB面向对象、事件驱动的编程机制。万事开头难,一旦学生对VB产生了兴趣,就有利于后续知识的学习。阶段项目二:难度稍微加大,选用计算器项目。通过本项目,一方面让学生理解控件数组的含义和设计使用方法,以及简单下拉菜单、常用数学函数的使用、过程函数的编写等,进一步加强学生对概念的理解。另一方面让学生注意可视化界面的设计,因为友好美观的人机交互界面,给人赏心悦目感觉的同时是软件的门面。阶段项目三:选用综合项目———学生信息管理系统。通过这个项目让学生真正了解掌握软件的开发过程。虽然这个项目比较难,但是有了前面知识的铺垫,会变得容易接受理解,也是对前面所学知识点的一次巩固和进一步更深入的理解,更是对前面知识的综合应用,让学生由浅入深、由易到难,逐步领会掌握编程的基本思想、基本方法和开发一个软件的完整步骤。三个阶段通过运用“大项目、小案例”,每个阶段让学生带着具体任务去学习,把枯燥的理论知识与生动形象的教学方式相结合,以清晰简明的表达方式深入浅出地向学生传授VB程序设计语言课程的知识,使学生在完成具体任务的实践过程中不断加深对面向对象程序设计思想和知识的理解。
1.2《VB程序设计》课程中的案例选取
有了已经准备好的各模块的项目,并展示给学生,学生有了兴趣后,就会想这些项目是怎么完成的,任务就落到各个模块项目里面具体的案例上了。由于VB程序设计授课内容多,授课时间紧张,按各知识模块划分选取项目后,在每个项目里面,按项目选取具体案例或是进行设计各项目的各功能模块,各功能模块实际就是一个个案例。在教学过程中应循序渐进,可以在原有案例的基础上逐步改变或增加一些条件,将应用进行引申,启发学生思维,让学生对知识点的理解更透彻,掌握各知识点之间的联系,提高学生发现问题、解决问题的能力,并在教学中兼顾学生生活经验与知识趣味性,达到事半功倍的教学效果。
1.3任务设计
围绕每一知识模块的教学内容、教学知识点,设计相关的项目,并在各个项目中采用了系列案例以及完成各功能模块的案例,为了让学生更加熟练、更好地掌握教学内容,在各知识模块的学习中设置学习情景,给学生留有感兴趣的任务,让学生去完成。同时根据各知识模块提出了单元任务,单元任务设置两个层次———基本任务和提高任务。由于学生自身水平有差异,对于基础好、学有余力的学生,要求他们不但要完成基本任务,还要完成提高任务;对于大多数学生,只要求他们完成基本任务。由于时间的限制,可以让学生在课余时间分析任务,在上机实践课以及课余时间去完成任务,最后做任务的总结。有了兴趣和任务的驱使,学生为了完成任务,就会利用各种方式和手段积极主动地去解决问题,他们会通过查阅相关书本、浏览网络资源、同学之间互相协作等方式解决问题,充分调动了学生的主观能动性,在完成任务的过程中学生分析问题、解决问题、实际开发应用程序的能力得到了锻炼,为学生知识的创新奠定良好的基础,同时知识面也更广、更大了。学生不会再觉得教学只是教师一个人的“独角戏”,而是教师和学生的“二人转”。在相互的配合以及友好和谐的师生关系中,教学顺利完成的同时学生个人的知识库也得到了构建。
2实施方法
关键词:PCI总线设备驱动程序WDM模式DriverStudio
PCI总线规范是为提高微机总线的数据传输速度而制定的一种局部总线标准。在设计自行开发的基于PCI总线的数据传输设备时,需要开发相应的设备驱动程序。通常开发PCI设备驱动程序有多种模式,在Windows2000环境下,主要采用WDM模式。本文针对自行开发的基于PCI总线的CCD视频信号传输控制卡,编写了符合WDM模式的驱动程序。
1WDM模式驱动程序
1.1WDM模式(WindowsDriverModel)
Windows2000对驱动程序的编写不再基于以往的Win3.x和Win9x下的VxD(虚拟设备驱动程序)结构,而是基于一种新的驱动模型——WDM(WindowsDriverModel)。
WDM为Windows98/2000/XP操作系统的设备驱动程序的设计提供了统一的框架。WDM来源于WindowsNT的分层32位设备驱动程序模型(layered32-bitdevicedrivermodel)。它支持更多的特性,如即插即用(PnP)、电源管理、WMI和NT事件。
1.2设备驱动程序
设备驱动程序是操作系统的一个组成部分,它由I/O管理器(I/OManager)管理和调动。Windows2000操作系统下的I/O管理器功能描述如图1所示。
I/O管理器每收到一个来自用户应用程序的请求就创建一个I/O请求包(IRP)的数据结构,并将其作为参数传递给驱动程序。驱动程序通过识别IRP中的物理设备对象(PDO)来区别是发送给哪一个设备。IRP结构中存放请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。驱动程序处理完这个请求后,在该结构中填入处理结果的有关信息,调用IoCompleteRequest将其返回给I/O管理器,用户应用程序的请求随即返回。访问硬件时,驱动程序通过调用硬件抽象层的函数实现。
1.3DriverStudio工具简介
NuMegaLab公司开发的DriverStudio是一整套开发、调试和检测Windows平台下设备驱动程序的工具软件包。它把DDK(DeviceDevelopmentKit)封装成完整的C++函数库,根据具体硬件通过向导生成框架代码,并且提供了一套完整的调试和性能测试工具SoftICE、DriverMonitor等。
2应用实例
本文利用PCI专用接口芯片PCI9052设计了一个数据传输控制卡。卡上主要的芯片有PCI9052、FIFO(CY7C4221)、CPLD(MAX7064S)和A/D转换器(MAX1197)。传输卡硬件框图如图2所示。面阵CCD得到的视频信号经过调理电路,生成的视频调理信号通过A/D转换器进行数字化处理,送入FIFO中。在CPLD的控制下,数据经过PCI9052送入PCI总线,再传送到计算机内存中,并显示在监视器上。驱动程序必须实现如下几个基本功能:(1)硬件中断;(2)能支持应用程序获取数据;(3)能根据外部FIFO(CY7C4221)的状态启动或停止突发传输。
在数据输入过程中,最重要的是对数据进行实时控制,因此需要硬件中断。在中断程序中,根据外部FIFO状态完成数据的读入。
2.1用DriverWizard生成驱动程序框架
DriverStudio中的DriverWorks软件为开发WDM程序提供了一个完整的框架。它包含一个可快速生成WDM驱动程序框架的代码生成向导工具DriverWizard,而且还带有许多类库。在用DriverWizard生成的程序框架中写入相对于设备的特定代码,编译后即可得到所需的驱动程序。
在利用DriverWorksV2.7的向导DriverWizard完成驱动程序的框架时共有11个步骤,其中关键步骤有:
(1)在第四步中选中PCI,并在VendorID和DeviceID中分别输入厂商号和设备号,还需填入PCISubsystemID和PCIRevisionID。这四项可以用网上的免费软件PCITree或PCIView浏览PCI设备,用这两个软件也可以得到BAR0~BAR5的资源分配情况和中断号。
(2)第七步IRP队列排队方法,它决定了驱动程序检查设备的方式。本设计选SystemManaged,则所有的IRP排队都由系统(即I/O管理器)完成。
(3)第九步是最关键的一步。首先在Resources中添加资源,在name中输入变量名,在PCIBaseAddress中输入0~5的序列号。0~5和BAR0~BAR5一一对应。在设置中断对话框中,在name栏写入中断服务程序的名称,选中创建中断服务程序ISR?穴CreateISR?雪,不选创建延迟程序调用DPC(CreateDPC),选中MakeISR/DPCclassfunctions,使ISR/DPC成为设备类的成员函数。
其次选中Buffer以选取读写方式,用于描述与I/O操作相关的数据缓冲区。本设计需要快速传送大量数据,因此采用DirectI/O方式。
(4)在第十步中,需要加入与应用程序或者其他驱动程序通信的I/O控制代码参量。
2.2驱动程序模块框图和代码分布
PCI设备驱动程序模块包括配置空间的访问模块、IO端口模块、内存读写模块和终端模块等。各模块之间是对等的。驱动程序模块框图如图3所示。
驱动程序初始化模块代码段放在#pragmacode_seg(″INT″)和#pragmacode_seg()之间。在系统初始化完成后,这部分代码从内存中释放,防止占用系统宝贵的内存资源。#pragmacode_seg()之后是驱动程序和系统的许多模块的实现部分。这部分在驱动程序运行后不会从内存中释放。
2.3驱动程序主要模块的实现
(1)配置空间的访问模块
DriverWorks的KPciConfiguration类封装了访问PCI设备配置空间的所有操作。首先初始化这个类的实例:
KpciConfigurationPciConfig()m_Lower.TopOfStack());
/?觹m_Lower是KpnpLowerDevice类的对象。m_LowerTopOfStack()返回当前设备堆栈顶部的设备对象。*/
初始化完后可以直接利用成员函数ReadHeader/WriteHeader函数访问所有的配置寄存器。
为了确定映射空间的类型和大小,先向目标基地址寄存器写入0Xffffffffh,然后回读该寄存器的值。如果最低位为1,表示映射于I/O空间,反之为存储空间;如果映射于存储空间,从第四位开始计算0的个数可以确定内存空间的大小;如果是I/O方式,从第二位开始计算0的个数可确定I/O空间的大小,最大为256字节。如果设备的存储空间超过256字节,要实现设备的整个存储部分的访问,就必须采用内存映射。
(2)I/O操作模块
Driverworks的KIoRange类封装了I/O端口访问的操作。部分代码如下:
{……
KIORangeDevIoPort();//创建实例
NTSTATUSstatus=DevIoPort().Initialize(pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0));
/*第一个参数为转换后的资源列表指针;第二个参数为原始资源列表指针;第三个参数中的0为I/O口对应的基地址,用来转换成特定端口资源的序数?*/
If(NT_SUCCESS(status))
{……
DevIoPort.inb(0,LineBuf1,10);
/*成功初始化后可分别用KIoRange类的成员函数inb(/outb)从端口中读/写字节*/
}
else{Invalidate();returnstatus;
/*未能初始化成功,错误信息在status中*/
{
……}
(3)内存读写模块
DriverWorks的KMemoryRange类封装了端口访问的操作。
status=m_MemoryRange().Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddressIndexToOrdinal(0));
此函数的参数、意义及具体用法与I/O端口的操作基本相同。
内存对象也用来发送控制字,以控制CPLD的开始和停止等。实际上控制字是通过PCI9052发送的。该控制字地址已被映射成PCI的内存空间。所以定义一个指向内存空间的内存对象,通过该对象即可发送控制字。
(4)中断模块
在中断模块,首先要激活PCI9052中断使能位,然后判断硬件中断响应是否产生,如果有,则进行突发传输,读入FIFO中的数据。
BOOLEANTranCard::Isr_MyIrq(void)
{if(//中断未产生)
{……
returnFALSE;}
else
{/*如果产生硬件中断,设置命令寄存器,进行突发数据传输*/
returnTRUE;}
}
为了将硬件中断与编写的中断服务程序连接在一起,采用InitializeAndConnect方法,部分代码如下:
NTSTATUSTranCardDevice?押?押OnStartDevice(KIrpI)
{……
status=m_MyIrq.InitializeAndConnect(
pResListTranlated,
LinkTo(Isr_MyIrq),
This;)
……}
2.4驱动程序的调用
编写驱动程序本身不是最终目的,最终目的是调用驱动程序管理资源,并为用户应用程序使用。驱动程序加载以后,它的许多进程处于Idle状态,实际上需要用户应用程序去调用激活。应用程序利用Win32API直接调用驱动程序,实现驱动程序和应用程序的信息交互。
首先用CreateFile()打开设备,获得一个指向设备对象的句柄。使用CreateFile函数时应注意:由于驱动程序是*.sys,所以第一个参数应该是这个设备对象的标志连接(symboliclink)。该标志连接名有一个设置数据文件搜索路径的数字号,而这个数字号通常是零。如果这个连接名是″TranCard″,则传递给CreateFile的宇符串就是:″\\\\.\\TranCard0″。例如:
HANDLEhDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL?,OPEN_EXISTING,0,NULL);
然后用DeviceIoControl()进行数据的传送。最后用CloseHandle()关闭设备句柄。
下面是应用DeviceIoControl()程序片段。
{……
m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_
RECEIVE(buffer,sizeof,buffer,NULL,0,&buffersize,NULL);
……}
2.5驱动程序的调试
采用SoftICE、DriverMonitor作为调试工具,基本调试过程如下:(1)使用symbolloader加载驱动程序,然后使用SoftICE跟踪调试,确认驱动程序正常加载;(2)对核心的中断响应程序代码,用SoftICE中的Genint命令产生虚拟中断,单步跟踪中断;(3)硬件发送大量的数据,通过查看内存的数据,确认数据传输是否正确。
西安理工大学工科非计算机专业和计算机专业虽然都开设C语言程序设计课程,但是前者具有鲜明的专业特点,对该课程的要求明显不同,仅仅按照“面向对象教学”的原则,适当调整教学组织活动和教学内容对于后者是远远不够的。针对目前工科非计算机专业C语言程序设计课程教学实践中所暴露的主要问题,笔者积极开展了非计算机专业C语言程序设计课程教学设计的教改工作。
1.1教学设计概述
所谓教学设计,就是为了达到一定的教学目的,对教什么(课程、教学内容等)和怎么教(组织、方法、媒体的使用等)进行设计。教学设计不等同于传统的备课写教案。教学设计有利于教学工作的科学化,使教学活动纳入科学的轨道。教学设计的意义就在于追求教学效果的最优化,不仅关心教师如何教,更关心学生如何学,注重将人类对教与学的研究结果和理论综合应用于教学实践。教学设计主要包括确定教学目标、组织教学内容、分析教学对象、选择教学形式和方法及教学媒体、设计教学过程、教学质量评价设计等基本环节,其中,设计教学过程是课程教学设计的核心。
1.2该课程教学设计的内容
西安理工大学C语言程序设计课程组于2003年出版了《C语言程序设计教程》及配套的《C语言程序设计教程上机实验与学习指导》特色教材。自2011年开始,非计算机专业选用的教材与计算机专业不同。目前非计算机专业选用《C语言程序设计》(第1版,张毅坤教授,高等教育出版社,2011)作为该课程的教材。非计算机专业C语言程序设计的教学设计是一项复杂的系统工程,主要包括课程教学设计、章节教学设计、课堂教学设计和实验教学设计,以西安理工大学C语言程序设计课程教学大纲为指导,以《C语言程序设计》(第1版)及其配套教材为基础,确定课程教学设计的内容:①将该课程的教学目标确定为“掌握C语言的基本语法和语义,理解结构化程序设计的思想和方法,提高学生的编程能力和调试程序的能力”。②组织教学内容的关键是进行教材的组织呈现,理论教学内容包括《C语言程序设计》(第1版)的第一章至第八章,实验教学体现于该教材的第九章及配套教材。③学生作为教学对象始终是教学过程中的重要角色,工科非计算机专业的种类多,分析教学对象就是掌握学生特点与了解专业背景并重。④重点突出课堂教学设计,传统教学与案例教学有机结合,“讲解+多媒体演示+课堂板书”缺一不可。⑤设计教学过程与“组织教学内容”联系最为紧密,主要包括课堂教学设计和实验教学设计,教学过程设计遵循的总原则是:激发学生兴趣,注重能力培养,合理安排教学顺序,讲清重点与化解难点紧密结合,课堂提高与课后巩固拓展有机统一,并预测教学实践中可能出现的意外情况。⑥将学生评价、同行评价、教学督导组专家评价、主管教学的领导评价和教师自我评价这几种评价的结果综合起来,比较客观的评价教学效果与教学质量。
2教学设计的实践及效果
我们连续多年承担非计算机专业C语言程序设计课程,先后承担过西安理工大学电气工程及其自动化(电力)、水文与水资源工程、印刷工程、包装工程和材料科学与工程等专业的C语言程序设计的理论教学和实验教学任务。始终将上述教学设计的内容贯穿于课堂教学和实验教学之中。C语言程序设计本身是一门实践性很强的课程,加之各个理工科专业的特色鲜明,所以结合学生所学专业特点与需求,同一门课程,针对不同专业的学生,适当调整教学设计内容,并在教学实践中检验教学效果。2012年以来,学生对笔者的教学评分一直在95分以上,也给予了肯定性的评价,例如“采用启发式教学,阐述问题深入浅出,重点突出,能理论联系实际或联系学科发展的新成果”;“对于您的授课方式我们很满意,感谢您对这门课程的热忱,我们会努力学下去”;等等。
3结语