线上期刊服务咨询,发表咨询:400-808-1701 订阅咨询:400-808-1721

程序设计论文8篇

时间:2023-03-14 15:05:26

程序设计论文

程序设计论文篇1

一、前言

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

DSP芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以DSP为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升DSP系统的应用价值和市场前景。将DSP技术与网络技术相结合,必须解决两个关键问题:一是实现DSP与网卡的硬件接口技术,二是基于DSP的网络通信程序设计。DSP与网卡的硬件接口技术参考文献[1]有比较详尽的论述,以下主要讨论基于DSP的网络通信程序设计。

1通信协议的制定

协议是用来管理通信的法规,是网络系统功能实现的基础。由于DSP可以实现对网卡的直接操作,对应于OSI网络模型,网卡包含了物理层和数据链路层的全部内容,因此,规定了数据链路层上数据帧封装格式,就可以为基于DSP的局域网络中任意站点之间的通信提供具体规范。因为以太网是当今最受欢迎的局域网之一,在以太网中,网卡用于实现802.3规程,其典型代表是Novell公司的NE2000和3COM公司的3C503等网卡,所以研究工作中的具体试验平台是以DSP为核心构成的以太局域网,主要用于语音的实时通信,所使用的网卡为Novell公司的NE2000网卡。NE2000网卡的基本组成请见参考文献[2],其核心器件是网络接口控制器(NIC)DP8390。该器件有三部分功能:第一是IEEE802.3MAC(媒体访问控制)子层协议逻辑,实现数据帧的封装和解封,CSMA/CA(带碰撞检测功能的载波侦听多址接入)协议以及CRC校验等功能;第二是寄存器堆,用户对NE2000网卡通信过程的控制主要通过对这些寄存器堆中各种命令寄存器编程实现;第三是对网卡上缓冲RAM的读写控制逻辑。DP8390发送和接收采用标准的IEEE802.3帧格式。IEEE802.3参考了以太网的协议和技术规范,但对数据包的基本结构进行了修改,主要是类型字段变成了长度字段。所以,以DSP为核心的局域网内通信数据包基本格式如图1所示。

DSP读出数据包和打包从目的地址开始。目的地址用来指明一个数据帧在网络中被传送的目的节点地址。NE2000支持3种目的地址:单地址、组地址及广播地址。单地址表示只有1个节点可以接收该帧信息;组地址表示最多可以有64个字节接收同一帧信息;而广播地址则表示它可以被同一网络中的所有节接收。源地址是发送帧节点的物理地址,它只能是单地址。目的地址和源地址指网卡的硬件地址,又称物理地址。

在源地址之后的2个字节表示该帧的数据长度,只表示数据部分的长度,由用户自己填入。数据字段由46~1500字节组成。大于1500字节的数据应分为多个帧来发送;小于46字节时,必须填充至46字节。原因有两个:一是保证从目的地址字段到帧校验字段长度为64字节的最短帧长,以便区分信道中的有效帧和无用信息;二是为了防止一个站发送短帧时,在第一个比特尚未到达总线的最远端时就完成帧发送,因而在可能发生碰撞时检测不到冲突信号。NE2000对接收到的从目的地址字段后小于64字节的帧均认为是“碎片”,并予以删除。在数据字段,根据系统的具体功能要求,用户可以预留出若干个字节以规定相应的协议,以便通信双方依据这些字节中包含的信息实现不同的功能。

2基于DSP的网络通信程序设计

如果基于网络操作系统,用户可以利用一些软件对网络操作系统的支持,很容易地编写出优秀的网络通信程序,但这些程序必须依附于网络操作系统。而在DSP环境下,必须深入了解网络接口控制器(NIC)的工作原理[2],通过对网络直接编程,实现局域网内任意站点之间的通信而完全抛开网络操作系统。

DSP对网卡的通信过程控制就是DSP对DP8390中各种寄存器进行编程控制,完成数据分组的正确发送和接收。DP8390的所有内部寄存器都是8位,映像到4个页面。每个页面有16个可供读写的寄存器地址(RA=00H~0fH)。页面的选择由命令寄存器CA控制。第0页寄存器用于收发过程,第1页寄存器主要用于DP8390的初始化,第2页寄存器则用于环路诊断。DSP对寄存器的操作是将寄存器作为DSP的端口设备,其实际物理端口地址(PPA)为网卡基本I/O端口地址(BIOA)与寄存器地址(RA)之和(即PPA=BIOA+RA)。应注意的是,PPA与寄存器间并不存在一一对应关系,对PPA的读操作与写操作并不一定是对同一寄存器进行的,这种情况在第0页尤其明显。用户数据分组在DSP和网卡交互是通过网卡的数据端口实现的,既可以用DMA方式也可以用PIO方式读入数据分组或将数据分组送至网卡RAM缓冲区。在本系统中,DSP采用DMA方式对网卡进行数据读写。网卡的数据端口地址(NDPA)为网卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。

网卡通信过程控制可分为网卡初始化、接收控制和发送控制。下面分别予以讨论。

2.1网卡初始化

网卡初始化的主要任务是设置所需的寄存器状态,确定发送和接收条件,并对网卡缓冲区RAM进行划分,建立接收和发送缓冲环。具体过程请参阅参考文献[2]。需要说明的是,每一块网卡被赋予一个物理地址,以便通信站点的标识。这个物理地址存在网卡的PROM(存储地址为0000~0005H)六个单元中,在网卡初始化时,通过远程DMA读入DSP内存中,并送入网卡物理地址寄存器。在一步的意义在于:一方面,如果能正确读出网卡的物理地址,则说明网卡硬件基本没有问题,网卡的上电复位和DSP对网卡的初始化顺利通过;另一方面,这个物理地址可以用于DSP网络系统中的点名、包的过滤丢弃等服务,也就是说,在链路层根据数据帧携带的源地址和目的地址确定数据报从哪里来,是否接收或丢弃。网卡初始化时另一个重要的工作就是接收缓冲环的设置,为了有效利用缓冲区,NIC将接收缓冲区RAM构成环形缓冲结构,如图2所示。

接收缓冲区RAM分成多个256字节的缓冲区,N个(N最大为256)这样的缓冲区通过指针控制链接成一条逻辑上的缓冲环。缓冲环的开始页面地址存入PSTART寄存器,环页面结束地址存入PSTOP寄存器。PSTART和PSTOP确定了接收缓冲环的大小和边界。为便于缓冲环读写操作,还需要2个指针:当前页面指针CURR和边界指针BNRY。CURR确定下一包放在何处,起着缓冲环写页面指针作用;BNRY指向未经DSP取走处理最早到达的数据包起始页面,新接收的数据包不可将其覆盖,起着缓冲环读页面指针的作用。也就是说,CURR可以告诉用户网卡接收的数据分组当前放到了什么位置,而BNRY则用于确定DSP读缓冲环到了什么地方。由于接收缓冲区为环形结构,BNRY和CURR相等时,环缓冲区可能满也可能空。为了使NIC能辨别这两种状态,规定当BNRY等于CURR时,才认为环缓冲区满;当缓冲区空时,CURR比BNRY指针值大1。因此,初始化时设置:BNRY=PSTART,CURR=PSTART+1。这时读写指针不一致,为了保证正确的读写操作,引入一软件指针NEXTPK指示下一包起始页面。显然,初始化时NEXTPK=CURR。这时,缓冲环的读指针对NEXTPK,而BNRY只是存储分组缓冲区的起始页面边界指示,其值为NEXTPK-1。

2.2接收控制过程

DSP完成对DP8390的初始化后,网卡就处于接收状态,一旦收到分组,就自动执行本地DMA,将NIC中FIFO数据送入接收缓冲环,然后向主机申请“数据分组接收到”中断请求。DSP如果响应中断,则启动网卡远程DMA读,将网卡缓冲区中的数据分组读入学生机存储区,然后对接收缓冲环CURR、NEXTPK、BNRY指针内容进行修改,以便网卡能从网上正确接收后续分组。DSP响应网卡接收中断后,接收控制过程如下:

①设置远程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。

②设置远程DMA操作的字节数,这个长度在46~1500字节范围内根据具体要求自己确定。

③0AH送命令寄存器CR,启动远程DMA读。

④从网卡数据端口依序读入数据分组,注意,最先读入的4字节非数据分组内容,第1字节为接收状态,第2字节为下一包页地址指针,3与4字节为接收字节数。第2字节内容应该送入Nextpk,其它字节根据用户要求处理。

⑤修改边界指针BNRY=Nextpk-1。

⑥清除远程DMA字节数寄存器RBCR0和RBCR1。

2.3发送控制过程

DSP先执行远程DMA写操作,将内存中的数据分组传至网卡发送缓冲区,然后启动发送命令进行数据分组发送。发送控制过程如下:

①设置远程DMA的起始地址为网卡发送缓冲区起始地址;

②设置远程DMA操作的字节数;

③12H送命令寄存器CR,启动远程DMA写;

④依序送出数据分组至网卡发送缓冲区;

⑤清除远程DMA字节数寄存器;

⑥设置发送字节数寄存器TBCR0和TBCR1;

⑦12H送命令寄存器CR,启动数据分组发送。

3发送方发送频率的控制

