时间:2022-05-19 18:16:39
引言:寻求写作上的突破?我们特意为您精选了12篇程序设计论文范文,希望这些范文能够成为您写作时的参考,帮助您的文章更加丰富和深入。
2、程序设计中&符号的使用
C++程序中&符号出现的情况是标示为引用,对于函数的变化中会起到一定的作用,虽然不改变代码的性质,但是对于函数的定义还是会出现一定的影响。&符号改变的数学函数的参数变化,对于参数的定义域起到了重要的作用。在C语言中的函数值的变化,其中关于main函数的变化之最多,也是在程序研究中使用&符号最多、最为关键的因素之一。在对于main函数的&符号使用中,首先要弄清楚函数的最初原型,对于函数的表达意义要有初步的了解,并且能够合理的使用程序的改变方程式,对于main中的函数参数中&符号也有着不同的规范要求。在main可编辑函数中,agent是表示函数中参数的含义,&符号是表示为函数的变化地址,同时&符号也表达出函数中参数的个数,把agent最为函数参数的指导性参数值进行分析判断,统计&符号可以得到函数相关数组的即时数组信息。在操作系统中,函数中&符号的配置启动中,完全取决于操作系统的函数变化,对于操作中函数的初始变化值有着严格的要求,并在运行初始阶段进行函数的归零处理,后期在每个不同函数变换的模块当中,提取出不同数值的数据参数,来指导计算机程序的有效运行状态。通过改变符号的方式可以对于程序的效率有一定的提升。由上述例子看出,在函数中传引用和传指针的效果是相同的。这样,被调函数中的形参实际上就是主调函数中的实参或目标变量的别名,因此被调函数中所有对形参的操作实际上就是对相应的主调函数中目标变量的操作,一般传递的数据较多时,采用引用时程序的效率较高。虽然使用指针传递地址也能达到相同的效果,但因为在被调函数中还要为形参分配存储单元,而且在主调函数的实参必须使用变量的地址,这种方式必将导致程序阅读性较差,而使用引用便显得简单易懂,而且程序结构也更清晰。常引用声明方式:const类型标识符&引用名=目标变量名;在这种引用方式中,由于目标变量的值的修改不能通过引用来间接修改,因此可以很好地保护目标变量的值,使得引用有了很好的安全性,即相当于目标为const型的变量。当参数需要定义为引用型是,如果实际需要容许尽可能定义为const,这样可以保证代码的健壮性,同时也能带来其它的好处。在函数的定义过程中对于代码的变量指标在初始定义之后,在对变量的变化值进行记录,该代码指针变量便指向初始化指针变量的目标变量。通常情况下规定,具体操作过程时,对代码的指针的操作实际是对其所指向变量的间接操作。程序设计过程中使用指针可以让系统的程序的可读性降低,在操作起来也相对的困难。而由于引用本身就是目标变量的别名,编程中对引用的操作就是对目标变量的直接操作。引用其实也是一种指针,只不过其操作方式与指针不相同,指针可以一对多进行映射,而引用却只能一对一的进行,也就是一个参数对应一个代码指针数值,即&符号中的数字不能被改变,因此在对于符号的使用中,鉴于引用比指针更容易进行操控和编辑。
2多态性抽象类与阴阳理论
面向对象程序设计的多态性中出现的抽象类,因其定义的某些函数(阳)是纯虚函数,没有具体的代码,实现不了常规的操作(缺失“阳”的功能),这种抽象类(含有“阴”却无功能性的“阳”)不能够生成对象,正符合“孤阴不生”之道。在抽象类中,接口类是一种典型的没有数据(阴)的抽象类,它只含有纯虚函数(无功能性的“阳”),从上面分析可知,该类型也是不能够实例化对象的,正所谓“独阳不长”。《易经》中有“天地氤氲,万物化醇,男女构精,万物化生”,在古籍《雪心赋》中更有“孤阴不生,独阳不长”的名句[6]。句中的“天地”、“男女”更抽象一步可理解为“阴阳”,两句都强调“阴阳”在万物的构成中相互依存的对立统一性。
2开放尾部GEP
GEP算法拓展,还是GEP应用研究,GEP在个表示上多以2.1节所述结构为蓝本。这种结构虽然有地保证了基因有性,也使得GEP缺乏功能上多样性。开放尾部GEP不仅能够扩展表现型种类,而且能在不增加个表示复杂性基础上重用功能有地引入到GEP,扩大算法搜范围。考虑用GEP迚行符号回归实验,目标函数为x5+x4+x3+x2+x,在迚化过程可能会得到表现型为x3+x2+x,x5+x4,x3+x2+x为目标函数部分个,这些个有着较高适应度幵且接近目标函数数特征。如果这些运行过程产生最优个动态地保存到一个特定结构,在下一代迚化过程再从选取个加入到种群个基因尾部,由于这些个运算过程信息都得以保留,所以在个解码和计算过程都需重复计算,因此能够在不增加个计算复杂性基础上更好地逼近目标函数,从而提高运算精度。考虑更为一般情ъ,若GEP演化是具有一定特征程序,这个程序由ABCDE五个模块组成。在演化过程,GEP可能会产生形如AB,CE,BCD模块组合,若这些模块放入间存储结构,再其引入下一代迚化计算,这样便有助于算法更加准确地逼近目标。这一点类似于软件复用构件复用技术,已经得到构件存放入构件库,到下次开发时再从构件库取出构件迚行组合,生成构件,实现构件复用。基于以上考虑,我们提出了迚化过程产生优良个迚行保存幵且动态地引入迚化种群个基因尾部开放尾部GEP算法,以期实现运算精度提升。下面具介绍开放尾部GEP开放原理和实现机制。
2.1终端集与个体
传统GEP终端集只包含常数或者变量,开放尾部GEP终端集在常数和变量基础上引入了。对于给定函数集和终端集,开放尾部GEP基因头部由函数集和终端集仸意元组成,尾部则由开放尾部GEP终端集元组成。例如给定GEP基因头部长度h=6,函数集F={+,-,*,/},终端集T={a,b},则应开放尾部GEP终端集T={a,b,},满足上述件一个开放尾部GEP基因如下:其头部(用下划线标识)由6个函数集和终端集仸意元组成,尾部由7个开放尾部终端集元组成,其?代表了开放结构。为了保存开放结构(在运行每一代产生最优个),本文定义了ExpandTail结构。
2.2开放结构引入
开放尾部GEP开放结构(即运行过程产生最优个)引入是通过变异算子实现。具而言对于个+-*aba/abbbabaa,如果变异置发生在尾部第二个置b,则b替换为,变异后个则变为+-*aba/abbabaa。其转换为对应表现型为(a-b)+a*(a/)。
2.3与ExpandTail映
在引入?乊后得到个表现型为(a-b)+a*(a/),那么现在完成替换即与ExpandTail元映。本文给定映机制是:产生一个随机数R幵其对ExpandTail长度L迚行求余得到数t,即t=R%L。这样便与ExpandTail第t个元ExpandTail[t]迚行了Ц联。
2.4表现型计算
在完成映乊后便可接用ExpandTail[t]保存结果完成计算,因为ExpandTail保存了每一代优秀个所有信息,而不需重复计算此结构,实现了结构重用。如果ExpandTail[t]所对应个表现型为a+b那么个表现型为(a-b)+a*(a/(a+b))。
2.5特点
设F、T、T_open=T{?}和ExpandTail分代表函数符集、终端符集、拓展终端符集,以历史最优个集,则开放尾部GEP主特点如下:从表示复杂性看,开放尾部GEP与现有GEP没有本质差,若取头长为h、尾长为t,前者个表现形式是ht(FT)T_open,后者是ht(FT)T。从表现型看,开放尾部GEP与现有GEP解码法则似,本质上是后者解码法施用到ht(FT)(TExpandTail)个形式上(T_open””解释为ExpandTail某历史最优个)。由此可见,法个表示和解读基本没有增加难度(表示基本一致),更多可能有解却因尾部开放法则而移入到有法区,从而达到扩展视野目。比较表现型描述可以看到,法在扩展有法解搜视野同时,也为功能重用提Ν了便。这一点在个形式解读表述ht(FT)(TExpandTail)上有明显现。
3实验与分析
自GEP提出以,研究者们便对其迚行了结构和功能上诸多研究和改迚,是这些改迚算法往往适用于特定问题领域或满足特定性能需求,而传统GEP则因其不Ξ赖于特定问题域,而被各个领域研究者广泛地采用(2.3节所述应用研究采取传统GEP)。因此我们选取了传统GEP作为实验比较对象,用以说明开放尾部GEP通用意义。本文迚行了六组经典符号回归实验,比较了传统GEP和开放尾部GEP平均运算精度。每组实验都设置了同运行数。
2工程实例分析
某基坑工程位于青岛市经济技术开发区,地处长江路示范居住中心地段,共分三期开发,每期工程各由4栋32~33层高层住宅、地下2层机械停车库组成,其中二期工程包含5#、6#、7#、8#楼。现以监测点J8、J10、J16、J19、J22的累计位移变化量为时间序列进行建模分析。表2为J16点的部分观测数据。选取第1~8期作为牛顿插值数据,第9~10期作为检验数据。运行程序,依次输入第1~8期的累计时间间隔和累计位移变化量,点击“计算”控件调用MATLAB进行运算,将非等时距数据序列转换为等时距序列,并在用户界面上输出等时距变换结果,然后输入第9~10期的累计时间间隔,点击“预测”控件,调用灰色GM(1,1)模型构建程序模块,计算得出第1~10期的预测数据,并进行精度检验,最终将预测数据、预测模型精度等结果显示输出在用户界面上,如图2所示。将第1~10期实测数据与预测数据进行比较分析,结果如表3所示。为方便直观显示,绘制预测拟合曲线与实测曲线,见图2。其中,实线代表实测数据,虚线代表预测数据从图2中可以看出,J16点采用非等时距灰色GM(1,1)模型模拟的拟合曲线较为平滑,与实测曲线吻合较好。对模型进行精度检验,计算得J16点的后验差比值C=0.1126,小概率误差P=1。由表1可知,利用该工程J16监测点的第1~8期累计位移变化量为时间序列所构建的灰色GM(1,1)模型,其精度等级为一级。依次以监测点J8、J10、J19、J22的同时段累计位移变化量为时间序列建立灰色GM(1,1)模型,并进行精度检验,计算结果见表4。可以看出,4个模型的精度等级均为一级。综上可知,利用该程序对表4数据进行分析,可以获得良好的变形预测结果,精度较高,充分验证了基坑变形非等时距灰色预测模型的可靠性、有效性与实用性,且程序设计界面友好、操作简便、数据处理高效,能够为基坑工程的安全评判提供可靠的数据依据,以便进行适时控制。
2温湿度模糊控制器设计
2.1输入与输出变量的模糊化
根据温室大棚的实际状况,以温湿度偏差及其偏差变化率为输入变量,各输入变量的模糊化信息如表1所示。结合研究对象实际情况,既考虑控制规则的灵活性又兼顾简单易行。表1中,4个输入变量模糊集均取为A,A为{NB,NS,ZE,PS,PB};模糊论域均取为B,B为{-4,-3,-2,-1,0,1,2,3,4}。模糊控制器的输出控制变量为前窗、天窗、后窗、遮阳帘、通风机、加湿器和加热器。这7个变量均为开关量,只有开和关(0/1)两种状态,分别用符号u1、u2、u3、u4、u5、u6、u7表示这7个变量。
2.2隶属函数的确定
由于三角形隶属度函数在输入值变化时比正态分布或高斯型具有更高的灵活性[6],因此本研究中温湿度偏差与偏差变化率均选取三角形隶属度函数。图4为各输入变量的隶属度函数,选择的模糊集宽度为4。因为宽度过小会造成部分区间空缺,可能找不到相应的控制规则,收敛性不好;宽度过大会造成控制规则的重叠部分过多,相互间影响加大并且响应速度也变慢[7]。根据隶属度函数对输入变量量化为9个等级,其相应的隶属度赋值如表2所示。
2.3模糊控制规则的制定
模糊控制规则的形成实质上是把操作者的经验或专家的知识和经验进行凝练得到的若干条模糊控制规则[8]。经对实际温室控制系统的研究,发现温湿度间存在一定的耦合性,即当通过某一执行机构改变温度(湿度)时湿度(温度)也会发生变化,因此在制定模糊控制规则时就要渗透解耦的思想。基于此,对7种执行机构的开关状态做如下考虑:u1、u2和u3每打开一个设备降温和降湿效果增强一点,但速度较慢;u5开通后其降温和降湿速度明显比u1、u2、u3快;u4降温作用明显,对湿度基本无影响;u6主要起加湿作用,降温为次要作用;u7主要为增温作用,降湿为次要作用。研究中制定了温度与湿度之间、温度变化率与湿度变化率之间的两个模糊控制规则表,在此仅列出温度与湿度之间的模糊控制规则,如表3所示。表3中,U为u1到u7这7个变量的开关状态,开用“1”表示,关用“0”表示。
2.4反模糊化
模糊控制器输出的是模糊语言不同取值的一种组合,由于被控对象只接受一个精确的控制量,因此需要从组合中判决出一个精确的控制量,这也就是反模糊化的过程[9]。常用的判决方法有重心法、最大隶属度法和中位数法等,本研究采用重心法计算模糊控制输出的精确控制量。其具体表达式为u'=∑nj=1ωjμ(ωj)/∑nj=1μ(ωj)(1)其中,n为模糊变量个数,ωj为模糊变量,μ(ωj)是对应模糊变量的隶属度。本系统反模糊化的具体过程:首先温湿度误差或其误差变化率经量化后得到相应的量化等级,根据量化等级查询各个执行机构在控制规则表中对应的控制规则并使其激活。然后,由式(1)计算各个执行机构的输出值,计算结果等于0.5时,执行机构保持原来状态;计算结果大于0.5时,执行机构开;计算结果小于0.5时,执行机构关。基于这种思想,可建立各执行机构的模糊控制查询表,放在内存中,编写相应的PLC程序即可实现模糊控制器对执行机构的实时控制。
3温湿度模糊控制PLC程序设计
温湿度模糊控制PLC程序包括输入量的采样与模糊化程序、量化等级程序、模糊控制查询程序、执行机构控制程序和预警程序等[10],在此仅介绍有关输入采样、误差的计算和模糊控制查询的部分程序。本研究是在STEP7编程环境下完成的模糊控制程序。
3.1输入量采样和ET/EH计算程序
研究中应用的温湿度传感器的变送单元分别取0~50℃、0~100%RH,线性对应电流均为4~20mA,因此在编写PLC程序前需把温湿度的值与PLC中的数字量关系建立起来。具体过程如下:以温度为例,用I表示电流值,T表示温度值,X表示实时温度转换为PLC中的数字量值。由于0~50℃与4~20mA对应,4~20mA又与PLC中的数字量为6400~32000对应,因此可得曲线方程如式(2)与式(3)所示。根据式(4)即可计算0~50℃对应PLC内部的数字量值。如22℃对应数字量值为17664。同理,可求得湿度值与PLC中数字量的对应关系如式(5)所示。其中,H表示湿度。下面以温度为22℃和湿度为70%RH的情况编写相应的PLC程序,70%RH对应的数字量为24320。
3.2模糊控制查询程序
由反模糊化得到的模糊控制查询表实质上是一个9×9的二维数组,存在以VW200开始的81个字单元中。在此把数组的首地址指针设定为VD48,根据(VW20×9+WV18)×2即可计算偏移值,在查询表中定位并把相应值赋予WV28。
4系统实际运行测试
控制系统投入运行后,任选某一天对控制效果进行实际测试。测试时的起始温度和湿度分别为32℃和52%RH,控制设定值分别为22℃和70%RH。对温湿度采样时间间隔均为5min,根据采集数据绘制的曲线如图5所示。由图5可知30min左右时温湿度值均达到设定值,再经10min左右温湿值即达到预设的稳定状态值,达到了较满意的控制效果。控制系统达到稳态的时间可通过增减有关设备进行调节。
在使用MCI之前必须安装好多媒体设备如声卡、CD—ROM等以及这些设备的驱动程序,否则MCI将不听指挥。
一、MCI控制的安装
MCI控制在VB不同版本中的安装方法是不一样的。在VB3.0专业版中,MCI控制文件为MCI.VBX,在VB4.0中MCI控制文件为MCI16.OCX(16位)、MCI32.OCX
(32位)。一般情况下MCI控制在启动VB之后并没有加入到工具箱中(TOOLBOX),需要自己动手安装它。
1.VB3.0中MCI的安装。打开VB的FILE菜单,选择AddFile项,从Windows\system目录下找到MCI.VBX,选择OK即可,这时你将发现TOOLBOX最后又多了一个工具,这就是MCI。如果你经常要用它,建议在VB目录下找到Autoload.mak文件,用字处理软件打开它,把MCI.VBX添加在其中,这样每次启动VB时就将其自动调入。
2.VB4.0中MCI的安装。VB4.0支持16位和32位两种系统,在WINDOWS3.1下只能使用16位系统。MCI不能和VB3.0中一样用AddFile调入,如果你这样做将会发现系统提示错误,需在Autoload.mak文件中调入。笔者打开Autoload.mak文件后发现调用格式为:OBJECT={序列号}#1.0#0;文件名,不知道MCI16.OCX的序列号是无法安装的。幸好在VB目录下的子目录SAMPLE下有一个MCI的子目录,进入它可以看到有一个MCITEST.MAK文件,打开它可以看到有:Object={C1A8AF28-1257-101B-8FB0-0020AF039CA3}#1.0#0;MCI32.OCX一行(也许您的序列号不一定和这相同),将这一行复制到Autoload.mak文件中即可。由于本人使用的是WINDOWS3.1,在安装VB4.0时32位系统无法装入,硬盘中根本没有MCI32.OCX文件,VB何以将MCI32.OCX调入呢?经试验发现VB以序列号选择文件,可能上述序列号是MCI16.OCX文件的序列号,进一步试验发现即使将序列号后面的MCI32.OCX去掉也可调入,这进一步说明了VB4.0中一个OCX文件有一个对应的序列号,因此绝对不能改变序列号,否则将无法正确调入所
需的文件。MCI安装完毕,用鼠标双击工具箱的MCI图标,如果在Form中出现9个熟悉的按扭,那么安装就成功了。
二、MCI的属性和事件
MCI提供许多关于MCI控制方面的属性和事件。比较常用的属性有:
Buttonvisible决定该按钮在MCI控制中是否可见。
Command要执行的MCI命令,如OpenClosePlayStopEject等。
DeviceType要打开的MCI设备类型,如动画播放设备、MIDI序列发生器、激光视盘机、WAV文件播放器、录相机等。
Filename使用Open命令打开或Save命令保存的文件名。
Length确定一个文件或CD唱片的长度。
Track指定特定的轨道,供Tracklength和Trackposition使用。
Tracks当前MCI设备的轨道数。
Tracklength在当前时间格式下,传回Track所指轨道的时间长度。
Trackposition在当前时间格式下,传回Track所指轨道的起始位置。
Visible决定在运行时刻多媒体MCI控制是否可见。
比较常用的事件有:
Buttonclick当用户在多媒体MCI控制的按钮上按下或释放鼠标时产生该事件,
每一个Buttonclick事件缺省执行一个MCI命令。
Buttoncompleted当多媒体MCI控制按钮激活的MCI命令完成后发送。
Statusupdate这个事件可监测目前多媒体设备的状态信息,比如用滚动条来表示当前轨道的位置。详细的属性和事件的用法请参看控制帮助文件。
三、CD播放器的例子
对初学者来说,能利用入门知识编写一个的成功小程序是很鼓舞人心的,下面我们来编写一个非常简单的例子:迷你CD播放器。在MCI调入Toolbox之后,双击MCI工具,将会在Form中出现9个按钮,用鼠标移动这些按钮至合适的位置,然后双击Form窗体,把下面的代码加入到事件中:
SubForm_Load()
MMControl1.DeviceType=“CDaudio"''''MCI设备类型为CD唱片
mand=“open"''''打开设备
EndSub
SubForm_Unload(CancelAsInteger)
随着Internet的迅速发展,Java作为一种面向对象的高级语言得到了越来越广泛的应用。它既具有一般程序设计语言所具有的安全性、多线程等特点,同时又具有独特的平台无关性的优势。为了适应社会的发展,培养更符合市场需求的计算机专业人才,很多高校都陆续开设了Java语言的相关课程。但是在传统的Java语言教学过程中,课堂一般以教师为主导,首先按照教材章节顺序向学生灌输一个个抽象的概念、语法和算法,然后再去布置相关的实践任务让学生在机房实践操作。这种先理论后实践、理论和实践完全割裂的教学方式忽视了学生的互动参与,导致课堂乏味,学生学习兴趣下降,教学内容单纯倚重课堂讲授,学生实训操作练习很少,而且学与做相脱离,不利于学生理解消化课程知识和锻炼编程能力,难以取得理想的教学效果。针对这些问题,教师可以在该课程的教学中引入案例教学,以书本知识点为基础,以案例为依托,使学生在制作案例的过程中逐渐理解Java基本理论知识,在理解理论知识后不断提高Java语言的编程能力[1]。
一、案例教学法的实施意义
案例教学法由美国哈佛商学院提出,通过在课堂教学中由教师围绕案例组织教学,将学生引入特定的情境之中,启发学生分析案例,探讨案例解决方案,实现课堂师生的双向互动和学生学习效果的及时反馈,激发学生学习的积极性,提高教学效果。在Java语言程序设计课程教学中应用案例教学法就是通过实施一个完整的Java案例来组织教学活动,用典型案例把理论知识与实践教学有机地结合起来,把理论知识融入到案例制作之中。教师通过案例实施完成教学过程,学生通过案例制作掌握Java的语言知识和编程技巧,使教学做有机融合,提高该课程的教学效果。与传统教学方式相比,案例教学方法更能充分发掘学生的创造潜能,培养学生学习Java语言的兴趣,提高学生解决实际问题的综合能力[2]。在Java语言程序设计教学中实施案例教学,教学过程通过教学案例的实施过程来开展,通过“提出案例目标--分析案例任务--实施案例--边学边做--总结反馈”的环节分解每个知识点,充分体现学中做、做中学的教学理念,展现互动创新、注重应用、共同协作的教学风格。
二、Java语言程序设计案例教学的实施
(一)明确Java语言程序设计的教学计划在Java语言程序设计课程的教学中使用案例教学方法,教师首先要明确该课程的教学计划。具体包括特定的教学对象、明确的教学目的、课程的教学效果和对教学过程实施的整体设计及其控制。教学计划的制定必须以市场需求为导向,符合程序设计语言课程的教学规律,既不能脱离学生的实际学习能力,也不能丧失该课程注重实践应用能力培养的教学特点。因此,通过市场调研、企业专家访谈和毕业生信息反馈等形式,确定本课程的教学计划是使学生掌握面向对象程序设计的开发方法,理解类、实例、继承、包的应用,体会面向对象的程序设计方法在软件系统开发中的优势,使学生能够运用面向对象的思想、方法和Java语言开发应用程序。同时在该课程的教学中注重进一步的培养学生的软件设计与开发能力、程序调试能力,养成良好的程序编写习惯,从而为本专业的后续课程的学习奠定坚实的基础。(二)精心准备Java教学案例资料结合高职学生的特点,本课程将抽象的理论知识点细化和组织到具体形象的案例中去,让学生在具体的案例中体会知识点的应用。为此构建该课程规范的一体化案例教学资料库是非常重要的,选取的教学案例要能很好地和相关地教学知识点紧密融合。因此,在讲稿和课件中注重设计好每个案例“如何运用,怎样引入,何时引入,怎样与知识点有机衔接”。为了更好的提高学生的学习积极性,体现高职课程应用型、实用型的特色,Java教学中应用的案例要生动、实用,最好能从实际工作中的应用出发,提取一些典型的教学案例,能够模拟真实的企业工作环境,按照软件开发的流程组织教学。这样一方面可以使得学生可以了解以后工作的内容,激发学生学习的热情,另一方面可以改变高中时的以掌握理论知识为中心的学习方式,变被动学习为主动操作,突出实践技能的培养,使学生养成良好的程序设计开发习惯[3]。但是实际工作中的案例一般都比较综合,结构庞大,涉及的知识点比较多,如果直接应用到教学中对于初学者来说过于复杂,这就要求教师对这些案例必须要进行加工,抽取出关键部分,把繁杂无关的部分去除,有效引导学生进行学习。在学生具有一定的编程基础的情况下,再给学生真实的综合案例,通过由简单到复杂、由单一模块制作到综合案例制作的学习过程逐渐掌握Java语言的知识和编程方法,从而提高学生对实际工作情况的适应度。学生在分析案例寻求解决方案的过程中,会自然地与所学知识点进行结合,而案例中较为复杂问题的解决,能够激发学生不断学习、勇于创新的热情,打破学生原有的知识范围,拓展学生的知识领域,从而使得学生从被动的学习者转变为主动运用知识来处理各种各样的问题的开发者,不断提高软件开发的分析和解决问题的实践能力。(三)设计合理的课后练习案例由于Java语言比较抽象,知识点较多,对实践操作要求又比较高,仅仅凭着上课有限的教学时间是远远不够的,所以在每一章节的课堂教学结束后,教师必须选取合适的案例,为学生布置所涉及相关知识点的课后作业,从而让学生能通过课后作业练习对Java语言能够进一步深入的理解。(四)理论课和实践课合为一体传统的Java教学模式一般是先理论后实践,理论课和实践课分开,理论课在多媒体教室完成,而且理论课时一般都是实践课时的2倍以上。在具体的教学中,为了保证后期课程的教学难点能够掌握,理论课都先于实践课开始。这样的教学安排会使得理论课已经进行一半后,实践课才刚开始。而在Java语言等程序设计课程中,学生对于知识的掌握和编程能力的培养,在很大程度上是通过实践操作来实现的,但课后并不是每个学生都会自觉地在自己的计算机上编程练习,还有一部分学生虽然也在自己的计算机上编程调试了。但是一旦在调试中遇到困难得不到解决,往往就会退缩,把问题搁置等着上实践课再来解决,以至于造成学生学习进度缓慢,编程能力得不到有效提高。为此,可以把Java语言程序的理论课和实践课结合在一起,把授课地点设在机房中,教师以教学案例为主线,首先分析案例,然后引导学生思考案例解决方案,接着引出案例涉及的相关知识点,再把知识点应用到案例制作过程中,边做边讲,通过这种教学做一体化的教学方式把理论和实践有机结合起来,把抽象难懂的理论知识通过具体的操作帮助学生理解,学生的学习热情有了很大的提高,学习效果也有了明显的改善。(五)重视教学的互动与及时反馈传统的教学方法一般是教师讲、学生听,课堂只注重知识的单向输出,忽略了师生之间的沟通和学生的实际的接受效果。通过教师和学生之间的及时沟通,不仅能够使教师发现学生学习的薄弱环节,而且可以发现教学过程的不足,动态调整教学实施过程,更重要的是增进了师生感情,从而引发学生的学习兴趣[4]。在Java语言程序设计中应用案例教学法就能很好的实现教学的互动,使教师能够及时的得到课堂教学效果的反馈。首先在案例教学中,学生拿到案例后,在教师的引导下先要进行分析消化,然后在案例制作的过程中学习相关的Java语言知识,这无形中会使学生加深了对知识的理解,而且学习过程是在和教师的互动中进行的。同时学生的成果要经过学生自评、教师点评环节,这一方面调动了学生学习和动手的积极性,也促使教师加深思考,根据学生制作案例的情况了解学生掌握新知识点的程度,及时调整教学内容和教学进度,不断完善案例教学的实施过程。(六)典型教学案例实施过程:自动计数器图1计数器初值为0图2计数器自动加1图3加数器变为减数器图4计数器自动减1在Java图形界面开发讲授时,教师如果只是介绍各个组件的构造方法和常用的方法,就会让学生觉得枯燥乏味,不知道每个方法具体的应用,而且不能让学生了解组件显示的难点--坐标的确定,因此有必要通过案例教学来实施这部分知识点的教学。比较典型的一个教学案例是自动计数器的制作。计数器初值为0,如图1所示;当单击“自动加1”按钮时,程序实现计数器功能,如图2所示;当计到100时,“自动加1”按钮显示为“自动减1”,如图3所示;并自动实现减数器的功能,如图4所示。如此循环,直到单击“退出”按钮为止。在讲授时,教师可以首先演示该程序的功能和运行过程,让学生明确学习目的,然后对着运行界面引导学生分析程序的实现思路:自定义一个窗口类,在窗口类的构造函数中添加单行编辑框和按钮组件。然后重写按钮事件处理方法actionPer-formed。在讲解窗口类的实现中,要详细讲解单行编辑框组件和按钮组件的坐标的确定。接着再详细说明在用户单击了按钮后,如何控制计数器计数:先要判断选择了哪个按钮,这里教师告诉学生通过事件的getSource方法可以获得事件源;然后再根据按钮的文本内容执行相应的操作,“自动加1”将使num加1,“自动减1”将使num减1;最后用setText方法把新的num设置为单行编辑框的值。这是一个综合了多个知识点的案例,涉及到组件的添加、事件处理、整型数和字符串类型的相互转换、事件源的判断等知识点。这个案例的学了有助于让学生掌握这些界面开发的知识点外,也会让他们学到流程控制的编程技巧。
三、结束语
在Java语言程序设计的教学中,以教学案例的实施为主线,通过教学内容、案例选择、授课模式等一系列的改革措施,培养学生独立分析问题和解决问题的能力。实践证明案例教学法不仅可以提高高职学生学习Java语言的兴趣,使他们在学习的过程中由被动接收知识变为主动培养实践技能,而且增强了学生在实践操作中的自信心,学生的编程能力也有了明显的提高。
作者:王惠 单位:九州职业技术学院
参考文献:
[1]李天书.案例教学法在专业课教学中的应用与实践[J].职业时空,2014(6).
现在民办高职院校采用教学材料中的课程结构往往跟不上时代变化的脚步,甚至远远落后与当前的研究形式。而且在讲授Java这门实践性较强的课程,选择的教学方式非常陈旧,以教师为中心的被动化课堂模式,无法显示学生的主动性和积极性,这种教学模式根本无法诠释Java语言的精妙之处。
1.2 教学内容编排存在问题
现阶段民办高职院校的Java程序语言课程教学内容比较单一和落后,教学过程中,教师主要讲解一些Java理论性的知识。学生在学习了Java语言这门课程之后,往往对Java只是一个宽泛性的概念理解,对Java语言的实际操作的强大功能没有切身领会和感受到[2]。
二、java程序设计课程教学质量保证体系构建
2.1 提升教师教学水平
要有效提高Java程序设计课程教学质量,提高教师的教学水平是首要途径。Java语言的授课教师必须立足自身的优势和缺陷,取长补短,不断丰富自身的专业知识,增强专业技能,更新教学观念,引入创新的教学方法,积极主动参与Java实训活动,这样才能在Java课堂教学中游刃有余。
2.2 改革课程结构
课堂教学过程中,遵循“教师为引导,学生为主体”原则,选择与学生知识水平相符合的教学课程,课程结构要与学生的生活世界紧密结合,以培养学生的上机实操能力为主,让学生成为课堂上的主体,积极培养学生主动学习能力、动手能力,提高学生的应用创新能力。比如在讲授类、图形用户界面设计、网络编程等内容时,笔者特意将教科书的章节打乱,实际教学时由浅入深、循序渐进的讲解,适当增加直观化、生动化的案例解析。
2.3 优化教学内容
Java程序设计课程作为一项跨学科、知识面广的学科,在课程教学内容上要进行合理优化组合,以符合学生的知识水平和实际生活为主,利用网络教学资源为学生提供Java程序设计课件、Java案例解析、Java学习论坛等[3]。
1.2工程施工放样数学模型
1.2.1曲线常数:(1)缓和曲线倾角:πβ180200=×Rl(2)圆曲线内移值:(3)切线外移量:23002240Rllm
1.2.2曲线要素:(1)切线长:(2)曲线长度:(3)外矢距:E=R+PR2()secα(4)切曲差:D=2TL
1.2.3主点里程:(1)ZH点里程:(2)HY点里程:(3)QZ点里程:(4)YH点里程:(5)HZ点里程:检核计算:
1.2.4独立坐标计算:(1)在坐标系x′o′y′中,缓和曲线ZH-HY段(i1K)独立坐标计算:(2)计算ZH-HY缓和曲线细部点:(3)计算ZH-HY缓和曲线HY点(直接将上式0lli代为0lli代为):(4)在坐标系x′o′y′中,圆曲线HY-YH段任意一点独立坐标计算:=+=+(1)siniiiiyPRCosxmRφφ1.2.5主点及若干曲线中桩点坐标:(1)(指ZH到JD的坐标方位角)(2)(右转用-,左转为+)(3)(右转用-,左转为+)(4)三个主点坐标如下:ZH点坐标:HZ点坐标:QZ点坐标:(5)曲线中桩点坐标按线路右转所得公式如下(注意若为线路左转则以下几个公式用iiy代替y):
2工程施工放样项目VisualBasic程序设计
2.1程序界面
2.1.1主程序界面。主程序界面设计如图2所示,通过主界面,可以输入所有的已知数据,并选择偏角的类型。图2主程序界面
2.1.2结果显示界面。计算结果通过一个文本框的形式,将所有需要的结果及一些关键的中间结果分栏显示,如图3所示:图3结果显示界面
2.2核心代码
2.2.1计算曲线常数和曲线要素:IfR<>0ThenJD=Ls*180/(2*R*PI)p=Ls^2/(24*R)-Ls^4/(2688*R^3)m=Ls/2-Ls^3/(240*R^2)T=(R+p)*Tan(PJ/2)+mL=PJ*R+LsE=(R+p)*1/Cos(PJ/2)-Rq=2*T-LElseMsgBox"必须输入曲线半径R!"Text12.SetFocusEndIf
2.2.2主点里程及独立坐标计算:k1=k1*1000+k11k2=k2*1000+k22k3=k3*1000+k33kZH=k1-TkkZH=kZH\1000kkkZH=kZH-kkZH*1000kkkZH=Format(kkkZH,“###.###”)Str1="ZH点里程:"&"K"&kkZH&"+"&kkkZHStr2="HY点里程:"&"K"&kkHY&"+"&kkkHYStr3="QZ点里程:"&"K"&kkQZ&"+"&kkkQZStr4="YH点里程:"&"K"&kkYH&"+"&kkkYHStr5="HZ点里程:"&"K"&kkHZ&"+"&kkkHZLi=k2-kZHLi1=k3-kZHX11=Li-(Li^5)/(40*R^2*Ls^2)Y11=(Li^3)/(6*R*Ls)X12=m+R*Sin((Li1-0.5*Ls)/R)Y12=p+R*(1-Cos((Li1-0.5*Ls)/R))Xhy1=m+R*Sin(JD*PI/180)Yhy1=p+R*(1-Cos(JD*PI/180))Ajd=((Li1-0.5*Ls)/R)*180/PI
2.2.3坐标计算:Xzh=X2+T*Cos(A)Yzh=Y2+T*Sin(A)Xhy=Xzh-Xhy1*Cos(A)+K*Yhy1*Sin(A)Yhy=Yzh-Xhy1*Sin(A)-K*Yhy1*Cos(A)Xqz=X2+E*Cos(Ajz)Yqz=Y2+E*Sin(Ajz)X111=Xzh-X11*Cos(A)+K*Y11*Sin(A)Y111=Yzh-X11*Sin(A)-K*Y11*Cos(A)X112=Xzh-X12*Cos(A)+K*Y12*Sin(A)Y112=Yzh-X12*Sin(A)-K*Y12*Cos(A)
2.2.4结果输出:OpenApp.Path&“\T1.txt”ForInputAs#2DoWhileNotEOF(2)'循环至文件尾。LineInput#2,TextLine'读入一行数据并将其赋予某变量。Form2.Text1.Text=Form2.Text1.Text&Chr(13)+Chr(10)&TextLineLoopClose#2Form2.Show
学情分析是教学设计系统中“影响学习系统最终设计”的重要因素之一。在教学设计中,依据教学设计理论,认真研究学生的实际需要、能力水平和认知倾向,“为学习者设计教学”,可优化教学过程,更有效地达成教学目标,提高教学效率。VB的开课学期一般在大一第二学期,按照专业培养计划,计算机网络技术等专业在新生入学的第一学期就开设了《C语言程序设计》这门课。对于从未接触过语言类课程的大一新生来说,C语言的学习,颠覆了大部分学生的思维方式,学生普遍感到很吃力,有相当一部分同学开始对程序类课程感到害怕。
二、教学方法探讨
1.消除学生的畏难情绪
为了打消学生的畏难情绪,对于VB教学,应首先与学生谈VB,而不是教VB。首先,要让学生明白VB和C语言是完全不同的两种编程方式,不要因为害怕C语言,而害怕VB。教学中,通过演示一个简单的例子,向学生演示只需要两行代码便可制作出美观的界面和可爱的功能。比如:示例1:制作美观的界面,实现窗体上的文字自动或手动的向下移动。突现VB相对于C语言的简单易懂,引导学生一步步完成所需功能。最后,启发学生:如果想让文字上移,如何修改程序?如果想让文字左移或右移,如何修改程序?如果想让文字左右交替移动,又要如何修改程序?通过上述示例的讲解,使得学生对VB有一个全新的认识——直观、简单、易学、易用。其次,要让学生了解为什么学习VB,VB对于他们有多么重要。这门课的开设除了承上启下其他专业课程外,还有一个重要的作用就是为了让学生能够参加计算机二级考证,VB在二级考证中相对比较易学易用。再次,告诉学生,有了C语言的基础,代码的编写会更为容易。从而激发学生学习的信心。
2.提高学生的学习兴趣
在教学过程中应尽量使用简单易懂的语言和示例,提高学生的学习兴趣,帮助学生理解知识点。比如,在讲属性、方法和事件这三个很枯燥的概念时,可以通过生活中有趣的示例来进行解释。示例2:通过“蟑螂从女生脚上爬过”的事例,讲解属性、方法和事件的概念。蟑螂从女生脚上爬过时,女生的脸色变红,脸的颜色为红色就是属性;女生尖叫起来,女生跳起来,这是女生本身做出的动作就是方法;蟑螂爬过女生的脚,这是外部事物对女生做出的动作,就是事件。通过这种类型的示例,成功吸引了学生的注意力,也帮助学生理解了这几个难懂的概念。在讲属性、方法、事件的书写格式时,也可将这个示例写成VB伪代码的形式:属性的表示方法:女生.脸的颜色=红色方法的表示方法:女生.尖叫啊事件的表示方法:女生_蟑螂爬过至此,学生对VB程序一下就理解了。
3.实践中学习,项目中巩固
TI公司专门推出了PCI2040桥芯片是专门针对PCI总线和DSP接口用的,本文利用它和DSP来处理视频信号,并用双端口RAM实现DSP之间的数据传输。
1硬件设计
1.1PCI总线控制芯片PCI2040
PCI总线是一种不依附于某个具体处理器的局部总线,它支持32位或64位的总线宽度,频率通常是33MHz,目前最快的PCI2.0总线工作频率是66MHz。工作在33MHz、32位时,理论上最大数据传输速率能达到133MB/s。它支持猝发工作方式,提高了传输速度,支持即插即用,PCI部件和驱动程序可以在各种不同的平台上运行[1]。
实现PCI总线协议一般有两种方法,一是用FPGA设计实现,但PCI协议比较复杂,因此难度较大;二是采用PCI总线控制芯片,如AMCC公司的S5933、PLX公司的PCI9080等通用的PCI接口芯片。TI公司专门推出了针对PCI总线和DSP接口的芯片PCI2040[2],它不但实现了PCI总线控制的功能,而且提供了和DSP芯片无缝的接口,因而大大简化了系统设计的复杂度并缩短了开发时间。
PCI2040是一个PCI-DSP桥接器件,它提供了PCI局部总线和TMS320C54X8位主机接口(HPI)与TMS320C6X16位主机接口的无缝连接。一片PCI2040最多能同时挂接4片DSP芯片。同时,它还提供了一个串行EEPROM接口,一个通用输入输出接口(GPIO)和一个16位通用总线接口(为TIJTAG测试总线控制器提供接口)[2]。PCI2040只能作为PCI目标设备使用,不能作为PCI主设备使用;它只支持单字的读写,不能提供DMA操作。PCI2040能够兼容3.3V和5V信号环境系统中的3.3V和5V信号可以直接从PCI插槽中获得。
PCI2040和TMS320C6201的接口如图1所示。
1.2PCI2040寄存器说明
PCI2040桥256字节的配置头如图2所示,HPICSR基地址、控制空间基地址(ControlSpaceBaseAddress)值都是系统自动分配的。所有的PNP器件都是如此它将控制空间映射到主机内存,映射的空间大小为32KB。4片DSP芯片的选择是通过解码PCI_AD14、PCI_AD13来实现的,其对应关系如表1所示。而DSPHPI寄存器的地址则是由PCI_AD12和PCI_AD11来决定的,其对应关系如表2所示。
图1PCI2040和TMS320C6201的接口
表1DSP选择
AD[14:13]
TMS320C6xDSP
00
HCS0(选择第一块DSP)
01
HCS1(选择第二块DSP)
10
HCS2(选择第三块DSP)
11
HCS3(选择第四块DSP)
表1HPI寄存器映射
AD[12:11]
TMS320C6xHPIRegister
00
HPI控制寄存器
01
HPI地址寄存器
10
HPI自增数据寄存器
11
HPI数据寄存器
因此,DSP与主机交换数据的过程,也就是读写HPI寄存器的过程。也就是说,通过主机访问DSP板上资源,只需要将相应地址赋予HPIA寄存器中,然后读写数据就可以通过HPID寄存器。具体描述如下:
(1)初始化PCI2040内部配置寄存器,指向特定的DSP(因为本系统有两块DSP和PCI2040相连),指定数据传输宽度为16位。
(2)分配HPICSR基地址和控制空间基地址,允许PCI2040进行内存映射或I/O端口映射。值得注意的是,PCI2040控制空间只能映射在主机的内存空间里,不能映射在I/O空间。以上两步都由驱动程序完成。
(3)脱离复位状态后,PCI2040解码从PCI总线来的地址,以此来做出响应。若落入32KB的控制空间中,则根据PCI_AD12、PCI_AD11及PCI_AD14、PCI_AD13片选情况访问相应HPI寄存器。
(4)设定HPI控制寄存器中的BOB位,选择正确的高低16位排列方式。
(5)主机开始对HPI寄存器进行读写。
1.3双DSP系统硬件设计
本文所采用的双DSP系统主要用来处理视频信号及高速数据采集,该系统是基于TMS320C6201DSP和PCI2040而设计的。此卡的主要功能是:(1)采集视频信号或其他模拟信号经A/D转换后,交给DSP进行相应处理,然后将处理后的数据通过PCI2040经PCI总线存放在计算机硬盘上或者直接存储到板上RAM中,然后通过PCI总线将视频数据传送到主机后显示。(2)两块DSP之间的通信可以通过McBSP或双端口RAM。
该系统的特点有:两块TMS320C6201DSP,处理能力可达3200MIPS;每片C6201带512KSBSRAM,256KBFLASH;16KB高速双口RAM用于两块C6201之间进行数据交换;12位ADC;32位高速FIFO。系统硬件框图如图3所示。
2基于WDM的PCI驱动程序设计
WDM是新一代的驱动程序构架,它是一个跨平台的驱动程序模型,在WINDOWS98以上的操作系统中都实现了全面兼容。不仅如此,WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,因而为驱动程序开发人员提供了极大的方便。
WDM驱动程序是分层的,即不同层上的驱动程序有着不同的优先级,而Windows9x下的VxD则没有此结构。另外,WDM还引入了功能设备对象FDO(FunctionalDeviceObject)与物理设备对象PDO(PhysicalDeviceObject)两个新概念来描述硬件。PDO代表实际存在的硬件设备,它是在总线驱动程序(BUSDRIVER)下枚举并建立的,负责与真实硬件进行I/O操作。FDO是由用户驱动程序建立的,一般来说,它是用户与真实硬件进行I/O操作的一个窗口,是Win32赖以沟通内核的一个桥梁。对于驱动程序开发者,真正需要做的就是开发FDO。至于PDO,则由BUSDRIVER建立,并在需要的时候作为参数由I/OManager或其它系统组件传给你的FDO。
在应用层与底层进行通讯时,操作系统为每一个用户请求打包成一个IRP(IORequestPacket)结构,将其发送至驱动程序,并通过识别IRP中的PDO来识别是发送给哪一个设备的。另外,WDM不是通过驱动程序名称,而是通过一个128位的全局惟一标识符(GUID)来识别驱动程序的[3]。
WDM驱动程序都有一个初始化入口点,即DriverEntry,它相当于C语言中的main函数。当WDM驱动程序被装入时,内核调用DriverEntry例程。另外WDM设备驱动程序还需要一个即插即用模块,即AddDevice。AddDevice例程就是PnP管理器在用户插入新设备时调用它来创建WDM设备对象的。
本文主要采用Windows2000DDK来设计该驱动程序。调试工具为SOFTICE。驱动程序的主要工作集中在:
(1)DriverEntry(),这是驱动程序的入口点,驱动程序被装入时首先执行DriverEntry例程。主要工作是建立驱动程序这所需的函数。
(2)dspPciAddDevice(),在这个例程里驱动程序主要是创建设备。
(3)dspPciPnp(),在这个例程中驱动程序主要是启动设备和停止设备等,并且从PnP管理器读出为双DSP所分配的硬件资源,包括HPICSR基地址和HPI控制空间基地址,对PCI配置空间进行初始化。初始化中断等。需要注意的是,在初始化中断之前禁止卡向主机发中断,因此应有屏蔽中断的操作。
(4)dspPciDeviceControl(),在这个例程中可以定制自己的函数来达到Ring3层和Ring0层相互通讯的目的。通过IOCTL_CODE可以区分不同的请求。
(5)Isr_Irq(),这个例程是用来处理中断的。Windows2000的中断处理机制是假定多个设备可以共享一个硬件中断。因此,Isr的首要工作就是找出哪一个设备发生了中断。如果没有,则应该立刻返回FALSE,以便HAL能把中断送往其它设备驱动程序。中断服务例程Isr执行在提升的IRQL上,在DIRQL级别上运行的代码需要尽可能快地运行。通常情况下,若判断中断是由自己的设备产生的,则调用一个在DISPATCH_LEVEL级别上运行的延迟过程调用(DpcFor_Irq)。
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接收方防止数据包的丢失