发送方发送频率的正确控制主要保护两点:一是有一个最小发送时间间隔,否则会因为接收方不能及时接收而导致系统瘫痪;二是发送频率能够足具体的功能实现要求。譬如在语音的实时通信中,发送频率就取决于声卡的采样频率。在8kHz采样频率时,声卡每秒钟采样8000字节,采用1024字节需用时128ms,如果通信协议规定发送1次传送1024字节有效数据,则必须每128ms发送一次才能保证缓冲区有新数据待发送,也才能保证接收方有新数据播放。128ms是一个理论计算数值,在实际的操作中采样速度和发送频率之间总是不能完全匹配,而存放数据的缓冲区大小是有限的,如果没有良好的控制技巧来实现正确发送,就会造成声音抖动和延时。解决的办法是双缓冲技术和双指针控制,并且根据采样速度和发送频率之间的匹配情况送入不同的发送通信进行处理后发送。正确发送的含义有两方面,一是每次发送的都是新数据,二是能满足接收方总在播放新数据的需求。

4接收方防止数据包的丢失

由于DSP通过中断请求判断是否有数据分组到来,如果中断繁忙而两个数据包到来时间相差非常短,DSP有可能只响应一次中断,从而导致丢包的发生。分析网卡接收数据过程,当网卡收到数据分组时,首先执行本地DMA,将NIC中FIFO数据送入接收缓冲环,并将本地DMA操作的起始地址存放在当前页寄存器(CURR)和当前本地DMA寄存器(CLDA0、CLDA1)中,DSP从网卡接收缓冲环读出数据到存储器则称远程DMA操作,用软件指针Nextpk来指示远程DMA的起始页面。因此通过比较网卡本地DMA和远程DMA的当前地址,即在中断服务子程序中比较CURR和Nextpk指针,或比较CLDA0、CLDA1和Nextpk指针,就可以保证当前数据分组放到了哪里就读出到哪里,从而防止丢包的发生。

程序设计论文篇3

windowsnt是一个功能全面的操作系统,具有完全集成式的连网能力,它的网络模型开始于mac子层,网络接口卡(networkinterfacecard以后简称网卡或nic)驱动程序驻留在其中。通过相关的网卡把windowsnt与网络连接起来,但一直到80年代后期,许多传输协议的实现受限于mac层接口的独特实现,因为mac层定义了协议与网卡之间的转换机制。

1989年,microsoft和3com两公司提出了一个定义mac层与osi模型高层协议驱动程序之间的网络设备接口规范(networkdeviceinterfacespecification:ndis),ndis给数据交换提出了一个灵活的环境,它规范了软件接口──称为ndis接口,传输协议可用它与网卡驱动程序进行通信。因此在windowsnt环境下开发核心态网卡驱动程序应遵循ndis规范。

对于高速网络fddi(fiberdistributeddatainterface)网卡驱动程序还需要smt(stationmanagement)站管理功能的实现,否则将不能作为一个fddi站连入环结构中,只能实现点到点间的数据通信。故有必要将smt软件移植到网卡驱动程序中,这将又导致对miniportnic驱动程序编程框架的破坏,于是有必要形成fddi网卡驱动程序(包含smt)与windowsnt操作系统的良好接口──由逻辑网卡的注册和mac层驱动程序的初始化来完成。

所以,本课题旨在深入研究应用microsoft公司的ddk(devicedriverkit)将smt移植于windowsnt的fddi网卡驱动程序过程中如何注册miniportnic驱动程序。即怎样正确注册逻辑网卡和mac驱动程序的初始化。着重讨论与初始化相关的上边缘函数的使用和调用关系以及初始化过程中遇到的各种问题的具体解决。

第一章windowsnt环境下fddi网卡驱动程序

总体结构介绍

第一节windowsnt网络结构

§1.1.1windowsnt网络体系结构

windowsnt的网络体系结构是基于国际标准化(iso)制定的标准模型──开放式系统互连(opensysteminterconnection:osi)参考模型分层建立的,这种方式有利于随时扩展其它功能和服务。

windowsnt网络模型开始于mac子层,网卡驱动程序就驻留在其中。它通过相关的网卡把windowsnt与网络连接起来,图中的多个网卡表明在一台运行windowsnt的计算机上能使用多种网卡。

这一网络体系结构包括两个重要接口──ndis接口与传输驱动

程序接口(tdi)。这两个接口把两个层隔离开来,办法是相邻的部件只允许按单一的标准来写,不允许多重标准。例如一个网卡驱动程序(在ndis接口的下面)就不需要特地按每个传输协议来写它的代码块,恰恰相反,该驱动程序是写给ndis接口的,它通过符合ndis的相应传输协议来请求服务。这些接口包含在windowsnt的网络体系结构中,以容纳可移植、可互换的模块。

在两个接口之间,是传输协议。它在网络中起着组织者的作用。一个传输协议规定了数据以何种方式呈递给下一个接收层,以及如何对数据相应地进行打包。它通过ndis把数据传给网卡驱动程序,并通过tdi把数据传给转发程序(redirector)

tdi之上是转发程序,它把本地的网络资源申请转送给网络。

为了能和其他厂商的网络互连,windowsnt允许有多个转发程序。对于每一个转发程序windowsnt计算机必须也有一个相应的供应者(provider)(由网络厂商提供)。多供应者路由选择程序决定适当的供应者,然后借助于供应者,对应用请求到相应的转发程序做出选择。

§1.1.2windowsnt网络驱动程序

windowsnt支持两种类型的网络驱动程序

传输驱动程序

实现数据链路层中的逻辑链路控制子层协议和传输层协议。向下与ndis接口,向上与tdi接口。

网卡驱动程序

实现对物理层的管理和数据链路层中介质访问控制子层协议,通过ndis向下管理物理网卡,向上与传输驱动程序通信。

§1.1.3windowsnt网卡驱动程序

windowsnt环境下的网卡驱动程序也分为两种:

miniport网卡驱动程序:miniport驱动程序只须实现与网络硬件相关的操作(包括发送和接收)。而所有底层网卡驱动程序的通用操作(如同步),一般由ndis接口程序来实现。

full网卡驱动程序:full网卡驱动程序必须实现所有硬件相关和同步、排队等操作。例如full网卡驱动程序为了响应数据接收,需要保持本身的捆绑信息,而miniport就可以由ndis接口库来实现。

在windowsnt的早期版本中,full网卡驱动程序要求开发者实现许多底层操作,来处理多处理器的核心问题以及处理器、线程的同步,这样不同的开发者在大量重复着许多相同的工作。

而miniport网卡驱动程序允许开发者仅仅写一些与网络硬件相关的代码即可,而那些通用的函数由ndis接口库来实现,这样开发出来的驱动程序减少了不必要的工作。

第二节miniport驱动程序的结构

ndis接口规范了网卡驱动程序的实现,同时也对tdi驱动程序的实现提出了一定的要求,在nt中,ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系如下图所示:

图2.0ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系

miniport驱动程序包括驱动程序对象、驱动程序源代码和ndis接口库代码。windowsntddk提供ndis.h作为miniport驱动程序的主要头文件,定义了miniport驱动程序的入口点、ndis接口库函数和通用数据结构。

上边缘函数的作用是网卡驱动与ndis接口库进行通信,而下边缘函数是tdi协议驱动程序与ndis通信的手段。

§1.2.1miniport网卡对象

ndis用一个叫做逻辑网卡的软件对象来描述系统中的每块网卡,而逻辑网卡与windowsnt设备对象的通信由i/o子系统来管理,描述网卡的设备对象包括相关的网络信息如名字、网络地址和网卡内存基地址等,它还包含与硬件相关的驱动程序状态数据(捆绑数目,捆绑句柄,包过滤数据库等)。ndis分配一个句柄到miniportinitialize这个上边缘函数的一个结构中,然后miniport网卡驱动程序将在以后提供这个句柄来给ndis调用,这个结构一直被ndis保持,并且对miniport驱动程序不透明。

当miniport网卡驱动程序初始化一块网卡时,它创立自己的内部数据结构来描述网卡,记录需要它管理的与设备相关的状态信息。当miniport网卡驱动程序调用ndismsetatttibutes或ndismsetattributesex两ndis库函数时,它传递一个句柄给这数据结构。这样,当调用miniport驱动程序入口点时,它就传递这个句柄来验证驱动程序所对应的网卡的正确性。这个数据结构为miniport网卡驱动程序所拥有并维护。

§1.2.2网络对象标识符

miniportnic驱动程序还需要维护一组对象,这些对象是系统定义的对象标识符(objectidetifier:oid)来标识,以描述驱动程序的性能和当前状态信息。为查询这些信息,上层驱动程序调用ndisrequest向ndis接口库指示oid。oid表示了调用所需的信息类型,如miniport驱动程序所支持的lookahead缓冲区大小等。ndis接到上层驱动程序的查询请求,将oid传递给上边缘函数miniportqueryinformation实现对oid的查询,如果上层驱动程序请求改变状态信息则调用miniportsetinformation实现对oid的设置。

§1.2.3miniport网卡驱动程序代码

典型的miniportnic驱动程序必须有一些函数来通过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:中断屏蔽。

另外,每个网卡驱动程序必须有一个初始化入口点,由driverentry函数实现,它和系统相关,由操作系统在装入驱动程序时调用,主要完成初始化ndiswrapper,再由wrapper初始生成驱动程序管理块并完成相应各种初始化工作,登录网卡驱动程序所有上边缘服务入口点,同时写入ndis版本信息。

§1.2.4ndis接口库

ndis接口库包括在ndis.sys中,它是一个核态函数库,有一套抽象的函数,无论协议驱动程序还是nic驱动程序都连接到这个库中,以实现上下层之间的操作。

第二章fddi网卡驱动程序的加载和运行

第一节网卡驱动程序的安装

windowsnt网卡驱动程序安装的目的是实现网卡相应硬件信息和驱动程序在windowsnt注册库中的注册,使windowsnt能够正确识别网卡,了解所必需的软硬件信息并能在windowsnt启动时加载相应驱动程序。

网卡驱动程序安装时,首先在主群组的控制面板中选择“网络”,然后添加网卡,指定相应信息文件──oemsetup.inf的路径,以完成以下两个必要的操作:

复制驱动程序到相应的系统目录(windowsnt根目录\system32\drivers\)中;

在windowsnt注册库中存入相应软硬件信息。

下面主要以fddi网卡为例介绍安装驱动程序所必需的工作:

§2.1.1网卡一般硬件参数

对于fddi网卡,必须在编写其oemsetup.inf文件时确定以下硬件参数:

总线类型:pci(5)……括号中的数字5表示pci总线在ndis中的总线类型代码;

厂商代号:0x5588……系统加载时确定网卡的标记,也是编程时确定pci槽号的标识;

cfid:0x01;

介质类型:光纤(3)……括号中的数字表示光纤在ndis中的介质类型代码;

是否支持全双工:支持。

对于其它的硬件信息在此inf配置信息文件中可有可无,如若配置,则可在驱动程序的编写时利用这些信息,方便编程,同时有利于其它应用对其参数的确定和使用。

§2.1.2fddi网卡加载时需在注册库登录表里做的网络配置

网卡驱动程序的安装通常将创建登录表中的四个不同子键:

softwareregistrion键,对应于驱动程序,存在于hkey_local_machine\software\company\productname\version中。我们的fddi网卡驱动程序所对应的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

网卡的软件登录键,存在于hkey_local_machine\software\microsoft\windowsnt\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/pciadaptercontroller

installdate=……

……

refcount=0x01

servicename=yhfddi

softwaretype=driver

title=yhfddi/pciadaptercontroller

而且在yhfddi驱动程序相关的netrules子键下,这些值项为:

bindable=yhfddidriveryhfddiadapternonexclusiver

bindform=“yhfddisys”yesnocontainer

class=reg_multi_sz“yhfddidriverbasic”

infname=oemnad1.inf

type=yhfddisysndisdriveryhfddidriver

use=driver

yhfddi网卡在如下路径的networkcards子键里介绍:

hkey_local_machine\software\microsoft\

windowsnt\nt3.51\networkcards\yhfddi1;

网卡的标准项包括以下这些值:

description=yhfddi/pciadaptercontroller

installdate=……

manufacturer=net612

productname=yhfddi

servicename=yhfddi01

title=[01]yhfddi/pciadaptercontroller

§2.1.3编写inf信息配置文件

guiinf描述语言被windowsnt用以书写系统所有部件的配置文件,当然也可以用以书写网络系统各部件的配置文件,该配置文件描述了网络部件安装、配置、删除的执行过程。当网络部件进行初始安装或二次安装(通常通过ncpa进行)时,安装程序读取部件对应的配置文件,进行解释执行。guiinf描述语言由节、命令、逻辑操作、变量规范、流程控制以及一套调用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.1windowsnt的启动过程

第一阶段:调入装入程序。和硬件平台相关,x86机器首先由rom装入根扇区,再由根扇区装入ntldr;

第二阶段:硬件检测。x86机器调ntdetect程序最大限度地获取各种硬件设备信息,引导hal及基本卷设备驱动程序,以便引导nt内核;

第三阶段:获取注册库中各种控制信息,如用户定义的非页内存大小;第四阶段:初始化注册库\registry\machine下system和hardware并创建currentcontrolset,为装入相关硬件设备驱动程序作准备;

第五阶段:装入基本核心驱动程序;

第六阶段:释放一些已经完成使命的装入初始数据块;

第七阶段:进一步初始化注册库,以便有些依赖于基本核心驱动程序的上层驱动程序能顺利装入;

第八阶段:服务控制器装入应该由该服务控制器装入的各种驱动程序。

§2.2.2fddi网卡驱动程序的加载过程

在windowsnt启动的第五个阶段,将加载核心驱动程序。而对于ndis网卡驱动程序是在ndis接口(ndis.sys)加载后调入运行,向ndiswrapper注册、初始化、查询设置参数等。

windowsnt启动时,相应的实体如nt的服务控制器根据注册库中yhfddi驱动程序的配置注册信息,初始化ndiswrapper,并装入相应的驱动程序,生成驱动程序管理块结构,申请内存以保存各种信息,向ndiswrapper注册驱动程序。初始化和注册完毕后,再由服务控制器读取注册库中相应的链接信息。

在ndiswrapper和yhfddi驱动程序初始化和注册成功后,ndiswrapper根据系统相应的注册信息,加入和yhfddi驱动程序所对应的fddi网卡,同时读入网卡的注册信息,并进行网卡注册和网卡初始化。

在以上过程成功后,wrapper将查询和设置驱动程序的各种参数,了解驱动程序对哪些操作支持,决定对上层驱动程序的支持范围。

第三节fddi网卡驱动程序的注册

driverentry函数是windowsntddk规定的核心驱动程序的入口点,wrapper识别到入口点后,调入驱动程序,在driverentry函数内完成两个基本注册任务:

调用ndisminitializewapper函数向ndis接口报告驱动程序将以miniport类网卡驱动程序注册。ndis建立它需要记录的驱动程序状态信息,同时返回ndiswrapperhandle,驱动程序保存这个句柄,以利后来调用ndisxxxconfiguration和initialization等函数。

填写ndisxx_miniport_characteristics属性结构,主要记录ndis版本号和驱动程序支持的miniportxxx函数的入口点,然后调用ndismregisterminiport函数实现驱动程序的整体注册。

以yhfddi为例所要注册的属性结构的内容大致如下:

ndis_miniport_characteristicsyhfddichar;

(ndis_miniport_characteristics这个结构将在第三章介绍)

yhfddichar.majorndisversion=yhfddi_ndis_major_version;

yhfddichar.minorndisversion=yhfddi_ndis_minor_version;

这两个属性决定驱动程序是ndis的哪个版本所支持,我们所用的是ndis3.0

yhfddichar.disableinterrupthandler=yhfddidisableinterrupt;

yhfddichar.enableinterrupthandler=yhfddienableinterrupt;

yhfddichar.isrhandle=yhfddiinterruptservice;

yhfddichar.handleinterrupthandler=yhfddihandleinterrupt;

以上四项属性是中断处理所需的上边缘服务函数的入口点(句柄)。fddi网卡驱动程序需要有smt站管理功能,而smt是以中断处理方式进行的,故这四项属性在fddi网卡驱动程序中是很重要的。

yhfddichar.initializehandler=yhfddiinitialize;

此项注册的是驱动程序的初始化函数句柄。

yhfddichar.queryinformationhandler=yhfddiqueryinformation;

yhfddichar.setinformationhandler=yhfddisetinformation;

这两项注册的是参数查询和设置函数的句柄。

yhfddichar.sendhanler=yhfddisend;

yhfddichar.transferdatahandler=yhfdditransferdata;

主要提供数据发送和接收函数句柄。

yhfddichar.resethandler=yhfddireset;

此项注册网卡软硬件重置函数句柄。

yhfddichar.halthandler=yhfddihalt;

此项注册网卡驱动程序挂起函数句柄。

yhfddichar.checkforhandler=null;

yhfddichar.reconfigurehandler=null;

这两个上边缘服务函数是fddi网卡驱动程序所不提供的,故置为null。

填好这些结构以后,调用以下函数实现驱动程序的注册:

ndismregisterminiport(

yhfddiwrapperhandle,

&yhfddichar,

sizeof(yhfddichar));

其中yhfddiwrapperhandle是在此之前初始化wrapper调用ndisminitializewrapper所得的句柄。

如果调用ndismregisterminiport不能返回ndis_status_success,必须在退出driverentry之前释放已经分配的资源(如yhfddiwrapperhandle等),故调用

ndisterminatewrapper(yhfddiwrapperhandle,null)。

这样驱动程序没能正确注册,亦不能正常运行。

第四节网卡驱动程序对象查询与设置

如果ndis的管理实体要查询或设置一个特定的网络对象,它必须提供一个32位的oid。oid的结构如下:图2.3.0oid结构图

由上可以看到,oid可分为三大类:

所有ndis驱动程序都有的一般对象;

特定介质的对象;

特殊的与具体实现相关的对象(如多目地址表的长度)。

一般的和特定介质的oid被记录在windowsntddk中,对于这些oidddk文本指明了相关的对象能否通过miniportqueryinformation查询参数和通过miniportsetinformation设置参数。

oid也可被分为操作特性(如多目地址表长度参数)和统计参数(如广播包接收)。最后oid可分为必须的和可选的两种。

oid的前三个字节表明oid的不同类别,而最后一个字节确定这一类别内特定的信息管理对象。

针对于fddi网卡,被查询的oid的第一个字节为0x03。而ndis所查询的介质相关参数为:

0x03010104oid_fddi_long_max_list_size

0x03010108oid_fddi_short_max_list_size

0x03010102oid_fddi_long_current_addr

0x03010106oid_fddi_short_current_addr

tcp/ip传输驱动程序所要查询的fddioid为:

0x03010102oid_fddi_long_current_addr

0x03010103oid_fddi_long_multicast_list

0x03010107oid_fddi_short_multicast_list

通过以上两阶段的查询,ndis和tcp/ip驱动程序就分别了解了网卡驱动程序对其的支持,从而进行相应的捆绑,以便数据传输时正确选择网卡驱动程序。

第五节开发环境与调试方法

开发环境:

fddi网卡驱动程序的开发环境为ntserver3.51,sdk,ddkforworkstation3.51,vc++4.1,硬件平台为586。

调试平台:

主机为ntserver3.51,windbg32

目标机为ntworkstation3.51(check944)

调试方法:

利用dbgprint把目标机上关键信息通过串口传到主机进行分析,以得出ndis驱动程序的调度机制和运转状况;

利用assert产生异常断点,由主机对异常进行控制

自定义宏,进行分级控制,以根据不同情况产生不同调试信息

第四章与smt移植相关的问题讨论

在本yhfddi网卡驱动程序中,smt的移植是极其关键的一部分,主要承担了驱动程序中硬件初始化和中断延迟处理。但由于smt是相对独立的软件,这样就有一个ndiswrapper与smt间参数传递的问题。所以本章主要讨论miniport驱动程序与smt的关系和移植smt过程中初始化的要求、中断处理的要求,ndiswrapper与smt如何传递参数。

(一)miniportfddi网卡驱动程序与smt的关系。

在第一章已经谈及网卡驱动程序主要实现osi参考模型中的物理层和mac层。而对于fddi网络的物理层又可分为介质相关子层和介质无关子层。

对于我们的fddi/pci是基于x.3.19、x3.148、x3.166和x3.229而实现的。

smt在整个iso七层模型中属低两层范畴。下图是iso模型与fddi层次的对应关系,从而可知fddiminiport驱动程序在nt网络结构中的位置。

即在windowsntfddi网卡驱动程序应包含smt,实现fddi拓扑环上的站管理。

而在驱动程序内部smt主要是在miniport驱动程序中的中断延迟处理上边缘服务中实现的,也可以说是将smt嵌入中断延迟处理程序中,实现ndis接口对smt的正确调度。

yh-fddi驱动程序的实现可分为硬件无关部分和硬件相关部分。

移植smt过程中初始化的要求.

这里的初始化主要是指硬件初始化,包括寄存器的初始化和数据结构的初始化,由smt共用的硬件相关例程库中硬件初始化部分来完成.我们在开发过程序是调用fddi_main(bdd_t*bdd)这个函数来调用smt共用的硬件相关例程库的.可见使用fddi_main(bdd_t*bdd)时,需要传递bdd这个参量,而bdd_t这个数据结构的定义如下:

它包含了各类硬件寄存器的基址,所以要对其进行正确赋值就必须首先在nt的内存中映射一块虚存与网卡内存相对应,也就实现了bdd_t结构的赋值,对fddi_main(bdd_t*bdd)的正确调用.

因此,我们在调用fddi_main前首先将网卡上寄存器内存空间映射到nt的虚存空间上,并将bdd结构正确赋值.以映射bsi_phy_base为例,具体过程如下:

pchardestination;

bdd_t*bdd;

ndis_physical_addressphysicaladdress;

ulongbaseaddress;

ndis_statusstatus;

baseadress=0x0d0000+bsi_phy_base;

ndissetphysicaladdresshigh(physicaladdress,0);

ndissetphysicaladdresslow(physicaladdress,baseaddress);

status=ndismmapiospace(

(pvoid*)&destination,

miniportadapterhandle,

physicaladdress,

bsi_phy_len

);

bdd->bsi_vir_base=(pchar)destination;

adapter->bdd->bsi_vir_base=bsi_vir_base;

/*对adapter结构中的bdd结构赋值,以便在其它上边缘函数中使用这些虚存基地址*/

中断处理要求.

对于中断处理,在smt中主要调用cspintrhandandler()来实现.我们的fddi网卡驱动程序是miniport方式的,若在isr中做此处理将占用大量系统资源,使系统崩溃,所以我们采用只在isr中进行中断的排队,而在dpc中调用cspintrhandler()来完成中断处理.

在中断处理方面还有一个中断屏蔽和中断使能的问题,这两方面smt并不提供,故我们要正确处理.

具体处理方法见第三章.

ndiswrapper与smt间参数如何传递.

miniport方式的网卡驱动程序中,网卡上有中断时,系统反映给ndiswrapper,再由wrapper调度中断处理上边缘服务实现中断处理,在我们的yhfddi网卡驱动程序的中断具体处理是smt完成的所以在调用cspintrhandler时应将adapter结构传进smt以便在以后应用.

如在处理接收中断时,处理的最后应调用ndisindicatefddireceive,向ndiswrapper指示以接收到一个数据包,而ndisindicaterfddireceive的调用需要adapterminiporthandle作为参数,这就必须一级级从中断延迟处理函数(yhfddihandleinterrupt)中将adapter结构传递下来.当然,其它方面如发送,也会有类似的问题需要考虑.

总之,对于smt的移植,需要详尽的在程序中做好接口,才能实现与

smt的数据交换.

结束语

ndis规范在网络两层间提供了一个统一界面,ndis对网络本身而言,是一个带有协议功能的标准接口,对实现者而言,它应该是一个环境,这种环境不仅带有协议功能,更重要的是带有和软、硬平台无关的核心功能支持,它不会受软、硬平台的变化严重影响,无疑,它是软件的移植和兼容的可靠保证,ndis把网络的一部分共性抽象出来,并根据具体的操作系统实现系统和平台相关的基础库以保证ndis的标准性和对开发者提供最大的功能支持,这也将加速和规范开发过程,但是,在操作系统之上提供ndis基础库获得标准同时也失去直接作用于操作系统带来的灵活性以及更强的功能支持,同时,ndis处于网络中层和低层之间,低层网络的快速发展和ndis对网络部分共性的抽象必然导致ndis对实现者的滞后,例如ddk3.51提供的ndis开发环境只支持10m以太网、fddi、令牌网(802.5)、localtalk、arcnet等,而对新出现的快速以太网及atm不提供支持,这对我们如何在ndis环境下实现诸如atm的lanemulation,ipoveratm、快速以太网带来很大问题。

smt是实现fddi网卡驱动程序的关键,然而由于应用ddk开发miniport驱动程序时要遵循其结构框架,所以要想完整地按其结构移植smt,就必须分解smt适应之,即要求对smt有一个很好的理解。但smt是庞大的给开发带来了一定的困难。

参考文献

【1】《devicedriverkit用户手册》

【2】《devicedriverkit核心驱动程序设计》

【3】《devicedriverkit网络驱动程序设计》

程序设计论文篇4

关键词:VB;程序设计;改革;实践

Abstract:VisualBasicprogrammingasapublicnon-professionalcomputer-basedlessons,theoryandpracticestrong,andteachingdifficult.Thearticleonhowtoimprovethequalityofteachingandtrainingstudentsinanintegratedapplicationdevelopmentcapabilitiesandexplorereformsweremade.

Keywords:VB;programming;reform;practice

1引言

VisualBasic(下面简称VB)程序设计是我校非计算机专业学生的必修课,然而VB语言枯燥、难以理解,学生缺乏相应的知识背景,导致学生对这门课有恐惧心理,缺乏兴趣。这就要求我们教师在教学中分析、摸索出一些较为行之有效的教学方法,才有可能培养学生程序设计能力,掌握一门技能,激发学生对程序设计的兴趣。笔者在近几年的教学实践中进行了如下改革探索,取得了良好的教学效果。

2教学改革与实施

2.1对课本原有知识进行整合,激发学生的学习兴趣

大部分的教材总是先讲VB语言的基本语法,然后再讲VB中对象的使用。但在讲授时不宜将两者分开,要把VB面向对象的程序设计方法,事件驱动的编程机制贯穿于整个教学过程中。VB中的对象主要用于构建界面,而具体程序功能的实现则要编写代码行,因此任何一个完整的应用程序都不可能只用对象或只用语法。这两块内容可进行穿插讲解。这样就避免了让学生在毫无知识背景的情况下去理解抽象难懂的概念,挫伤他们编程的积极性。在教学过程中,我始终坚持以学生已有的知识程度为基础,打破原有的以课本知识的逻辑结构为顺序组织课堂教学的模式,先不讲基本概念,改用从简单的实例人手,通过让学生观看、模仿,在实际操作中去探究和领悟这些概念,并适时地加以归纳总结,让学生在轻松愉快的气氛中接受新知识。比如,在讲到循环结构中DO——LOOP语句和FOR——NEXT语句的用法时,我用DO——LOOP语句的4种形式和FOR——NEXT语句实现求解N!的过程,让学生去观察、领悟它们的异同。

2.2教学方法多样化

笔者在教学实践中,除了采用传统的教学方法如:提问法、小组讨论法外,主要采用以下教学方法:

1)错例分析法

学生对变量、类型、运算符、表达式这些基本概念和语言规则的掌握需要一个过程,对算法和数据结构的知识需要不断积累。学习过程中,能听懂老师授课的内容,但自己编制的程序往往错误百出。课堂上,我经常将容易出错的概念以反例形式展示给学生,让他们找错误,通过运行。比如错误使用逻辑运算符。

假设a、b和c是三个变量。如果已知a<c,要判断b的值是否在a与c之间,可以使用以下表达式:a<bAndb<c

不能写成:a<b<c。

很多学生会错误延用数学上的概念,写成后一种形式。

例OptionExplicit

PrivateSubCommand1_Click()

DimaAsInteger,bAsInteger,cAsInteger

a=-3:b=-2:c=-1

Printa<bAndb<c’显示True

Printa<b<c’显示False

EndSub

为什么a<b<c会得False?因为,VB在计算这个表达式时,先计算“a<b”部分,得True;再计算“True<c”,并将True转换为一1,-1<-1?最终得False。

通过诸如此类的反例教学,使学生豁然开朗,印象深刻。

2)零散实例和核心实例结合

零散实例教学法,对每个知识点的运用和理解是非常行之有效的,但对前后知识的贯穿缺乏说服力。笔者在教学改革实践中体会到,除经典的零散实例外,将一个规模较大的、典型的、有实用价值的、学生感兴趣的核心实例贯穿于教学全过程,对提高学生的编程能力非常帮助。所谓核心实例是指,实例从小到大、随章节的展开而逐步成长,呈现为逐步进化的多个版本。比如引入一个贯串全书的问题:设计一个“图书管理系统”。首先,用最基本的概念和最简单的结构,给出该系统的第一个(也是最简单的)版本,以后的每一次课,都对该系统提出新的功能和结构上的要求,并用本次课介绍的新概念和新方法对它进行功能上的扩充和结构上的改进。每次得到该系统的一个增强的新版本。为达到设计目标,学生随着教学的进程,可以积极投入到对实例系统的调试、改进的实践中,逐渐掌握了所学的基本知识,同时也提高了编程能力。

2.3重视实践教学,培养学生综合应用程序开发能力

VB是一门实践性很强的课程,如果只纸上谈兵,不上机练习,是不可能真正掌握VB程序开发的。实践教学主要注意抓住以下几点:

(1)模仿阶段,对课堂核心实例系统的调试、改进。核心实例的每次增强版是全面反映教学内容的,学生通过模仿、知识再现达到在实践中领悟知识,开拓编程思路。

(2)分层次阶段,在教学过程实施的开始,和核心实例同步,我就给出了几个类似核心实例的课程设计内容,供学生选择。对核心实例的调试比较成功的,可以同步实施自己所学的课程设计内容,达到培养学生分析问题和解决问题的能力。对掌握核心实例有困难的学生,针对教学内容重新布置实验,强化知识巩固。课程设计内容课后上机完成。

要掌握上面两个阶段的具体情况,教师应亲自指导,与学生一起上机实验,随时监控学生实验过程。对学生提出的问题及时予以指导,而发现学生常犯的共性错误,可在理论课上进行点评。

2.4培养学生使用标准编码,养成良好编程习惯

在程序设计过程中,使用标准编码可以避免一些不必要的错误。笔者在授课过程当中使用标准编码的实例,在讲解实例过程中对学生进行适当地引导,让学生养成一个良好的编程习惯。

程序书写规范是非常重要问题,不仅书写格式应该结构层次分明,而且程序里面应添加起码的注释。不按照标准书写程序会增加别人查看程序的难度,同时也不利于自己以后上机调试修改。强调学生避免使用VisualBasic中的隐式操作,养成显式编码的习惯。比如永远使用OptionExplicit,严格执行变量先定义后使用的原则。避免使用缺省属性,明确指出是在引用对象还是在引用对象属性。

3结束语

一门课程的教学是一个复杂的系统工程,笔者将以上一些改革和探索用在课堂教学和实践教学中,取得了一些效果,但教学有法,教无定法,只要教学得法。在教学实践中,合理运用多种教学方法,灵活地、创造性地掌握教学过程,激发学生的兴趣,培养学生的创造性思维和综合应用程序开发能力。

参考文献

[1]王栋.VisualBasic程序设计实用教程(第3版).北京:清华大学出版社2007

程序设计论文篇5

1、产品语意学发展回顾和理论简介

语意(Semantic)即语言的意义,产品语意学(ProductSemantics)则是研究产品语言(ProductLanguage)的意义的学问。其理论架构始于1950年德国乌尔姆造型大学的“符号运用研究”,更远可追溯至芝加哥新包豪斯学校的查理斯(Charles)与莫理斯(Morris)的记号论。这一概念于1983年由美国的克里彭多夫(K.Krippendorf)、德国的布特教授(R.Butter)明确提出,并在1984年美国克兰布鲁克艺术学院(CranbrookAcademyofArt)由美国工业设计师协会(IDSA)所举办的“产品语意学研讨会”中予以定义:产品语意学乃是研究人造物的形态在使用情境中的象征特性,以及如何应用在工业设计上的学问。它突破了传统设计理论将人的因素都归入人机工程学的简单作法,扩宽了人机工程学的范畴;突破了传统人机工程学仅对人物理及生理机能的考虑,将设计因素深入至人的心理、精神因素。会议论文结集由《创新》(Innovation)杂志专辑出版。1985年在荷兰举办了全球性的产品语意研讨会,飞利浦公司在布莱克(BlaichRobert)的领导下采取“造型传达设计策略”而获得空前成功,展现了产品语意理论的具体应用成果。1989年夏,荷兰赫尔辛基工业艺术大学举办了国际产品语意学讲习班。由此,产品语意学被推广到欧洲。1991年毕德克在《设计——产品造型的历史、理论及实务》一书中详细介绍了产品语言和产品语意的众多论述,并指出“产品语言”是设计领域的深层知识(In-depthKnowledge)和设计的核心竞争力(CoreCompetence)。1997年,德国《form》杂志再度以产品语言为主题(OnLanguage,ObjectsandDesign),重新对产品的表现形式与诠释意义加以探讨,并提出各方见解。[1]

克里彭多夫自1984年以来对产品语意学提出了广义的陈述:产品语意反映了心理的、社会的及文化的连贯性,产品从而成为人与象征环境的连接者,产品语意构架起了一个象征环境,从而远远超越了纯粹生态社会的影响。他将产品语意划分为四个层面:1操作内容(OperationalContext):使用过程实际上是人与人工物的交互行为;2社会语言内容(SocialinguisticContext):人与人之间的交流实际是一种关于特殊的人工物、人工物的使用及其使用者之间的联系,因而人工物成为现实生活组成部分的同构;3起源内容(ContextofGenesis):设计者、制造者、销售者、使用者和其他人都参与创造和消费人工物,并在不同程度上导致文化和物质的“熵”变;4生态内容(EcologicalContext):技术和文化的自动拷贝将影响“物体系”内的交互行为。设计一种产品,也就是设计一种语言。[2]

M.Mccoy则在探讨产品造型时,则从以下五个问题进行产品语意设计。

1环境(EnvironmentalContext):产品的形态、大小、材质、色彩等应该与产品所处的自然环境和社会环境相协调;

2记忆性(Memory):一个新产品的出现,未必要创造一种全新的造型语言,而是从一些旧有形象上寻找一些大众共有的记忆,通过产品语言的连继性与熟悉性产生共鸣;

3操作性(Operation):通过控制、显示、外形、材质及色彩的明确语意及各项控制键的关系,呈现清晰、易理解的操作,以引导正确操作行为;

4程序(Process):语意设计不是要加强产品技术的神秘感,恰恰相反,产品内部不可见的机构运作,需要透过外部形态予以宣示,虽然很多新科技是无法目睹的,设计师则须面对产品内部技术运作的层面加以诠释,不只是技术上如何运作,而是使我们用心中的眼睛来设想其运作;

5使用的仪式性(RitualofUse):简洁的造型可以满足人们日常生活中简单、高效的要求,而某些仪式性的场合则需要赋予产品以或庄重或温馨或冷峻或理性的造型解说,从而完成情境设计及物体与使用者间的心理互动(PsychologicalInteraction)。

2、群体文化学与用户研究

群体文化学(Ethnography),又称人种志学、民族志学,作为文化人类学的一个分支,是描述某个社会群体和阶层文化的学科,主要通过实地调查来观察群体并总结群体行为、信仰和生活方式。[3]20世纪后半叶,很多设计研究机构及设计公司开始从社会学科中寻找信息和方法,以帮助他们来了解用户与产品之间的关系,及用户使用产品的态度。近年来,群体文化学中研究人群文化和生活形态的方法,被借鉴用于产品开发初期的用户研究,以群体人类学的视角,综合使用各种社会学研究方法来观察群体并总结群体行为、信仰和活动模式。

应用群体文化学方法于用户研究,有助于对用户多样性的全面认识,从而识别用户的相似点,进而探求存在于多样化人群中的常数,例如:用户都有相似的生理需要和根植于社会环境、文化背景、知识体系和生活经验的各种需要。通过参与用户的生活,并将其如实详尽地记录下来,可以发现设计机会的线索,从而有效解决人的多样化与产品准确命中目标用户之间的矛盾。更关键的是,它不仅是描述性的,而且是预见性的:通过对目标市场中代表性人群的深入理解,尤其是对消费者的生活方式、生活体验和产品使用的深刻理解,能够对消费者对产品功能、形态、材料和色彩以及使用和购买模式的喜好进行预测,通过观察消费者面对技术、造型和使用时的情绪和态度,从而明确产品应该具备的品质;通过了解人们本质上如何认识他们周围的世界、他们最新关注的焦点以及他们所抛弃的东西,研究团队可以获得对人们在未来几年需要、要求和愿望的变化的深入认识,从而预测消费需求的重要转变,监视市场的动态发展。[4]

基本程序与方法如下:通过问卷调查对目标群体使用产品的特定活动和背景环境有一个总的理解;对报纸、书籍、杂志、电视、广播、网站等各个媒体相关主题的资料收集,通过对二手资料进行归类、分析,提取舆论引导的关键词,分析产品发展的可能趋势;通过身体风暴(BodyStorm)观察法、深度访谈(DepthInterview)、影像故事(VideoEthnography)等方法,针对产品使用过程、使用环境、使用态度,了解个人如何看待、理解这些产品,并发现特定产品与其生活方式某一方面的行为之间的联系;通过实地考察了解产品被使用时的环境及情形以理解产品发挥作用的来龙去脉;运用相机观察法(ObservationalCamera),由参与人使用一次性相机并通过日记的形式记录他们在给定的环境中认为重要的事或物,完成“视觉日记”,这种记录可以是他们所关注的活动、一天中的亮点、或者他们喜爱的服装和颜色,从中可以发现一些鲜为人知的故事特别是用户与设计师看待同一事物的不同方式。在前期全面、详实、充分、有效的调查研究之后,就可以确定典型用户模型(Persona);并详细描述生活场景(Scenario),从中可以发现大量可进行设计创新的具体线索,从而引导后期的设计创造。

3、基于群体文化学的语意设计程序与方法

将克里彭多夫关于产品语意的内容分析与现代设计程序相结合,可以构造一个基于产品语意学的设计程序。首先,通过用户研究、背景分析和对产品的语意理解,可以发掘出产品独特的语意内容并加以深入研究,然后整合这些特色内容并加以强化,最后将那些需要赋予意义的设计内容加以发展。这个程序可以划分为研究阶段、整合阶段、设计阶段等三个阶段,设计团队通过在“质”与“量”上对每一演化阶段的意义进行较准确地把握,可以将抽象、模糊的设计意象转化为明确具体的产品形象。以下对三个阶段分别说明。

研究阶段。这是一个诱导阶段,设计团队通过用户研究寻找设计机会,并寻求对那些影响真实环境的设计内容的理解。通过问卷调查、二手资料分析,提取舆论引导的关键词,分析产品的意义来源和发展趋势,了解产品语意的起源内容和生态内容;通过“BodyStorm”观察法、深度访谈等方法,针对具体产品的使用过程和使用环境,了解用户的背景资料与其个人的行为方式、生活方式、思维方式之间的联系,寻求典型的行为、动作、态度、观念与产品之间的观念,进而理解产品语意的操作内容、社会语言内容;通过实地考察了解产品被使用时的环境及情形以理解产品发挥作用的来龙去脉,寻求意义的动线;在“视觉日记”中发现一些特点、亮点和差异点,作为产品语意分析的又有效补充。设计团队将不同层次的数据、信息、知识等转换为不同的理解:从二手资料中抽象生成意义,从用户研究中看到产品与产品、产品与人、人与人之间的关系,从用户体验和交互行为中捕捉形象。

整合阶段。第二阶段设计团队将研究阶段所获取的知识转化为设计概念。在前期全面充分有效的调查研究后,针对典型用户模型,并详细描述生活情景,并将生活情景划分为若干个使用情景,分析使用情景出现的频次和重要程度,据此深入理解目标市场中的代表性人群,尤其是其生活方式、生活体验和使用方式从而确定产品的外观、感觉、功能和使用目的,可以了解他们本质上如何认识他们周围的世界、他们最新关注的焦点以及他们所抛弃的东西,从而获取产品语意的可能来源。生活场景中的每一个情景、每一组关联,都是一次语意的发生机会。设计团队通过时间、空间、关系、程度等原则理解、比较、评估这些语意的发生点,并加以整合,从而创造出最终设计成果的一个模糊的意义。

设计阶段。第三阶段是一个演绎过程,是一个循环的认知过程。它可能由一些最初的不能理解的感觉或概念开始,不断在使用情景中那一幕幕场景、一组组关联发现呼应,进一步明确假设的内容,并围绕解释学背景循环展开。在此过程中,产品特征将在语意内容和对模型赋予的意义之间区分出来,经过不断的选择、放大、验证、排除,这些被建构出来的模糊意义的若干分枝将会聚集到一个有效、紧凑的范围,从而实现明确的理解结果。

基于抽象概念的相似性或相关性,我们很容易运用“意象联想法”展开思维的发散,这种方法的使用效果与设计者的生活经验和对相关二手资料的占有量息息相关。通过团队研究确定语意主题后,运用“主题展开法”,将主题做关联性分析,通过静态的情景分析和动态的情节联想,找出更为细致、更为简单的子主题;不断重复这个步骤,将子主题转化为意义单一的语素;然后将语素的单一意义转化为形、色、光、质;通过对语素的排列组合,将子主题转化为形体或表情,进而将主题转化为一个整体的象征物或者角色。意象联想法主要用于语意的发散和分析;主题展开法主要用于语意的发展和组合;而在在产品细节或整体形象的语意表现上,则可以运用隐喻法、象征法、用典法等多种方法。需要特别强调的是,上述这些方法在使用过程并不是割裂或矛盾的,而是多种方法的综合使用,灵感在意象的碰撞中迸发。

4、结语

时至今日,传统意义上的大众市场已然渐次消失,取而代之的是“区域文化”、“小众市场”、“文化亚群”的观点;设计便被卷入一场在大众、群体或个人之间,以价值(包括使用的、交换的、符号的)为目的却又各行其道的混乱中。语意设计的方式,也往往反映出设计者对“生活”及“文化”的细腻关怀。产品语言的运用,视其条件、架构与定位的差异,往往会侧重某项脉络功能;所以它并非以一种风格呈现,而是表达一种系统,并借此系统发展出多样化的视觉品质。对产品语意的理解,不能脱离它的社会文化脉络,某些事物的意义并不在它的表面,而与它的使用功能、环境和生活实践的联系密不可分。如果对形式与语意的联系规定得过于直接,就会使语意失去其复杂性而变得浅薄。

产品语意不再是设计师个人设计的技巧和主观概念的臆想,而是设计团队的集体智慧和知识整合。设计团队的组织结构、知识背景、管理规范等都将影响产品语意的准确获取。因此,结合用户研究、团队管理和产品语意的设计程序与方法,通过形式与内容的呼应与互补,能够将深埋于消费者、使用者意识和潜意识中的心理、文化、社会、环境等深层意义更准确投射在视觉形式上,引发他者的感知进而共鸣。

参考文献:

[1]胡飞杨瑞,设计符号与产品语意:理论、方法与应用,北京:中国建筑工业出版社,2003:116

[2](美)K.Krippendorff,OnEssentialContextsOfArtifacts,DesignIssues,MITPress,1989:9-39.

程序设计论文篇6

《网络程序设计》的教学知识点很多,也很杂,不同类型的高校在教学中采取教学方法存在很大差别,是学好网络安全、动态网页设计和网络管理等的充分条件,教学内容通常可以分为三类,一类是强调广而浅,使学生掌握最基本的程序设计,并了解网络程序设计的前景发展;一类是覆盖类,基于规范或者工具开发网站,使学生的网络知识体系和程序设计的进一步提高,这部分内容更加倾向于技能性培养;一类是覆盖第一类,此部分的教学内容更加重视于网络程序设计能力的培养。

项目教学法是理论教学和实践教学的有机组合,因此非常适合使用在网络程序设计的教学中,项目教学法旨在培养学生整合知识和经验的能力,并不断培养学生积极探索的精神,在改变教学内容和学习评估方面具有很大的优势。项目教学法改变了传统的教学模式,使学生和教师共同参与到教学中,虽然在完成项目实践的过程中,学生同样会遇到很多的困难,但是为了解决问题,很多学生会自发的查询资料,从而,课程教学变得十分生动。在项目教学中教师把课程的重点和难点都落实到了实践中,通过讨论等反馈机制及时了解学生的学习动态。

二、项目教学法的实施

1.项目教学法实施原则

项目教学法和传统教学法相比最大的区别在于把学生作为教学的中心,把项目作为教材中心,学生是认知的主体。项目教学法在实施中需要遵守以下原则,项目的选取要充分结合现实,教师在备选项目案例之前,必须先经过大量的市场调研,项目必须具有实用性、教学型和通用性,在项目的选取中必须选择学生感兴趣的,项目活动必须能够充分调动学生已学过的理论知识,能够渗透到教学中,项目的分解能够保证教学过程的连贯性。

项目教学法以学生作为主体,虽然教师是项目的设计和实施教学的负责人,但是在实践中需要教师和学生共同参与,教师有目的的引导学生进行知识的掌握。在项目教学的实施中,教师最主要的工作是创建学习的资源和协作学习的环境,在学生面对困难的时候,教师需要进行引导,并把学生分为合适的工作小组,实现分工和合作。在项目教学法应用的过程中,教师还必须确定一个多元性的评价方式,强调运行完成项目的方式。

2.项目教学法实施步骤

项目的选择。项目教学法的关键,是设计和制定一个项目的主体,项目化教学法成功首要部分就在于项目的选取。整个教学过程与内容基本来源于教师所布置的任务,因此项目的实施过程中,重要的并不是学习的结果,而是学习的过程。项目内容的选取以及情景的设置必须与所学知识和现实生活息息相关,明确目标,包括相关知识与技能的掌握。通过大量的专业实例考察,总结出网络程序设计所需的主要知识和专业素养,将所学的知识融合在一起,把典型的程序设计融入教学中,要求学生通过学习,掌握基础理论知识,能根据需求自行查找资料。在教师选取项目时为最大化的激发学生的学习兴趣,需要列出应用表单,使学生有目标地参与到项目的实施中。

选择的项目要有层次感以及典型性等,能够使学生联系自己所学知识进行发挥,教师在项目教学法实施之前需要先整理分析学生要完成的具体情况,为项目做好准备工作。从教学方法上来看,教师在项目教学法实施的过程中设置一些问题,引导学生自主性的学习。学生的个体特点以及接受能力存在很大差别,因此在布置项目的时候需要注意项目的难易程度以及学生的接受能力,不能打击到学生的自信心。项目的设计实施需要学生广泛的积极参与,最后在项目的选取中教师需要留出思考空间,启发学生不断尝试,培养学生的创新能力。

具体而言,类与对象以及输入输出流技术是项目的关键部分,在选取项目的过程中必须渗透到其中,项目必须具有实用性和可理解性,本文选取的项目为《学生档案管理系统》的程序设计。

项目的实施。把其分解为多个课内教学实验,本文的设计中共分为五个任务,每个任务都对应着学生的理论知识,前一阶段的学习是后一个任务的前提条件,具体而言五个任务分别为学生档案管理系统——对象和类的识别、学生档案管理的设计(类的封装)、学生档案管理的设计(模板技术应用)、学生档案管理的设计(继承的应用)、学生档案管理的设计(输出输入流的应用等)。使学生有一个整体的认识。在软件预览中教师需要先把制作好的《学生档案管理系统》进行展示,为学生说明学习的目的,激发学生的兴趣,在数据库的设计中,教师可以与学生共同参与到研究中,保证学生所创建的应用程序具有非常高的性能。程序设计一直是学习的重点和难点,在这部分的项目实施中,教师应重点强调课程设计方法,使学生能够熟练地掌握常用函数以及表达式的用法。

本文以第一个分解项目为例,目的是识别学生档案管理系统的类和对象,在情景设置中,先与学生回顾所学过程知识,以及要求用到识别方法,在项目的讲解中,教师需要先向学生讲解学习目的,以及常用构造函数等,通过对象用例分析,逐渐抽象出不同类,还可以采用UMI建模技术来识别类与其类的关系。学生在实践中独立思考理解知识点,在学生遇到问题时,教师可以先给予指导。学生完成项目后,教师可以当堂表扬学生,并通过批阅学生的项目代码,查找学生普遍存在的问题,在项目的回顾中,发现本设计的项目存在很多的全局函数,因此需要进行一些改进,在下阶段的类的封装中进行下一步的学习。

项目教学法的最后一个环节是项目评估,为了保证学生评估的公平公正性,教师需要先设计互评表以及自评表,表中包含具体的分数登记以及评定条目,为提高学生的责任感和自主学习性,在评估中还需要采取自评和互评,评价表需要便于学生的操作等。

三、项目教学法实施需要注意的问题

项目教学法虽然能够极大的提高学生整体规划能力以及交流能力等,但是在实践中还会出现很多问题,因此在项目教学法的应用中还需要注意以下几方面的问题。教学中教师虽然需要足够重视项目的完成,但是也不能忽略掉基本知识的掌握,必须为学生构建一个系统的全面的知识框架。

在学习小组的划分中,必须重视学生的能力,根据学生的特长和能力进行分工,每组的人数不需要太多,最好采取优势互补的方式进行学习,组员之间为避免产生依赖心理,最好先进行分工。在采取项目教学法的过程中,学生的个性能够得到极大的发挥,但是非常容易出现两极分化的情况,因此在分组中,教师一定要注意这个问题,及时对学生的不良情况进行纠正。在评估中教师需要创建一个合理的课程考核机制,把学生项目的完成过程和完成结果也添加在课程考核机制中。最后项目教学法对教师提出了一个很大的挑战,在教学中教师不仅需要指导学生本专业的知识,还需要了解相邻学科间的知识,因此教师在以后的教学中需要不断完善自己。

四、结束语

程序设计论文篇7

关键词:DSP网络通信程序通信协议网卡

DSP芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以DSP为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升DSP系统的应用价值和市场前景。将DSP技术与网络技术相结合,必须解决两个关键问题:一是实现DSP与网卡的硬件接口技术,二是基于DSP的网络通信程序设计。DSP与网卡的硬件接口技术参考文献[1]有比较详尽的论述,以下主要讨论基于DSP的网络通信程序设计。

1通信协议的制定

协议是用来管理通信的法规,是网络系统功能实现的基础。由于DSP可以实现对网卡的直接操作,对应于OSI网络模型,网卡包含了物理层和数据链路层的全部内容,因此,规定了数据链路层上数据帧封装格式,就可以为基于DSP的局域网络中任意站点之间的通信提供具体规范。因为以太网是当今最受欢迎的局域网之一,在以太网中,网卡用于实现802.3规程,其典型代表是Novell公司的NE2000和3COM公司的3C503等网卡,所以研究工作中的具体试验平台是以DSP为核心构成的以太局域网,主要用于语音的实时通信,所使用的网卡为Novell公司的NE2000网卡。NE2000网卡的基本组成请见参考文献[2],其核心器件是网络接口控制器(NIC)DP8390。该器件有三部分功能:第一是IEEE802.3MAC(媒体访问控制)子层协议逻辑,实现数据帧的封装和解封,CSMA/CA(带碰撞检测功能的载波侦听多址接入)协议以及CRC校验等功能;第二是寄存器堆,用户对NE2000网卡通信过程的控制主要通过对这些寄存器堆中各种命令寄存器编程实现;第三是对网卡上缓冲RAM的读写控制逻辑。DP8390发送和接收采用标准的IEEE802.3帧格式。IEEE802.3参考了以太网的协议和技术规范,但对数据包的基本结构进行了修改,主要是类型字段变成了长度字段。所以,以DSP为核心的局域网内通信数据包基本格式如图1所示。

DSP读出数据包和打包从目的地址开始。目的地址用来指明一个数据帧在网络中被传送的目的节点地址。NE2000支持3种目的地址:单地址、组地址及广播地址。单地址表示只有1个节点可以接收该帧信息;组地址表示最多可以有64个字节接收同一帧信息;而广播地址则表示它可以被同一网络中的所有节接收。源地址是发送帧节点的物理地址,它只能是单地址。目的地址和源地址指网卡的硬件地址,又称物理地址。

在源地址之后的2个字节表示该帧的数据长度,只表示数据部分的长度,由用户自己填入。数据字段由46~1500字节组成。大于1500字节的数据应分为多个帧来发送;小于46字节时,必须填充至46字节。原因有两个:一是保证从目的地址字段到帧校验字段长度为64字节的最短帧长,以便区分信道中的有效帧和无用信息;二是为了防止一个站发送短帧时,在第一个比特尚未到达总线的最远端时就完成帧发送,因而在可能发生碰撞时检测不到冲突信号。NE2000对接收到的从目的地址字段后小于64字节的帧均认为是“碎片”,并予以删除。在数据字段,根据系统的具体功能要求,用户可以预留出若干个字节以规定相应的协议,以便通信双方依据这些字节中包含的信息实现不同的功能。

2基于DSP的网络通信程序设计

如果基于网络操作系统,用户可以利用一些软件对网络操作系统的支持,很容易地编写出优秀的网络通信程序,但这些程序必须依附于网络操作系统。而在DSP环境下,必须深入了解网络接口控制器(NIC)的工作原理[2],通过对网络直接编程,实现局域网内任意站点之间的通信而完全抛开网络操作系统。

DSP对网卡的通信过程控制就是DSP对DP8390中各种寄存器进行编程控制,完成数据分组的正确发送和接收。DP8390的所有内部寄存器都是8位,映像到4个页面。每个页面有16个可供读写的寄存器地址(RA=00H~0fH)。页面的选择由命令寄存器CA控制。第0页寄存器用于收发过程,第1页寄存器主要用于DP8390的初始化,第2页寄存器则用于环路诊断。DSP对寄存器的操作是将寄存器作为DSP的端口设备,其实际物理端口地址(PPA)为网卡基本I/O端口地址(BIOA)与寄存器地址(RA)之和(即PPA=BIOA+RA)。应注意的是,PPA与寄存器间并不存在一一对应关系,对PPA的读操作与写操作并不一定是对同一寄存器进行的,这种情况在第0页尤其明显。用户数据分组在DSP和网卡交互是通过网卡的数据端口实现的,既可以用DMA方式也可以用PIO方式读入数据分组或将数据分组送至网卡RAM缓冲区。在本系统中,DSP采用DMA方式对网卡进行数据读写。网卡的数据端口地址(NDPA)为网卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。

网卡通信过程控制可分为网卡初始化、接收控制和发送控制。下面分别予以讨论。

2.1网卡初始化

网卡初始化的主要任务是设置所需的寄存器状态,确定发送和接收条件,并对网卡缓冲区RAM进行划分,建立接收和发送缓冲环。具体过程请参阅参考文献[2]。需要说明的是,每一块网卡被赋予一个物理地址,以便通信站点的标识。这个物理地址存在网卡的PROM(存储地址为0000~0005H)六个单元中,在网卡初始化时,通过远程DMA读入DSP内存中,并送入网卡物理地址寄存器。在一步的意义在于:一方面,如果能正确读出网卡的物理地址,则说明网卡硬件基本没有问题,网卡的上电复位和DSP对网卡的初始化顺利通过;另一方面,这个物理地址可以用于DSP网络系统中的点名、包的过滤丢弃等服务,也就是说,在链路层根据数据帧携带的源地址和目的地址确定数据报从哪里来,是否接收或丢弃。网卡初始化时另一个重要的工作就是接收缓冲环的设置,为了有效利用缓冲区,NIC将接收缓冲区RAM构成环形缓冲结构,如图2所示。

接收缓冲区RAM分成多个256字节的缓冲区,N个(N最大为256)这样的缓冲区通过指针控制链接成一条逻辑上的缓冲环。缓冲环的开始页面地址存入PSTART寄存器,环页面结束地址存入PSTOP寄存器。PSTART和PSTOP确定了接收缓冲环的大小和边界。为便于缓冲环读写操作,还需要2个指针:当前页面指针CURR和边界指针BNRY。CURR确定下一包放在何处,起着缓冲环写页面指针作用;BNRY指向未经DSP取走处理最早到达的数据包起始页面,新接收的数据包不可将其覆盖,起着缓冲环读页面指针的作用。也就是说,CURR可以告诉用户网卡接收的数据分组当前放到了什么位置,而BNRY则用于确定DSP读缓冲环到了什么地方。由于接收缓冲区为环形结构,BNRY和CURR相等时,环缓冲区可能满也可能空。为了使NIC能辨别这两种状态,规定当BNRY等于CURR时,才认为环缓冲区满;当缓冲区空时,CURR比BNRY指针值大1。因此,初始化时设置:BNRY=PSTART,CURR=PSTART+1。这时读写指针不一致,为了保证正确的读写操作,引入一软件指针NEXTPK指示下一包起始页面。显然,初始化时NEXTPK=CURR。这时,缓冲环的读指针对NEXTPK,而BNRY只是存储分组缓冲区的起始页面边界指示,其值为NEXTPK-1。

2.2接收控制过程

DSP完成对DP8390的初始化后,网卡就处于接收状态,一旦收到分组,就自动执行本地DMA,将NIC中FIFO数据送入接收缓冲环,然后向主机申请“数据分组接收到”中断请求。DSP如果响应中断,则启动网卡远程DMA读,将网卡缓冲区中的数据分组读入学生机存储区,然后对接收缓冲环CURR、NEXTPK、BNRY指针内容进行修改,以便网卡能从网上正确接收后续分组。DSP响应网卡接收中断后,接收控制过程如下:

①设置远程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。

②设置远程DMA操作的字节数,这个长度在46~1500字节范围内根据具体要求自己确定。

③0AH送命令寄存器CR,启动远程DMA读。

④从网卡数据端口依序读入数据分组,注意,最先读入的4字节非数据分组内容,第1字节为接收状态,第2字节为下一包页地址指针,3与4字节为接收字节数。第2字节内容应该送入Nextpk,其它字节根据用户要求处理。

⑤修改边界指针BNRY=Nextpk-1。

⑥清除远程DMA字节数寄存器RBCR0和RBCR1。

2.3发送控制过程

DSP先执行远程DMA写操作,将内存中的数据分组传至网卡发送缓冲区,然后启动发送命令进行数据分组发送。发送控制过程如下:

①设置远程DMA的起始地址为网卡发送缓冲区起始地址;

②设置远程DMA操作的字节数;

③12H送命令寄存器CR,启动远程DMA写;

④依序送出数据分组至网卡发送缓冲区;

⑤清除远程DMA字节数寄存器;

⑥设置发送字节数寄存器TBCR0和TBCR1;

⑦12H送命令寄存器CR,启动数据分组发送。

3发送方发送频率的控制

发送方发送频率的正确控制主要保护两点:一是有一个最小发送时间间隔,否则会因为接收方不能及时接收而导致系统瘫痪;二是发送频率能够足具体的功能实现要求。譬如在语音的实时通信中,发送频率就取决于声卡的采样频率。在8kHz采样频率时,声卡每秒钟采样8000字节,采用1024字节需用时128ms,如果通信协议规定发送1次传送1024字节有效数据,则必须每128ms发送一次才能保证缓冲区有新数据待发送,也才能保证接收方有新数据播放。128ms是一个理论计算数值,在实际的操作中采样速度和发送频率之间总是不能完全匹配,而存放数据的缓冲区大小是有限的,如果没有良好的控制技巧来实现正确发送,就会造成声音抖动和延时。解决的办法是双缓冲技术和双指针控制,并且根据采样速度和发送频率之间的匹配情况送入不同的发送通信进行处理后发送。正确发送的含义有两方面,一是每次发送的都是新数据,二是能满足接收方总在播放新数据的需求。

4接收方防止数据包的丢失

由于DSP通过中断请求判断是否有数据分组到来,如果中断繁忙而两个数据包到来时间相差非常短,DSP有可能只响应一次中断,从而导致丢包的发生。分析网卡接收数据过程,当网卡收到数据分组时,首先执行本地DMA,将NIC中FIFO数据送入接收缓冲环,并将本地DMA操作的起始地址存放在当前页寄存器(CURR)和当前本地DMA寄存器(CLDA0、CLDA1)中,DSP从网卡接收缓冲环读出数据到存储器则称远程DMA操作,用软件指针Nextpk来指示远程DMA的起始页面。因此通过比较网卡本地DMA和远程DMA的当前地址,即在中断服务子程序中比较CURR和Nextpk指针,或比较CLDA0、CLDA1和Nextpk指针,就可以保证当前数据分组放到了哪里就读出到哪里,从而防止丢包的发生。

程序设计论文篇8

依据教学大纲中教学目标、知识点、能力培养等,结合课程设置要求、适应社会需要、企业人才需求、科研项目前沿等,构建内容科学、结构合理的案例库。比如,针对不同专业、不同需求、不同层次学生,设计相应章节或知识点的《C语言程序设计》课程的案例库。

二、以案例促实践,培养学生的学习兴趣、自主学习能力、工程实践能力

初步认知案例,调动学生的积极性,激发学生的学习兴趣。课堂上,在讲授知识点之前,先给出一个案例,通过多媒体演示运行的状态,已预习的学生将会对案例有浅显的认识或者通过教材往往可以得到一定的认知。从案例中寻找知识点,对理论知识概括总结,培养自主学习能力。与传统的教学模式相比,通过引入案例交互式的教学方法更能让学生积极主动地参与,真正实现以学生为主体“、做中学”。当然,案例的构建和选择是非常重要的,要有效地激发学生的兴趣,就要求教师精心设计和恰当安排。从初步认识案例,结合学生自主学习教材的知识,他们将会能动地找出相应的知识点,基本领会到这些知识点如何运用。同时,教师可适当地多演示相似的案例,让学生分组讨论,进而总结案例中涉及的基础理论知识、掌握的基本技能等。通过该方式,能使学生深刻地认识到课堂上所学到的基本知识,达到自主学习能力的培养。反思案例,培养学生的工程实践能力。按照传统教学模式,让学生依据案例所涵盖的知识点,能写出同层次水平的新案例,通过分组讨论,选择与实际问题结合紧密、对知识点反馈性强的案例,可以增加到案例库中,更加激发学生的激情,从成就感中获得喜悦,进而培养学生的工程实践能力。

三、以实践促课堂教学,增强教师授课中理论联系实践的意识,培养学生的归纳总结能力,提高学生的基本技能

采取由浅入深、由表及里的实践练习,为运用技术打下坚实的理论基础。打破传统实验课堂的教学模式,通过对案例的认识和对知识点的挖掘,依据培养目标让学生自主设计实验内容,通过实验课堂分组进行实践,选拔科学合理、结构清楚、层次多样的优秀实验方案,鼓励学生多思考、多总结、多实践。收集案例或实践教学中学生易犯的错误或易混淆的知识点,及时反馈、纠正。如前面所说,将实验课堂上得到的比较优秀的案例添加到案例库中,这样不断改进、优化、更新案例,使教师能在授课中自主地将理论与实践紧密联系,从而更好地指导教学内容。挖掘有效的教学手段、教学方法,体现一定的教学艺术,实现“从做中学,从学中做”,培养学生的语言表述能力、综合分析问题能力、逻辑推理能力和知识归纳总结能力。同时,根据实践的效果和教学内容安排,可以适当增加开创性课题,开拓思维,将有限的知识通过前沿课题或项目融入学生的第二课堂,培养他们不断探索和创新思维的能力。四、以理论和实践促科研项目,教学过程中渗透科学研究前沿知识,让学生了解相关学科的前沿研究动态,鼓励和引导学生创新,培养学生具有可持续发展的学习能力、创新能力教学过程中,以学生为主体,教师起主导作用,引导学生积极参与,坚持“以人为本”,注重学生的个性发展,多方位培养学生可持续发展。学习是自身发展的需要,也是社会发展的需要。不断学习才能适应社会发展,才能满足企业的需求。有时,企业将学习能力作为衡量人才的重要标准之一。激发学生的潜力,转变教育观念,采取一定的措施和策略让学生将终身学习养成一种良好的习惯。组建以教师为核心的课题研究组,健全学生的人格和素质发展,以扎实的理论知识、极强的实践动手能力为基础,使教学与科研完美结合。教师将科研项目分解为学生力所能及的小课题,以老师为指导,选择能力较强的学生作为课题负责人,组员充分发挥所学理论和技能,以科学合理的方法手段解决问题,培养学生的工程实践能力,让学生掌握一定的创新方法,进而更加激发学生的学习兴趣,增强学生的学习能力。同时,培养学生查阅资料、文献的能力,注重培养学生的知识积累和灵活运用意识,以学生的实际应用能力为主要目的,加强学生的知识应用、动手操作、团队协作、创新创造等能力的培养,以适应社会需求、企业需要的综合素质强的应用型人才。

四、结语

推荐期刊