教学设计:调用系统子程序(精选10篇)
1.教学设计:调用系统子程序 篇一
用 VB 轻松调用其他程序 我们编写程序时,有时会遇到在一个程序中调用并控制另一个程序执行的情况,在一些编程语言中实现起来较为繁琐,但如果用VB编写时,则可轻松实现,下面我就以在程序中调用“计算器”为例,总结了以下几种方法: 一、以异步方式来执行
用VB轻松调用其他程序
我们编写程序时,有时会遇到在一个程序中调用并控制另一个程序执行的情况,在一些编程语言中实现起来较为繁琐,但如果用VB编写时,则可轻松实现。下面我就以在程序中调用“计算器”为例,总结了以下几种方法:
一、以异步方式来执行其他程序
Shell 函数是以异步方式来调用其他程序的。也就是说,用Shell启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
语法:Shell(pathname[,windowstyle])
说明:pathname:必要参数。Variant(String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。
例如:RetVal = Shell(″C:WINDOWSCALC.EXE″, 1) ′ 调用计算器。
二、以同步方式来执行其他程序
有时候,我们需要让VB在执行完外部程序后再执行下一语句,这就需要使用API函数。
我们可通过OpenProcess和CloseHandle函数来检测调用软件的运行情况。这两个函数的声明如下:
Declare Function OpenProcess Lib ″kernel32″ Alias ″OpenProcess″ (ByVal dwDesiredAclearcase/” target=“_blank” >ccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib ″kernel32″ Alias ″CloseHandle″ (ByVal hObject As Long) As Long
建立下面函数,用以判断程序是否在运行,如果是,则在运行时返回True。
Function IsRunning(ByVal ProgramID) As Boolean ′传入进程标识ID
Dim hProgram As Long ′被检测的程序进程句柄
hProgram=OpenProcess(0,False,ProgramID)
If Not hProgram=0 Then
IsRunning=True
Else
IsRunning=False
End If
CloseHandle hProgram
End Function
例如要调用计算器(CALC.EXE)并等到它运行完成后再执行下一语句,可以使用以下代码:
Dim RetVal
MsgBox ″开始运行″
RetVal = Shell(″C:WINDOWSCALC.EXE″, 1)
While IsRunning(RetVal)
DoEvents
Wend
MsgBox ″结束运行″
三、关闭正在运行中的其他软件
如果要在程序中关闭正在运行中的其他程序,可以先使用FindWindow函数找出相应的程序句柄,然后调用PostMessage函数关闭该程序即可,
这两个函数的声明如下:
Declare Function FindWindow Lib ″user32″ Alias ″FindWindowA″ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib ″user32″ Alias ″PostMessageA″ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
例如要检测“计算器”程序是否正在运行,如果是则关闭它,可以使用如下代码来实现:
Dim winHwnd As Long
Dim RetVal As Long
winHwnd=FindWindow(vbNullString,″计算器″)
If winHwnd〈〉0 Then
RetVal=PostMessage(winHwnd,&H10,0&,0&)
If RetVal=0 Then
MsgBox ″关闭计算器出错!″
End If
Else
MsgBox ″计算器程序没有运行。″
End If
原文转自:www.ltesting.net
2.教学设计:调用系统子程序 篇二
关键词:Matlab外部接口,混合编程,VC++,COM,自动化
1 引言
Matlab提供的编程语言———M语言———是以方便数值计算编程为目的设计的,所以其基本数据结构就是矩阵,且其变量的具体类型和大小可在执行时动态确定,这对编写数值计算程序提供了很大的便利。另外,由于M语言可直接调用Matlab提供的各种数学和面向工程应用的工具箱函数,所以使用M语言还可以迅速地解决许多计算量很大的工程问题。但另一方面,由于M语言是一种解释型编程语言,所以它的执行效率较低,另外其在开发应用程序界面和对外围设备的控制能力上也较差。另一方面,其他的编程环境,如VC++,则在这些方面提供了很好的支持,但如用其进行数值计算或解决工程问题又会非常不便。故如果对软件界面、外围设备控制、数值计算三方面都有较高的要求,一个理想的方案是在像VC++这样的编程环境中实现界面及外设控制功能,并在其中调用Matlab环境中的模块,如其工具箱函数,作为计算工具。
在VC++程序中调用Matlab有两种方法:一是通过Matlab提供的引擎库(Engine Library),它的本质是一个拥有定制接口IEngine的COM服务器;二是通过Matlab提供的COM Automation Server。本文将首先介绍COM和Automation技术的原理和应用方法,之后介绍这两个接口,并随后给出在C++中使用两者的具体方法。
2 COM与Automation
2.1 COM概述
组件对象模型(Component Object Model,COM)由Microsoft于1993年创建,它规定了dll、exe等应用模块之间进行交互的步骤和方法。在COM之前,一个应用程序(Client)如果要使用dll文件(Server)输出的功能就要使用Win32 API函数LoadLibrary,GetP-rocAddress,要使用exe文件(Server)输出的功能除了需使用相关的Win32 API函数外,还要使用基于Windows消息机制的DDE协议。COM则是Microsoft新推出的这些方法的换代品,它解决了不少在使用老方法时产生的问题,如他们本质上是面向过程的技术,使用起来比较零散复杂,且对系统来说,他们是无法管理的。COM则提供了一个面向对象的Server功能管理及Client/Server的通讯方法。但这需要应用编程者的配合,即COM不仅是Windows操作系统新增的一系列数据结构和函数,而且是一系列应用与系统交互方式的定义。
在COM中,Server模块(dll或exe)要向系统注册其输出的COM类,即在注册表中保存COM类的GUID(Global Unique Identifier),Server模块完整的路径及文件名等相关信息。一个Server模块可拥有多个COM类。于是,Client只要向系统提供其所需COM类的GUID系统就能找到包含这个类的模块并加载它。在注册COM类的同时,Server还要注册每个COM类所包含接口(interface)的GUID。从功能上说,一个接口就是Server输出的一个功能单元,它由一组功能上密切相关的函数指针构成;而用C++语言表达,COM接口就是一个仅包含虚函数的结构体,它本质上是一个包含一个函数指针数组的内存结构,这一内存结构是由Microsoft定义的标准。Client则是通过GUID向系统提交自己的请求,通过获得由Server提供的接口指针来调用Server的输出函数[1]。
事实上,接口是COM技术的核心要素,其最基础的接口是Microsoft定义的标准接口IUnknown,它包含QueryInterface、AddRe和Release三个函数,这些函数是Client与Server通信的基础。而所有其他的接口均需继承自IUnknown。这也是C++多态技术的一个应用。除了IUnknown,Microsoft还定义了许多其它接口,这些接口事实上是许多编程技术的底层基础,如IDispatch接口就是Automation技术的根本核心。同时需要说明的是,对其制定的大部分接口而言,Microsoft只是定义了接口的数据结构,接口函数功能的实现要由Server开发者完成。
可见,COM是一个Client、Server和操作系统协力合作。从操作系统的角度看COM是一个记录COM类的方式和一组用于Clien和Server通信的API函数。对Client来说COM是利用API向系统发出请求并利用接口指针使用COM类的功能。对Server来说则是利用API注册自己,实现所有接口函数,这包括由Microsoft定义的接口函数,如Server必须实现IUnknown接口的QueryInterface函数,其作用是为Client提供其所要求的所有接口指针。
2.2 Automation概述
由于接口本质上是一个包含一个函数指针数组的内存结构,这一内存结构是由Microsoft定义的标准,而所有支持COM的编译系统和语言对接口的处理都符合这一标准,所以通过COM,就可实现不同编译器、不同语言编写的应用顺利通信。但是仍有一个问题,就是想Visual Basic这样的解释性语言无法学习C++定义的接口。举例来说,如果一个C或C++程序要使用一个组件定义的接口IMath,它就需要声明接口的结构,如:
这样,在获得了接口指针,不妨叫pIMath,之后,就可以用“pIMath->Add(a,b);”这样的语句来使用Server的功能。但Visual Basic却不支持这样的语法,即它的解释程序无法以函数指针的形式学习新的接口定义。考虑到接口将会不断增长的事实,让Visual Basic把对所有接口的支持固化在解释程序中又是不可能的。所以,为了解决这类问题,Microsoft定义了IDispatch接口,其思想是,像VB这类语言的解释程序只需要支持IDispatch接口,就可以在执行时通过Server获得其需要函数的相关信息,从而完成调用。
整个接口的机制是Server要为输出的函数分配一个数字ID和一个相对应的标识字符串。Client只知道标识字符串,为了调用相应的函数,Client在获取IDispatch接口指针后,先调用其函数GetIDsOfNames()得到和标识字符串相对应的数字ID,再调用IDispatch的函数Invoke(),该函数专门负责根据输入的数字ID找到Client要求的函数,并调用它。Invoke()在调用函数时需要传递参数,而参数格式是无法由解释程序预知的,所以Invoke()使用了一种特殊的数据类型VARIANT来解决这一问题。VARIANT是一个结构体,它可以表示任何类型的数据。VARIANT主要由两部分组成,一是标识数据类型的vt,二是存储实际数据的union结构。函数的输入参数就被存储在一个VARIANT数组里被传递给Invoke。当然,之后解析各个变量并传递给输出函数的任务就交由Invoke()完成了。函数的返回值同样是以VARIANT形式回传的。这样,就解决了高级语言使用COM组件的问题。
所以,自动化(Automation)是建立在COM基础上的。一个自动化服务器实际上就是一个实现了IDisPatch接口的COM组件。而一个自动化控制器则是一个通过IDisPatch接口同自动化服务器进行通信的COM客户。
3 Matlab提供的COM Server接口
由于出现了Automation技术,访问COM组件就有了两种方式:(1)通过普通的自定义的COM接口访问组件;(2)通过调度接口IDisPatch访问组件;如果一个组件同时实现了这两种接口,则称为双重接口,那么客户就可自由的选择其中的一种方式访问组件的功能。Matlab就提供了这两种接口。
3.1 IEngine接口
IEngine是Matlab提供的定制接口,但通常在程序中不会直接使用它,而是使用Matlab提供的引擎库(Engine Library)函数。事实上,COM Server及其接口IEngine可看作是引擎库在Windows平台上的实现手段。当然,也可以把引擎库看作Matlab为方便IEngine的使用而提供的函数库。在使用引擎库时,完全不需要COM的知识,只需要把它看成一个非标准的C语言静态函数库即可。
引擎库共输出了9个函数,通过它们可以方便的开始和结束与Matlab Server的对话,设置命令窗口(缺省状态是显示命令窗口),与Matlab的工作空间交换变量,执行任何可在Matlab命令行执行的命令。使用引擎库和直接在Matlab命令行输入的方法是极为类似的。
3.2 IDispatch接口
IDispatch是Matlab为Visual Basic,C#等语言提供的接口,但在C++程序中也可以使用,只不过,这需要进行较多和COM相关的编程。如果使用VC++提供的MFC类COleDispatchDriver来使用Matlab自动化服务器,则可以大大简化这一过程。这些内容后面会详细讨论。
通过IDispatch接口获得的函数功能和引擎库类似,但功能更丰富更灵活些。例如,如果要调用统计工具箱的方差计算函数求某一双精度数组的方差,使用引擎库函数的流程必须是先通过engPutVariable()将数组存入Matlab,比如起名叫“a”;再用engEvalString()命令执行一条语句“b=std(a)”,这在执行命令的同时又在Matlab里建立了变量“b”;最后通过engGetVariable()将变量"b"取回。Matlab的自动化服务器则除了拥有支持上面流程的函数外,还提供了另一种可能性,即只需调用函数Feval()就可以了,因为Feval(可同时接受函数名,参数作为输入,并将Matlab的计算结果输出。
4 Matlab COM接口的VC++调用
在VC++中使用Server的关键问题有两类,一类是如何启动和释放Server,另一类是如何与Matlab进行数据交互。下面将分别针对这两方面,以一个具体的问题———方差的计算,待计算的数据保存在变量double Array[20]中———为例,说明调用Matlab两种COM接口的具体操作。下面的代码均经过实际测试使用,其环境为WindowXP,Visual C++6.0和Matlab 7.4.0。
4.1 Server的启动和释放
4.1.1 引擎库
使用引擎库在创建工程时不需要特别设置,但之后第一要在源文件中包含engine.h,它其中声明了引擎库函数的原型。engine.h中还包含头文件matrix.h,其最主要的内容是定义了数据类型mxArray及对它进行操作的函数原型。mxArray类型是许多引擎库函数的参数类型,它是C++程序和Matlab进行数据交互的工具。而matrix.h中又包含tmwtypes.h,这一头文件中也定义了一些数据类型。三个头文件的路径均为Matlab安装目录下的externinclude。将engine.h包含入源文件有三种方法,其一是在源文件中包含完整的路径和文件名,如“#include"D:matlabexternincludeengine.h”;其二是仅包含文件名,但把上述三个头文件全部拷贝到工程目录中;其三也是只包含文件名,但要在VC++6.0的Tool菜单的Option命令对话框的Directory选项卡中,把头文件所在路径添加到include搜索路径中。这之后,还要为工程加入两个库文件———libeng.lib和libmx.lib,其中libeng.lib实现了引擎库函数,而libmx.lib则实现了操作mxArray需要的各个函数。它们路径均为Matlab安装目录下的externlibwin32microsoft。具体操作为右键单击VC++6.0左侧Workspace里FileView的工程文件,在弹出菜单中选择“Add File to Project”,之后在弹出的对话框中转到上述目录后将文件过滤设为“Library Files”就可以选择所要的库文件了。为方便代码的移植,则可以先将上述文件复制到工程所在目录再进行添加。
在做好这些准备工作后,就可以正式使用引擎库了。引擎库启动可使用如下代码:
4.1.2 自动化服务器
在C++程序中直接用Win32 API操作自动化服务器是比较繁琐的,所以笔者对自动化服务器的操作是通过MFC的COleDispatchDriver类完成的。这就要求在创建工程时要加入对MFC类的支持。之后,启动Class Wizard,单击其新建类按钮中的“从类库(type library)”命令从而打开“从类库导入”为标题的对话框。在对话框中转入Matlab安装目录下的binwin32文件夹,选择其中的mlapp.tlb文件就可以生成继承自COleDispatchDriver类的DIMApp类。
完成上述工作,就可用下面代码启动Matlab自动化服务器:
4.2 数据交换
无论是采用哪种调用方式,Client都需要一种中间数据类型来与Matlab交互数据。当要把参数传递给Matlab时,Client需要先把自己的数据转换成中间类型;当从Matlab获取结果时,Client要从中间类型中提取原始数据。对引擎库来说,这种中间类型是mxArray;对自动化服务器来说,这种中间类型是VARIANT。下面通过代码来说明这两种方式。
4.2.1 引擎库
使用引擎库的代码如下:
4.2.2 自动化服务器
使用自动化服务器的代码如下:
5 总结
COM是Microsoft公司提供的提高应用互操作性能的接口,利用Matlab提供的两个COM接口———IEngine和IDispatch,在Matlab引擎库或MFC类COleDispatchDriver的帮助下,VC++程序可很轻松的在程序中使用Matlab丰富的函数和图形功能[2],从而加快程序的开发。但这需要Matlab环境的运行。除了Matlab engine library(引擎库)和COM Automation Server,Matlab对COM的支持还有MATLAB Builder for.NET。它可以根据编程人员的要求将一组M文件编译成可供其它支持COM语言调用的COM组件,VC++程序使用这些组件就可以脱离Matlab[3],但不是所有的Matlab函数都可以被编译。
参考文献
[1]Shepherd G,Wingo S.MFC internals:inside the microsoft Foundation Class architecture[M].Reading,Mass:Addison-Ewsley,1996:435-497.
[2]赵启蒙,高美娟.通过面向对象编程调用MATLAB绘图的实现[J].大庆石油学院学报,2004,28(1):80-82.
3.DSP系统程序设计论文 篇三
实际上,只有从芯片开始仔细设计,才能方便地实现多处理器系统的调节功能。这里选用的是AD公司新出品的SHARC级处理器ADSp21160。
ADSp21160具有很大的片内存储区、多重内部总线结构、独立的I/O子系统;具有构造多处理器系统的所有特点,能够真正支持处理器数目的可调节功能,十分适合组成高性能浮点的多DSp系统。
VxWorks是目前世界上用户数量最大的实时操作系统。这使它除了具有优越的技术性能之外,还具有丰富的应用软件支持、良好的技术服务和可靠的系统稳定性。由于它具有以上优点,本系统中选用了VxWorks作为MVME167的操作系统。
一、ADSp21160的特点
ADSp21160 是AD公司采用超级哈佛结构的一种新产品。21160的汇编代码与2106x兼容,处理器具有SIMD(单指令流多数据流)功能;而2106x只具有SISD(单指令流单数据流)功能。为了充分利用这种新的功能,一些指令做了一些改变。ADSp21160包括1个100/150MHz的运算核、双端片内SRAM、1个支持多处理器的集成在片内的I/O处理器和多重内部总线以消除I/O瓶颈。
ADSp21160的汇编源代码与2106x兼容。SIMD计算结构:2个32bit的计算单元,其中每一个单元包括乘法器、ALU、移位寄存器及寄存器文件。具有完备的与外围设备接口功能。包括独立的I/O处理器、4Mbit 的片内双端SRAM、可直接连接的多处理器特性及端口(串口、连接口、外总线及JTAG)。
ADSp21160包括2个运算处理单元,具有SIMD功能。处理单元指的是pEX和pEY。pEX始终是有效的,而pEY的有效是通过设置MODE1寄存器中的pEYEN位来实现的。当pEY模式有效时,同一条指令在2个处理器单元中都得到执行,但每一个处理器单元中的操作数不同。
SIMD模式在存储区和处理器单元之间的数据传输也是很有作用的。当使用SIMD模式,通过加倍数据带宽来保证处理器单元的操作。在SIMD模式,当使用DAGs来传输数据时,存储区每次访问所传输的是两个数据值。
ADSp21160包括4Mbit的片内SRAM,分为两块,每一块2Mbit。可以定义为不同字长的指令和数据存储。每一个存储块的双端口结构可以使存储块独立地被运算核处理和I/O处理器访问。21160的存储区最大可以容纳128K的32bit数据,或256K的16bit数据,或85K的48bit指令,或其他混合字长的数据,但总和最大为4Mbit。所有存储区可以16、32、48、64bit字长的字访问。外端口支持处理器与片外存储器及外设的接口,片外的4G地址空间属于21160的统一地址空间。
外端口支持同步、异步及同步BURST访问。DMA控制器的操作相对处理器运算核是独立和不可见的,即DMA操作可与执行指令同时进行。DMA传输可以在内部存储区与外部存储区、外围设备或主机之间进行。21160共有14个DMA通道,其中:连接口(linkport)占6个;串口占4个;外端口(external port)占4个。21160可以通过DMA传输来下载程序,外围异步设备也可以通过DMA请求/应答线来控制2个DMA通道。
21160具有许多特点支持多DSp系统。外端口与连接口支持多处理器系统的直接连接,外端口支持统一的地址空间,允许DSp之间互相访问。片内具有分布式总线仲裁逻辑,最多支持6片21160和主机连接。外端口的最大数据传输率为400MB/s,广播写信号可以同时发
送到各片21160。6个连接口提供了另一种方法实现多处理器之间的通信。连接口的最高传输速率为600MB/s。
整个系统基于VME总线。VME总线系统作为最早的国际通用开放式总线,自1981年起,经历了近20年的发展。其影响不断扩大,功能不断完善,现已成为性能最好、应用最广的国际总线标准之一。
根据设计要求,采用了4片ADSp21160。片外共享内存SRAM可以被主机和各片DSp直接访问;EpROM用来存放初始化程序和各片DSp要运行的程序,在系统上电后这些程序被下载到各片DSp中;LEDs用来显示插件的状态,如reset、normal等。每一片都有1个连接口连到插件的前面板,这样前端采集来的数据就可以很方便地传输到多DSp上,而且也使数据的传输模式更加灵活。
连接口(linkport)是SHARC系列DSp芯片的一个特点。ADSp21160共有6个8bit连接口提供额外的I/O服务。在100MHz时钟下运行时,每个连接口可达100MB/s。连接口尤其适合多处理器间点到点的连接。连接口可以独立地同时操作,通过连接口的数据封装成48/32bit字长后,可以从片内存储区直接被运算核读取或DMA传输。每一个连接口有它自己的双缓冲I/O寄存器,数据传输可编程,硬件由时钟/应答握手线控制。4片DSp使用连接口实现DSp间两两互连。
21160的主机接口可以很方便地与标准微处理器总线(16/32bit)相连,几乎不需要额外硬件。主机通过21160的外端口对其进行访问,存储区地址映射为统一的地址空间。4个DMA通道可以用于主机接口,代码和数据传输的软件开销很小,主处理器通过Hbr、HBG和REDY信号线与21160进行通信,主机可以对片内存储区进行直接读写。
二、开发环境Tornado
VxWorks的开发环境是WindRiver公司提供的Tornado。Tornado采用主机-目标机开发方式,主机系统可采用运行Sun Solaris、Hp-UX以及Win95/NT的工作站或个人计算机,VxWorks则运行在Intel x86、MC68K、powerpC或SpARC等处理器上。Tornado支持各种主机-目标机连接方式,如以太网、串行线、在线仿真器和ROM仿真器。
Tornado的体系结构使得许多强有力的开发工具可以用于各种目标机系统和各种主机-目标机连接方式下,而不受制于目标机的资源和通信机制。同时VxWorks具有良好的可剪裁性。因此它适用于各种嵌入式环境的开发,小到资源极其有限的个人手持式设备如pDA(personal Digital Assistant);大到多处理机系统,如VME系统。
Tornado可提供一个直观的、可视化的、用户可扩充的开发环境,极大缩短了开发周期。同时,由于Tornado是一个完全的开放系统,使得集成第三方开发工具变得十分容易。
主机与目标机之间的通信是通过运行各自处理器上的代理进程来完成的,使主机上的开发工具和目标机的操作系统可以完全脱离相互连接的方式。
为了摆脱主机-目标机通信带宽和目标机资源的限制,Tornado将传统的目标机方的工具迁移到主机上,如shell、loader和符号表等。这样,系统不再需要额外的时间和带宽在主机和目标机之间交换信息,降低了对连接带宽的需求,也避免了目标机的资源(如内存)被工具或符号表大量占用,使得应用程序拥有更多的系统资源。同时这种迁移也使得各种主机开发工具独立于目标机存在,从而使同一主机平台上的工具可以用于所有的目标机系统。
作为一个应用软件开发环境,Tornado提供了友好的可视化开发界面、交叉编译环境、源码级调试工具、目标机命令解释器和目标机状态监视器等多种应用工具,为应用软件开发提供了一个高效而可靠的平台。
三、程序设计
我们选用的DSp开发工具是AD公司提供的VisualDSp。这是一个集成开发环境,支持对SHARC系列DSp芯片的开发。实时操作系统VxWorks的开发工具是WindRiver公司的Tornado集成开发工具。VisualDSp可以C语言或汇编语言编
写的DSp代码,最新版本的VisualDSp还支持C++。它还有1个优点,就是可以编译多片DSp的源代码,并产生下载文件,这就可以很方便地进行多DSp系统的软件模拟。
ADSp21160阵列的设计结构使它既可以构成单指令流多数据流(SIMD)的并行处理机,也可以构成多指令流单数据流(MISD)或多指令流多数据流(MIMD)的流水线处理机,视用户的要求而定。这两种并行方案的选择,简单来说就是选择分割数据流还是分割处理工序。SIMD方案的原理如图1所示。
以下介绍我们实验室承担的水声信号处理系统。本系统以VME总线为系统开发平台,前端调理模件、模数转换模件和前端控制模件等为VME插件,采用SHARC级DSp芯片阵列完成声纳信号实时处理,基于嵌入式实时操作系统VxWorks及X窗口系统的中央控制和显示。
图2是4片DSp的任务分配图。从前端采集来的信号,经波束形成和复解调,再经过窄带滤波后的信号分为两路,一路送去进行幅度检波,一路做频域处理。幅度检波就是对复信号求模,根据信号幅度判决有无目标存在。频域处理分两种情况:当发射信号为单频脉冲时,进行功率谱估计,然后根据多普勒频移估计目标速度;当发射信号为双曲调频信号时,进行相关处理。
声纳综合数据处理主要包括主动声纳信号处理和被动声纳信号处理。其中,主动声纳信号处理又根据发射信号的不同,分为非相干处理、相干处理、功率谱处理。声纳综合数据处理主要完成:目标自动检测、目标参数测定和动目标跟踪。
四、操作流水线
操作流水线是模块内数据计算与I/O的流水线,物理上表现为CpU与I/O端口的DMA之间的并行。在前端处理中由于数据率高,通信开销很大。以通信任务最为繁重的复解调和多普勒补偿模块为例,输入数据率为2Mw/s,输出数据率为4Mw/s,高速连接口Linkport最高速率为100Mw/s,如果采用串行传输的话,通信时间就将占用60%以上的处理时间,计算时间显然严重不足。所以必须采用并行执行,流程图如图3所示。这也是一种异步流水线方式,每次传送和计算完成都须要设置标志以通知下一操作。
结束语
在VxWorks实时操作系统下,4片ADSp21160上的程序已经通过模拟输入和系统测试。采用SHARC DSp 阵列能够很好地完成声纳信号实时处理,每一片DSp至少有10%的计算裕量,基本达到设计要求。
送到各片21160。6个连接口提供了另一种方法实现多处理器之间的通信。连接口的最高传输速率为600MB/s。
整个系统基于VME总线。VME总线系统作为最早的国际通用开放式总线,自1981年起,经历了近20年的发展。其影响不断扩大,功能不断完善,现已成为性能最好、应用最广的国际总线标准之一。
根据设计要求,采用了4片ADSp21160。片外共享内存SRAM可以被主机和各片DSp直接访问;EpROM用来存放初始化程序和各片DSp要运行的程序,在系统上电后这些程序被下载到各片DSp中;LEDs用来显示插件的状态,如reset、normal等。每一片都有1个连接口连到插件的前面板,这样前端采集来的数据就可以很方便地传输到多DSp上,而且也使数据的传输模式更加灵活。
连接口(linkport)是SHARC系列DSp芯片的一个特点。ADSp21160共有6个8bit连接口提供额外的I/O服务。在100MHz时钟下运行时,每个连接口可达100MB/s。连接口尤其适合多处理器间点到点的连接。连接口可以独立地同时操作,通过连接口的数据封装成48/32bit字长后,可以从片内存储区直接被运算核读取或DMA传输。每一个连接口有它自己的双缓冲I/O寄存器,数据传输可编程,硬件由时钟/应答握手线控制。4片DSp使用连接口实现DSp间两两互连。
21160的主机接口可以很方便地与标准微处理器总线(16/32bit)相连,几乎不需要额外硬件。主机通过21160的外端口对其进行访问,存储区地址映射为统一的地址空间。4个DMA通道可以用于主机接口,代码和数据传输的软件开销很小,主处理器通过Hbr、HBG和REDY信号线与21160进行通信,主机可以对片内存储区进行直接读写。
二、开发环境Tornado
VxWorks的开发环境是WindRiver公司提供的Tornado。Tornado采用主机-目标机开发方式,主机系统可采用运行Sun Solaris、Hp-UX以及Win95/NT的工作站或个人计算机,VxWorks则运行在Intel x86、MC68K、powerpC或SpARC等处理器上。Tornado支持各种主机-目标机连接方式,如以太网、串行线、在线仿真器和ROM仿真器。
Tornado的体系结构使得许多强有力的开发工具可以用于各种目标机系统和各种主机-目标机连接方式下,而不受制于目标机的资源和通信机制。同时VxWorks具有良好的可剪裁性。因此它适用于各种嵌入式环境的开发,小到资源极其有限的个人手持式设备如pDA(personal Digital Assistant);大到多处理机系统,如VME系统。
Tornado可提供一个直观的、可视化的、用户可扩充的开发环境,极大缩短了开发周期。同时,由于Tornado是一个完全的开放系统,使得集成第三方开发工具变得十分容易。
主机与目标机之间的通信是通过运行各自处理器上的代理进程来完成的,使主机上的开发工具和目标机的操作系统可以完全脱离相互连接的方式。
为了摆脱主机-目标机通信带宽和目标机资源的限制,Tornado将传统的目标机方的工具迁移到主机上,如shell、loader和符号表等。这样,系统不再需要额外的时间和带宽在主机和目标机之间交换信息,降低了对连接带宽的需求,也避免了目标机的资源(如内存)被工具或符号表大量占用,使得应用程序拥有更多的系统资源。同时这种迁移也使得各种主机开发工具独立于目标机存在,从而使同一主机平台上的工具可以用于所有的目标机系统。
作为一个应用软件开发环境,Tornado提供了友好的可视化开发界面、交叉编译环境、源码级调试工具、目标机命令解释器和目标机状态监视器等多种应用工具,为应用软件开发提供了一个高效而可靠的平台。
三、程序设计
我们选用的DSp开发工具是AD公司提供的VisualDSp。这是一个集成开发环境,支持对SHARC系列DSp芯片的开发。实时操作系统VxWorks的开发工具是WindRiver公司的Tornado集成开发工具。VisualDSp可以C语言或汇编语言编
写的DSp代码,最新版本的VisualDSp还支持C++。它还有1个优点,就是可以编译多片DSp的源代码,并产生下载文件,这就可以很方便地进行多DSp系统的软件模拟。
ADSp21160阵列的设计结构使它既可以构成单指令流多数据流(SIMD)的并行处理机,也可以构成多指令流单数据流(MISD)或多指令流多数据流(MIMD)的流水线处理机,视用户的要求而定。这两种并行方案的选择,简单来说就是选择分割数据流还是分割处理工序。SIMD方案的原理如图1所示。
以下介绍我们实验室承担的水声信号处理系统。本系统以VME总线为系统开发平台,前端调理模件、模数转换模件和前端控制模件等为VME插件,采用SHARC级DSp芯片阵列完成声纳信号实时处理,基于嵌入式实时操作系统VxWorks及X窗口系统的中央控制和显示。
图2是4片DSp的任务分配图。从前端采集来的信号,经波束形成和复解调,再经过窄带滤波后的信号分为两路,一路送去进行幅度检波,一路做频域处理。幅度检波就是对复信号求模,根据信号幅度判决有无目标存在。频域处理分两种情况:当发射信号为单频脉冲时,进行功率谱估计,然后根据多普勒频移估计目标速度;当发射信号为双曲调频信号时,进行相关处理。
声纳综合数据处理主要包括主动声纳信号处理和被动声纳信号处理。其中,主动声纳信号处理又根据发射信号的不同,分为非相干处理、相干处理、功率谱处理。声纳综合数据处理主要完成:目标自动检测、目标参数测定和动目标跟踪。
四、操作流水线
操作流水线是模块内数据计算与I/O的流水线,物理上表现为CpU与I/O端口的DMA之间的并行。在前端处理中由于数据率高,通信开销很大。以通信任务最为繁重的复解调和多普勒补偿模块为例,输入数据率为2Mw/s,输出数据率为4Mw/s,高速连接口Linkport最高速率为100Mw/s,如果采用串行传输的话,通信时间就将占用60%以上的处理时间,计算时间显然严重不足。所以必须采用并行执行,流程图如图3所示。这也是一种异步流水线方式,每次传送和计算完成都须要设置标志以通知下一操作。
结束语
4.教学设计:调用系统子程序 篇四
题
目
小型职工工资管理系统
专业班级
2016级通信工程本科1班
组
别
通信第二组
学生姓名
院(系)
信息工程系
指导教师(职称)
完成时间
2017年5月31日
课程设计任务书
题目职工工资管理系统 班级2016级通信工程本科1班 学号 201605070106 姓名 学号 201605070111 姓名 学号 201605070118 姓名 学号 201605070119 姓名 学号 201605070136 姓名
一、主要内容:
本课程设计结合本学期所学C语言知识,准备设计开发一个简单职工工资管理系统。工资管理系统是企业不可或缺的一部分,它利用计算机对员工工资进行统一管理,实现工资管理系统的系统化、规范化和自动化,为企业提高工作效率。设计开发这个系统需要用到单链表、文件读取操作、结构体、函数、指针等C语言知识。本课程设计准备通过Windows控制台应用程序实现职工工资管理系统的简单运行。利用所学知识,本着简单、易用的设计原则,本课程设计尽量实现良好、美观的“人机界面”,便于软件的操作使用。本次设计主要学习内容包括:
(一)进一步学习并熟练掌握C语言语法和编程思想。
(二)学习C语言提供的库函数,熟悉Visual C++ 6.0的开发工具。
(三)学习C语言函数、链表、结构体、文件读取、指针等知识。
(四)学习如何查阅他人的文档进行软件的设计与开发。
二、基本要求:
(一)质量要求
1.职工工资管理系统基本功能模块的设计应包括:显示主菜单功能、职工信息 的录入、添加、删除、修改、查询、排序功能,退出系统。测试文件的读取与存储是否正常、测试评估界面是否合理,友好。
2.对职工工资管理系统设计并进行调试、修复、完善、测试。3.定期主动向指导教师汇报任务进度,认真填写相关报告文档。4.按时完成各阶段工作,不突击,不抄袭。
(二)进度要求
1.明确课程设计任务,搜集资料:2017年2月28日—3月14日。
2.完成程序的设计与实现,撰写课程设计论文初稿:2017年3月15日—5月15日。
3.与指导教师沟通,完成课程设计论文定稿:2016年5月16日—2017年5月28日。
4.进入课程设计论文审阅阶段,准备答辩:2017年5月29日—6月9日。
三、主要参考资料:
1.工资管理系统课程设计程序http://blog.csdn.net/JZQT_T/article/category/2317235
2.C语言程序设计规范及基础
https://wenku.baidu.com/view/58b***409c7b.html 3.《明解C语言 第3版》,(日)柴田望洋著,人民邮电出版社 4.《C Primer Plus 第6版 中文版》,姜佑 译,人民邮电出版社 5.《C程序设计 第四版》,谭浩强著,清华大学出版社 6.《C和C++实物精选》,徐波著,北京邮电出版社
学 生 签 名: 指导教师签名:
年 月 日
目录 概述...............................................1 1.1 设计思想.................................................................................................................................1 1.2 设计原则.................................................................................................................................1 1.3 性能需求.................................................................................................................................1 1.4 课程设计报告内容及分工情况.............................................................................................2 1.4.1 课程设计报告内容.........................................................................................................2 1.4.2 课程设计分工情况.........................................................................................................2 2 总体设计...........................................3 2.1 系统功能设计图.....................................................................................................................3 2.2 主函数 main().........................................................................................................................3 2.3 程序流程图..............................................................................................................................4 3 详细设计...........................................4 3.1 函数..........................................................................................................................................4 3.2 函数流程图..............................................................................................................................9 4 运行结果与调试....................................16 4.1 运行结果...............................................................................................................................16 4.2 程序调试...............................................................................................................................21 结束语..............................................22 附录................................................24 概述
1.1 设计思想
1.系统分成几个相对独立的模块,但这些模块都进行集中式管理。
2.分层的模块化程序设计思想,整个系统采用模块化结构设计作为应用程序,有较强的可操作性和扩展性。
3.合理的数据设计,在应用系统设计中,相对独立的模块间以数据相互连接,使各模块间的耦合性较低,方便系统运行,提高系统安全性。
1.2 设计原则
为了使本系统功能齐全完备,操作简便,最大限度的提高软件的质量,从而满足用户的实际需要,在设计开发过程中遵循了如下原则:
1.合法性原则:依据产品核算系统的工作规定以及要求,参照核算实际的工作情况,进行诸如产品进货、销售等工作。
2.实用性原则:适合产品信息管理工作的实际需求,并能够处理一些特殊情况的要求,此外,尽可能预留空间,以便扩充功能。
3.准确性原则:对输入的相关资料建立检错机制,及时报错,使用户能够及时准确的输入合法资料(如:类型匹配,长度不超限等)。
4.易操作原则:要求设计的系统功能齐全,界面友好,操作方便,必要的地方进行提示。
5.源程序可读性原则:为了便于其他设计,维护人员读懂代码或以后的代码修改,软件升级维护,即可能做好代码注释工作。
1.3 性能需求
(1)支持工资信息一次性多组导入
(2)非法操作能够提示错误并且知道安全行为方式(3)信息查询时界面显示数量
1.4 课程设计报告内容及分工情况
1.4.1课程设计报告内容
1.系统功能模块结构图和程序流程图 2.数据结构设计及用法说明
3.程序结构(画功能模块图或流程图)4.各模块的功能
5.实验结果(包括输入数据和输出结果)6.设计体会 7.参考文献
1.4.2 课程设计分工情况
本组共有5人,具体分工情况如下:
(1)学号:201605070106,姓名:司笑笑,具体负责功能模块结构图和程序流 程图的设计;负责“排序”代码的编写及整体代码的整合;负责程序设计报告中函数详细设计。
(2)学号:201605070111,姓名:代慧,负责“添加”、“录入”代码的编写;负责显示界面的优化、美化。
(3)学号:201605070118,姓名:王春亚,负责“查询”代码的编写;程序的测试与调试。
(4)学号:201605070119,姓名:董子阳,负责“修改”代码的编写;具体负责实验结果的采集;程序设计报告书的校对;负责流程图的绘制。
(5)学号:201605070136,姓名:马良智,负责“删除”代码的编写;具体负责程序设计报告书的排版与完善;相关文献的查找和参考。总体设计
2.1 系统功能设计图
系统功能设计是使整个系统能基本实现职工工资管理功能,能让公司的管理者利用计算机对员工工资进行统一管理,实现工资管理系统的系统化、规范化和自动化,提高了工作效率。管理信息系统(MIS)主要的功能就是进行信息的收集、查询、存储,同时对这些信息进行维护的。
本系统共包括七大模块,分别是录入模块,添加模块,修改模块,删除模块,查询模块,排序模块,输出模块。系统功能模块设计如图2-1所示。
图2-1 小型职工工资管理系统功能模块结构图
2.2 主函数 main()
(1)函数的功能: 用于联系各个功能函数模块,以及退出程序时的退出画面提示。
(2)函数的入口: 整个程序是从主函数开始的。
(3)函数的出口: 当从main()的switch()开关结构中进入,即choise的值大于7时通过return退出main()函数,即:退出整个程序。(4)函数调用关系:该函数不被其它函数调用。
2.3 程序流程图
详细设计
3.1 函数
(1)功能函数mainMenu()①函数的功能:显示主菜单
②函数的入口:从main()进入,main()运行时进入该函数。③函数调用关系:被主函数调用。
④函数的出口:当主菜单显示在屏幕上,结束该函数。(2)功能函数input(LinkList head)①函数的功能:进入录入职工信息系统。
②函数的入口:程序从main()的switch()开关结构中进入,即choice的值为1时,开始进入该函数,进入函数后,首先用inputMenu()显示录入菜单选项,然后选择选项进行录入职工信息。
③函数调用关系:被主函数调用。从switch()开关结构中进入,并在文中无返回值的空值void函数。
④函数的出口:录入职工信息完成后,结束该函数而并执行主函数main()中“output(head);”,输出职工信息在屏幕上并保存职工信息在磁盘上,然后执行“break;”跳出switch()开关函数,继续执行while循环结构。(3)功能函数inputMenu()①函数的功能:显示录入菜单。
②函数的入口:从input(LinkList head))进入,input(LinkList head)被调用时进入该函数。
③函数调用关系:被input(LinkList head))调用,并在文中无返回值的空值void函数。
④函数的出口:当录入菜单显示在屏幕上,结束该函数。(4)功能函数hand(LinkList head)①函数的功能:进入“手动录入职工信息”。
②函数的入口:程序从input(LinkList head)的switch()开关结构中进入,即choice的值为1时,开始进入该函数,进入函数后,首先输入录入职工人数,然后逐个录入职工信息。
③函数调用关系:被input(LinkList head)调用。从switch()开关结构中进入,并在文中无返回值的空值void函数。
④函数的出口:录入全部职工信息完成后,结束该函数并执行input(LinkList head)中“break;”跳出switch()开关函数,继续执行while循环结构。(5)功能函数read(LinkList head)
①函数的功能:进入“文件录入职工信息”。
②函数的入口:程序从input(LinkList head)的switch()开关结构中进入,即choice的值为2时,开始进入该函数,进入函数后,输入需要录入的文件路径fileName,通过fopen()函数,即“if((fq=fopen(fileName,“r”))==NULL)” 打开文件,进入数据的处理。
③函数调用关系:被input(LinkList head)调用。从switch()开关结构中进入,并在文中无返回值的空值void函数。
④函数的出口:自动录入文件中全部职工信息后,结束该函数并执行input(LinkList head)中“break;”跳出switch()开关函数,继续执行while循环结构。(6)功能函数output(LinkList head)①函数的功能:输出职工信息。
②函数的入口:程序在录入、添加、修改、删除、查询、排序后都进入该函数,进入函数后,将职工信息用printf()标准输出到屏幕上,然后通过fopen()函数,即“if((fp=fopen(“d:worker.dat”, “w”))== NULL)” 打开文件,将职工信息写到d:worker.dat文件中。
③函数调用关系:被main()等多个调用。在文中无返回值的空值void函数。④函数的出口:将职工信息用printf()标准输出到屏幕上,将职工信息存入磁盘后,结束该函数。
(7)功能函数add(LinkList head)①函数的功能:添加一个职工信息。
②函数的入口:从main()的switch()开关结构中进入,即choice的值为2的时侯,进入该函数,根据提示输入职工信息。
③函数调用关系:被主函数调用。由switch()开关结构中进入,并在文中有返回值的整型int函数,返回值为1添加成功。
④函数的出口:职工信息添加成功返回1后结束该函数,并执行主函数main()中“output(head);”,输出职工信息在屏幕上并保存职工信息在磁盘上,然后执行“break;”跳出switch()开关函数,继续执行while循环结构。(8)功能函数deleteWorker(LinkList head)①函数的功能:删除 一个职工信息。
②函数的入口:从main()的switch()开关结构中进入,即choice的值为3的时侯,进入该函数,输入要删除的职工编号,删除改编号职工信息。
③函数调用关系:被主函数调用。由switch()开关结构中进入,并在文中有返回值的整型int函数,返回值为1删除成功。
④函数的出口:职工信息删除成功返回1后结束该函数,并执行主函数main()
中“output(head);”,输出剩余的职工信息在屏幕上,然后执行“break;”跳出switch()开关函数,继续执行while循环结构。(9)功能函数update(LinkList head)①函数的功能:修改一个职工信息。
②函数的入口:从main()的switch()开关结构中进入,即choice的值为4的时侯,进入该函数,输入要修改的职工编号,根据提示输入新的职工信息。
③函数调用关系:被主函数调用。由switch()开关结构中进入,并在文中有返回值的整型int函数,返回值为1修改成功。
④函数的出口:职工信息修改成功返回1后结束该函数,并执行主函数main()中“output(head);”,输出职工信息在屏幕上并保存职工信息在磁盘上,然后执行“break;”跳出switch()开关函数,继续执行while循环结构。(10)功能函数find(LinkList head)①函数的功能:进入查询职工信息系统
②函数的入口:程序从main()的switch()开关结构中进入,即choice的值为5时,开始进入该函数,进入函数后,首先用findMenu()显示查询菜单选项,然后选择选项进行查询职工信息。
③函数调用关系:被主函数调用。从switch()开关结构中进入,并在文中无返回值的空值void函数。
④函数的出口:查询职工信息完成后,结束该函数,然后执行主函数main()中的“break;”跳出switch()开关函数,继续执行while循环结构。(11)功能函数 findMenu()①函数的功能:显示查询菜单。
②函数的入口:从find(LinkList head)进入,find(LinkList head)被调用时进入该函数。
③函数调用关系:被find(LinkList head)调用,并在文中无返回值的空值void函数。
④函数的出口:当查询菜单显示在屏幕上,结束该函数。(12)功能函数findByWay(LinkList head, int n)①函数的功能:查询职工信息”。
②函数的入口:程序从find(LinkList head)的switch()开关结构中进入,即choice的值为1,2,3,4,5,6时,开始进入该函数,进入函数后,根据不同的选项值进行相应的查询。
③函数调用关系:被find(LinkList head)调用。从switch()开关结构中进入,并在文中有返回值的的整型int函数,返回值为1查询成功。
④函数的出口:查询职工信息完成后,执行“output(head);”,输出职工信息在屏幕上并保存职工信息在磁盘上,然后结束该函数,执行find(LinkList head)中“break;”跳出switch()开关函数,继续执行while循环结构。(13)功能函数sort(LinkList head)①函数的功能:进入职工信息排序系统
②函数的入口:程序从main()的switch()开关结构中进入,即choice的值为6时,开始进入该函数,进入函数后,首先用sortMenu()显示排序菜单选项,然后选择选项进行职工信息排序。
③函数调用关系:被主函数调用。从switch()开关结构中进入,并在文中无返回值的空值void函数。
④函数的出口:职工信息排序完成后,结束该函数,然后执行主函数main()中的“break;”跳出switch()开关函数,继续执行while循环结构。(14)功能函数 sortMenu()①函数的功能:显示排序菜单。
②函数的入口:从sort(LinkList head)进入,sort(LinkList head)被调用时进入该函数。
③函数调用关系:被sort(LinkList head)调用,并在文中无返回值的空值void函数。
④函数的出口:当排序菜单显示在屏幕上,结束该函数。(15)功能函数sortByWay(LinkList head, int n)①函数的功能:职工信息排序。
②函数的入口:程序从sort(LinkList head)的switch()开关结构中进入,即choice的值为1,2,3,4,5,6时,开始进入该函数,进入函数后,根据不同的选项值进行相应的排序。
③函数调用关系:被sort(LinkList head)调用。从switch()开关结构中进入,并在文中有返回值的的整型int函数,返回值为1排序成功。
④函数的出口:职工信息排序完成后,执行“output(head);”,输出职工信息在屏幕上并保存职工信息在磁盘上,然后结束该函数,执行sort(LinkList head)中“break;”跳出switch()开关函数,继续执行while循环结构。(16)功能函数uqnum(LinkList head, int num)
①函数的功能:判断职工编号是否已存在。
②函数的入口:程序add(LinkList head)中进入,输入职工编号后,开始进入该函数,进入函数后,判断输入的职工编号是否已经存在。
③函数调用关系:被add(LinkList head)调用。在文中有返回值的的整型int函数,返回值为1职工编号已存在。
④函数的出口:判断职工编号是否已存在后返回add(LinkList head),继续输入其它职工信息或重新输入职工编号。
功能实现效果如图3-1所示。
图3-1 主菜单界面
3.2 函数流程图
(1)录入职工信息
该功能模块流程如图3-2所示。
图3-2 “录入职工信息”功能模块流程图
(2)添加职工信息
该功能模块流程如图3-3所示。
图3-3 “添加职工信息”功能模块流程图
(3)删除职工信息
该功能模块流程如图3-4所示。
图3-4“删除职工信息”功能模块流程图
(4)修改职工信息
该功能模块流程如图3-5所示。
图3-5“修改职工信息”功能模块流程图
(5)查询职工信息
该功能模块流程如图3-6所示。
图3-6“查询职工信息”功能模块流程图
(6)排序职工信息
该功能模块流程如图3-7所示。
图3-7“排序职工信息”功能模块流程图 运行结果与调试 4.1 运行结果
本系统运行初始页面如图4-1所示。
图4-1 初始页面
在函数开始时,初始化临时结构体数组,让结构体内所有信息为空.,读取目标文件,然后运行功能函数,选择需要的功能。
实现效果如图4-2所示。
图4-2 输入界面
(1)根据自己需要的功能输入相应数字
图4-3职工信息的录入
图4-4职工信息的添加
图4-5职工信息的删除
4-6职工信息的修改
图4-7职工信息的查询
图4-8职工信息的排序
图4-9退出系统
(2)录入职工的信息,通过手动录入和文件录入两个方法录入职工的信息。
图4-10职工信息录入的方式
(3)查找职工的个人信息,通过输入编号、姓名、部门、基本工资、奖金和总工资进行查找。
图4-11职工信息的查询方式
(4)职工信息的排序可以通过编号排序、姓名排序、部门排序、基本工资排序、奖金排序和总工资排序。
图4-12职工信息的排序方式
(5)每次将职工信息输出在屏幕上时,都会通过fwrite写到文件D:woker.date中。
(6)根据数字提示结束程序。
4.2 程序调试
(1)每个选择界面之后,前一屏幕的内容依旧存在,影响界面的美观;经过同学的帮助及上网搜索,发现利用“system(“cls”);”可以消去前一屏幕的内容;然而接下来又出现新的问题:有些函数会出现错误;经过多次调试和修改,才发现把“system(“cls”);”放在调用的函数之前以及适当的位置可以解决此问题。(2)修改员工信息时,输入职工编号查询出多条信息,修改错误!后来加入职工编号唯一判断的函数,让职工编号唯一不重复。
(3)排序,开始交换指针指向,一直出现指针不存在导致乱码问题,后来修改为交换指针的数据域。
(4)文件写入磁盘,用笔记本打开磁盘内的文件乱码,经查询资料了解写入磁盘的文件是二进制数据,不能通过笔记本打开,可重新把文件读入程序中,在程序中显示。
(5)忘导入
结束语
工资管理系统对于决策者和管理者来说都至关重要,所以工资管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件工资档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对工资信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高工资管理的效率,也是科学化、正规化管理的重要条件。
这一个月以来,在开发这个工资管理系统过程中,我深刻地体会到了自学能力的重要性。毕竟在学校学习到的知识是有限的,而在开发系统的过程中仅凭原有的一点点知识是远远不够的,只有翻阅大量的资料才能学到更多的知识,才能实现其预期的功能。在开发过程中,遇到困难是在所难免的,期间我跟我的指导老师和同学们进行交流,从中明白了很多。开发一个系统,恒心和毅力也是不可缺少的。同样,在开发过程当中,细心也是非常重要的,由于很多事项都要很注意才行,如果没有做到这一点,就会出错。
在这里要同学的帮助、老师的悉心指导下基本完成本次课程设计,基本达到了工资管理系统的要求。
小组各成员心得体会
Xxx:
这个系统实现了对员工信息的存储、修改、删除、查询及排序。从拿到题目到完成整个编程,从理论到实践学到了很多东西。通过这次程序设计我深入了解了链表、结构体,也学会了文件的读写,懂得了理论和实际结合是很重要的。在设计过程中遇到了很多问题,这毕竟是第一次做,同时在设计过程中发现了自己的不足之处,对以前所学的知识理解的不够深刻,掌握的不够牢固,比如单链表。总之不收获很多!
Xxx:
通过这次课程设计,我对数据结构中单链表的应用有了更深的理解,并且深刻的认识了实践的重要性,只有理论与实践相结合才能很好的学习。发现想要做好课程设计,仅靠书本上的知识是不够的,还需要查阅其他的程序和知识。在这个过程中,我充分认识了数据结构在编写程序方面的重要地位,知道它的特点是可以用存储单元来存储数据,并且可以方便的实现对数据进行插入、删除和遍历等操作。
Xxx:
这个课程设计实现了对职工信息的管理,通过录入、添加、修改、删除、查询等实现对职工信息的管理。通过这次的课程设计,我学到了很多的东西。同时也找到了自己很多的不足之处。在这次课程设计中,由于以前没有好好学这门课,所以很多知识掌握的不够好,导致在编写的时候遇到很多困难,但是通过队员的帮助,得到了解决。这次课程设计,不仅让我学到了知识,更好的掌握了函数、结构体、指针、单链表等的用法,也让我知道了团队的重要性。
Xxx:
通过这次课程设计我学到了许多在课堂没有学习好的知识,同时也巩固了我之前学习的知识,在设计的过程中我补全了自己的不足,找到自己掌握的不牢固的,还有理解的不深刻的,比如:函数,结构体等等,通过这次课程设计我提高了独立思考的能力和自己的实际动手能力,我还学会了如何用流程图来表达自己的想法,同时这次课程设计也让我们小组之间加深了了解,总的来说,这次设计让我的c语言知识更加丰富!
Xxx:
经过两学期的C语言学习,我们掌握了C语言的基础知识,我对课程设计有了一定的了解和体会。并且通过这次课程设计使我懂得了理论与实践相结合是很重要的。从理论中得出结论,才能真正为今后的学习、工作服务,从而提高自己的实际动手能力和独立思考的能力。在这次程序设计中,我充分领略了C语言功能的强大,包括函数、数组、指针、结构体、文件等。而且我学会了最基本的替换,然后扩展到循环、嵌套,条理很清楚。让我也深感集体的强大力量,很多东西并不是一两个人就可以完成的,比如这个小型工资管理系统程序的编写,俗话说“众人拾柴火焰高”,经过共同的努力,最终克服难关开发出了该系统。在本次课程设计中,还有一点不得不说,通过这次程序设计书的编写让我深刻的意识到拥有好的文笔是多么的重要,我们虽为工科生,但是在以后的工作岗位上也不得不面临着各种各样的工作,所以文笔也是非常重要的。
参考资料
[1] 工资管理系统课程设计程序http://blog.csdn.net/JZQT_T/article/category/2317235
[2] C语言程序设计规范及基础
https://wenku.baidu.com/view/58b***409c7b.html [3]《明解C语言 第3版》,(日)柴田望洋著,人民邮电出版社 [4] 《C Primer Plus 第6版 中文版》,姜佑 译,人民邮电出版社 [5] 《C程序设计 第四版》,谭浩强著,清华大学出版社 [6]《C和C++实物精选》,徐波著,北京邮电出版社
附录
5.教学设计:调用系统子程序 篇五
论文摘要:信息资源的价值越来越高,建设以数据库为中心的管理信息系统,对提高金融管理水平和生活质量具有重要的意义,本文以具体实例阐述了面向对象程序设计方法的特点,并分析其优点和不足的地方,以便于在经济工作中运用面向对象软件开发实践方法具体设计相关管理信息系统。
论文关键词:金融信息系统 面向对象程序设计会计软件开发
1前言
随着我国经济信息化工作的不断发展提升,对金融工作者的计算机应用知识要求越来越高,有些企业的信息系统正面临从传统的核算软件向管理决策性的大型管理软件的再开发。当前我国企业经济发展对管理信息系统开发的需求很大,如何正确安排软件的结构,合理组织、管理软件的生产,不仅是从事软件开发专业人员的事,也是广大从事金融管理工作人员及学员必需掌握的知识,金融工作人员经常就会被要求加入到系统开发中去,向系统开发人员提供有关专业技术支持,帮助开发人员了解企业的财务处理程序、经营过程,管理要求及用户的信息需求等。为了缩短了软件的研制时间,提高了软件的开发效率,面向对象程序设计由此应运而生。面向对象事件驱动程序设计方法是程序设计方法的一次变革.我们应迎头赶上井掌握这门新技术。
2面向对象方法程序设计(00)的基本过程
计算机软件技术发展非常快,越来越多的实用软件工具有不同程度的面向对象自动编程功能,软件工程各阶段的自动化程度也将越来越高.面向对象程序设计是目前程序设计方法的主流,是程序设计在思维和方法上的一次巨大进步。面向对象程序设计思想是面向对象,即设计的重要任务在于描述对象,程序是由事件驱动的,因而,在执行过程中,持续等待的是一个发生在对象上的事件。而发生什么事件则要看使用者的操作,如单击、双击鼠标等。至于下一步的程序流向,则要看驱动的是什么事件。这类程序设计的主要目的是从任何方便与简化使用人手,由使用者控制程序流向,这在一定程序上增加了编程的难度,以基于VFP6.0面向对象的程序设计应用为例,假设某储户到银行提取存款X元,试问银行出纳元应如何付款最佳(即各种票颊钞票总张数最少)。
2.1分析
可以从最大的票额(100元)开始,算出所需张数,然后在剩下的部分算出较小面额的张教,直到最小票额(1元)。
2.2设计步辣
(l)建立应用程序用户最界面。
选择“新建”表单设计器,增加一个命令按钮Command 1、14个标签LABELI_LABEL 14, 7个文本框TEXTI _TEXT7。
(2)设置对象属性.如表i:
表单的默认按钮
(3)编写程序代码:
说明:文本框的InteractiveChange事件当文本框中的内容被改变时发生。
2.3建立程序界面与程序运行结果
在企业的金融信息系统中其它应用需求诸如:求各种所得税的纳税情况,水电费收支情况,工资管理情况等应用,软件需求大,需求的具体要求各有千秋,程序代码和界面是千变万化的,系统开发人员和信息管理应用工作者应根据具体的要求按一定的语法规则去改变程序的结构和方式,形成各自的风格,以满足企业信息管理系统对应用软件日益增长的需要。
3面向对象系统开发(00)方法的原理
面向对象方法是在吸取结构化思想和优点的基础卜发展起来的,是对结构化方法的进一步发展和扩充。各种分析方法在财经软件开发过程中墓本目标是相同的。都以较低的成本开发高质量的软件,系统开发从问题域中的实体与关系出发,体系结构是由对象类及其关系构成,对象之间通过消息传递信息,通过执行服务一消息链完成指定功能,一旦用户要求修改,可以只更改局部内容即可。但不管采取什么开发方法,软件开发的墓本活动包括:需求定义、设计(design),实现、验证/确认,一个面向对象的程序的每一成份应是对象,计算是通过新的对象的建立和对象之间的通信来执行的。“面向对象”一词是针对“面向过程’一词提出的,是在本质上不同于传统的结构化方法的一种新方法,但其是基于或扩展结构化的思想,且包含三个基本的原理:封装、继承及多态。面向对象方法是吸取结构化方法的思想和优点的基础上发展起来的,是对结构化方法的进一步发展和扩充。
4面向对象系统开发(00)方法的特点和发展趋势
面向对象程序设计方法是一种正在发展中的方法,它认为客观世界是由对象组成的,用对象表示软件应用领域里的事物,用消息传送表现事物之间的相互联系,它用对象和消息来描述事物及其相互之间的联系,用类和继承来描述对象,建立问题或模型、描述系统。它是一种运用对象、类、继承、聚合和消息等概念来构造程序的设计方法。面向对象的程序设计方法主要的`构成可为:对象+类十继承十消息。软件系统利用以上四个概念进行设计或实现的,使认为其是面向连接的.面向对象程序设计的特点是唯一性,从前一阶段到后一阶段高度连续,将面向对象分析OOA、面向对象程序设计OOP、面向对象设计OOD集成到生存期各阶段中,相对于结构化程序设计方法来说.面向对象程序设计方法具有其独到的以下优点:开发方法的唯一性,开发阶段的高度连续性.表示方法的一致性。问题空间实体的自然表示,减轻了设计者的负担。设计之初不必考虑很完整的地方,建立完整的体系结构,可促进复用性,易于维护,易于修改,可合理利用其共同性,减少其复杂性。
例如,在基本的发VISUAL FOXFRO, VI-SUAL BASIC. VISUAL C++中,控件(CONTROL)、表单(FORM)等都是一个个对象.对其中对象的操作,可以通过属性、事件和方法来实现。面向对象是当前软件方法学的主要方向,也是目前最有效的开发方法之一。其基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。在应用中,面向对象的分析方法首先定义对象及其属性,根据问题域中的操作规则和内在性质定义对象的行为特征(服务),建立状态模型,用状态模型描述对象的生命周期,分析对象之间的关系,采用封装,继承,消息通信等原则使问题域的复杂性得到控制,根据对象及其生命周期定义处理过程。当然,面向对象设计方法有很多不足之处,在开发大型软件方面,面向对象设计方法无疑其有很好的优势,但这种优势只有其在开发大型软件上才体现出来,软件的重用使其冗余相对较大。对于小型软件和要求讲究效率的场合来讲,结构化程序设计方法仍有其使用的必要。
以金融管理信息系统为例,随着金融软件的推广应用,企业电算化应用水平不断提高,软件已不能满足企业管理水平提高的需求,为此我国金融软件开发应用工作者又相继推出了ATM系列、银证转账软件产品,井与会计管理软件功能相关联和对接,主要包括:账务处理、资金管理、帐务分析、销售等功能,在管理型软件各功能模块中还将满足纳税处理、提供审计线索等功能需求。将推出成熟的商品化金融企业管理信息软件,以实现企业内部物流、资金流与信息流的一体化管理,实现管理与决策有机统一,并通过建立在Internet/Intranet/Extranet上,实现企业内部资源与企业外部资源构成的整个供应链的管理。
5结语
6.教学设计:调用系统子程序 篇六
“静态网页”有很多优缺点。没有后台数据库,缺乏数据库的支持,此类网页在网站制作和维护方面工作量很大,而且对于维护人员的专业要求也较高。因此当网站信息量很大的时候,依靠静态网页制作就比较困难,而且维护起来也很不方便。静态网页内容固定,不含程序和数据交互。没有数据交互功能,所以网页之间的数据信息传递无法实现,导致网页功能方面受到了很大的限制。静态网页的内容都是保存在网站服务器上的,每个网页都是一个独立的文件,所以在安全性上要比“动态网页”要高,它不会受程序相关漏洞的影响,也不会因数据库出错而导致网站无法访问。因为静是运行于客户端的程序,不需要连接数据库,所以浏览速度开,节省了服务器的资源。如html页、Flash、Java Script、VBScript等等,它们是相对静止内容不变。
在网站设计的时候,除了“静态网页”外,我们还使用“动态网页”。“动态网页”通常使用的语言是:超文本标记语言+ASP或超文本标记语言+PHP或超文本标记语言+JSP等。“动态网页”当客户端向服务端发送请求后,在服务器端解释、运行,它们会随不同客户、不同时间,返回不同的网页,如ASP、PHP、JSP、ASPnet、CGI等。
在做网站设计的时候,为了让网站功能、设计更加方便,更多的时候,采用动态与静态想结合的方式。为了一些特殊的功能设计需求,通常会将网页内容生成静态页面,这样在满足了设计需求后,也造成了一些麻烦,举例来说,当主页LOGO、菜单等内容发生变化后,如何将变化的内容适用于所有的链接页面,如果都是动态页面则无所谓,但如果生成的子页面是静态页面,他的内容是不会发生变化的,那么当这些内容变化后,子页面也让跟着变,如何来实现?
现在以ASP为例,实现如何在HTML文件中调用ASP代码完成数据库的调用。
因为HTML页面不支持调用ASP,所以在HTML页面中,使用如下代码:
<script language="javascript"src="ASP文件名.asp"></script>来解决HTML页面调用ASP文件。因为HTML不解释执行,所以调用了ASP后,为了让ASP文件能正常解释执行,用以下代码编写ASP文件。代码如下:
通过以上两段代码,轻松实现了在HTML文件中调用ASP代码。
参考文献
[1]黄明,《ASP信息系统设计与开发实例》[J],机械工业出版社,12-15
[2]覃剑锋,张钢,《ASP网站建设专家》[J],机械工业出版社8-11
7.教学设计:调用系统子程序 篇七
[quote:3348e888c8]第十章 对话框对象
对话框是一种界面元素,它的生成属性由用户自己根据业务需要定制的,用户可以设置它的位置、大小、标题以及各种控件的组合,
对话框大凡都用作为子窗口,以执行一项与输入或选择有关的专门任务。例如,可以用一个子对话框来接受构置打印机的参数设置。ObjectUNIXClass Library提供了三个Dialog类的派生类:TInputDialog、TFileDialog、TPrintFialog。TInputDialog从用户输入接受一个文本行,TFileDialog索取一个文件名,TPrintDialog设置打印参数。
10.1 使用对话框对象
一般对话框在应用程序主窗口生成时,就已经生成了对话框对象,用户可以在需要时随时显示它,只到用户删除该对话框对象。在对话框对象显示时,用户没有必要设置变量去保存被对话框覆盖的主窗口区域,因为Object UNIX Class Library以及替您完成了这些操作。退出显示对话框后,系统自动为您恢复到对话框显示之前的状态。每次在对话框显示时,TDialog基类函数会保存被覆盖的区域屏幕内存数据,而在退出显示时,释放它。
10.2 构造和初始化对话框对象
TDialog的构造函数需要七个参数:对话框标题、相对于主窗口的列行坐标、对话框大小以及前景和背景颜色。
为了接受实际的派生类传递参数,需要重载了它的构造函数:
AboutDialog=new AboutDialog(”Sample Dialog“,17,6,46,13,
BLACK_CYAN,CYAN_CYAN);
下面以显示版本信息为例,构造一个新的对话框对象:
TAboutDialog::TAboutDialog(char *caption,int left,int top,
int width,int height,int ftcolor,int bkcolor)
:TDialog(caption,left,top,width,height,ftcolor,bkcolor)
{
Caption=caption;
Left=left;
Top=top;
Width=width;
Height=height;
BKColor=bkcolor;
FTColor=ftcolor;
InitDialog;//调用对话框初始化函数,设置界面控件对象
}
void TAbout::InitDialog(void)
{
TDialog::InsertControl((TControl *)new TLabel(”Object UNIX
Class(SCO UNIX版)“,5,2,FTColor));
TDialog::InsertControl((TControl *)new TLabel(”All Rights Reserved“,
14,4,FTColor));
TDialog::InsertControl((TControl *)new TLabel(”Version
1.0“,17,6,FTColor));
TDialog::InsertControl((TControl *)new TLabel(”C++类库例子程序“,
11,8,FTColor));
TDialog::InsertControl((TControl *)new TLine(M_HORZ,0,10,Width,10,
FTColor));
TDialog::InsertControl((TControl *)new TButton(EXIT_BUTTON,”退出“,
19,11,BLACK_CYAN,WHITE_MAGENTA));
}
10.3 生成和执行对话框
当TDialog被执行或生成时,将要建立子对话框对象和界面元素的联系,
对话框的执行依赖于用户的输入;当取得输入和关闭对话框之时,执行过程方告停止。例如,当关闭一个文本编辑窗口时,将要执行一个对话框来确定是否保存编辑内容。
事实上,在对话框执行期间,其父窗口是不起作用的。它不能响应用户输入。另外,Object UNIX Class Library提供的对话狂对象自动支持数据传输机制,也就是说,当用户在对话框上进行某些操作如输入和选择后退出显示对话框时,当用户再次启动对话框时,原来的数据还保留着。
如果用户不想保留数据传输机制,需要每次都是显示初始化状态的对话框时,需要用户重载对话框类成员函数ExecDialog。
10.4 关闭对话框
通过调用对话框的Close成员函数可以关闭对话框。Object UNIX Class Library定义,所有关闭对话框的行为只能通过按下按钮控件操作来进行,并且定义,只有OK_BUTTON和EXIT_BUTTON这两类才能关闭对话框,所以,用户在设计对话框时,一定要有一个按钮控件,并且按钮控件的标识有一个必须为OK_BUTTON或EXIT_BUTTON。
10.5 控件管理和事件消息处理
控件是由父对话框来建立和管理的,但它提供较少的管理。所以,对于控件间的控制与管理,需要用户根据需要自己管理。Object UNIX Class提供了必要的接口。
对话框对象和它的控件元素之间能够进行双向通信。一方面,对话框需要管理和查询它的控制,例如,对话框可能要填充一个列表或者从一个编辑控件中索取文本;另一方面,当对话框可能需要知道的事件时,对话框控件需要通知对话框。例如,当按钮控件被触发时,它要通知它的父对话框。
通过把控件同其它控件对象相关联,可以简化对话框对象和其控件之间的通信,因此,您需要为每个有键盘事件的控件或者需要知道它属性值的控件定义一个类数据控件成员,这样,您就可以直接引用该控件并取得该控件的全部信息。
为了响应对话框以及控件事件,需要重载类成员虚函数PressEnterEvent。该函数提供用户处理控件按键时间的接口。详细的控件时间响应请参阅前几章的说明。
10.5.1 定义消息响应函数
您可以在自己派生的对话框中定义相对应的事件响应函数,以对应当某控件按下回车键时产生事件而去执行该时间响应函数。系统将自动地在当某控件得到焦点时,如果按下回车时,自动执行您已经预先定义的函数。
在派生对话框类定义中可以定义如下:
…
void PressExitButtonEvent(void);
…
在对话框成员函数定义中,可以如下定义:
void TAboutDialog:ressExitButtonEvent(void)
{
…
}
10.5.2 执行消息响应函数
为使消息响应函数赋予某指定控件,需要把定义好的消息响应函数传递给指定的控件。您可以在控件实例化时,传递该消息响应函数。
下面以按钮控件为例:
void TAboutDialog::InitDialog(void)
{
…
TDialog::InsertControl((TControl *)new TButton(EXIT_BUTTON,”退出“,
19,11,BLACK_CYAN,WHITE_MAGENTA,
(KEYEVENTFUNCTION)PressExitButtonEvent));
…}
上例表示在对话框初始化时,把PressExitButtonEvent消息响应函数赋给退出按钮控件,这样,当您按下退出按钮时,将自动执行PressExitButtonEvent函数。
[/quote:3348e888c8]
8.教学设计:调用系统子程序 篇八
1、首先创建一个Objective-C的项目:
2.添加一个Swift的类文件:
3、点击Next,弹出一个对话框,选择YES
4、生成一个YourProject-Bridging-Header.h文件,
5、在SwiftClass创建类如下:
import Foundation class SwiftTest : NSObject { func test->NSString{ return “test” } }
6、在ViewController调用SwiftTest类如下:
#import “ViewController.h” #import “ObjectiveTest-Swift.h” //这里注意和项目名称一致 “YourProject-Swift.h”
7、import之后一定要先编译一次,否则编译出错,
Objectivec调用Swift
,
8、编译之后就可以在类里面调用了如下:
9.教学设计:调用系统子程序 篇九
Linux的系统调用的函数指针存放在系统调用符号表(sys_call_table)中。通过一些特殊的手段,我们可以更改其中系统地址的指针将系统调用引导到自己的程序代码中,从而实现特定功能。使用LKM替换系统调用,我们可以在不重新编译内核的情况下,为Linux系统增加或完成一些特殊形式的功能。
1 监控特权命令chattr的必要性
文件系统的属性对于提高文件系统的安全性和保障文件系统的完整性(尤其对于系统日志文件)有很大的作用。chattr正是设置文件系统属性的用户接口命令。注意,该命令的使用必须是root用户,其他用户即使是文件的所有者对该文件使用chattr命令也会显示“不允许的操作”的错误提示。系统管理员把系统的重要文件添加上隐藏属性,以防止系统重要文件被删除或篡改。比如使用了命令:
对message.txt文件设置了append属性后,系统只允许在这个文件末尾追加数据,不允许任何进程覆盖、截断或者删除这个文件。实验结果显示,message.txt只能被添加,而不准修改。
在Linux系统中,如果一个用户以root的权限登录,文件系统的权限控制将无法对root用户和以root权限运行的进程进行任何的限制。这样对于Linux操作系统,如果攻击者通过远程或者本地攻击获得root权限将可能对系统造成严重的破坏。而ext2文件系统可以作为最后道防线,最大限度地减小系统被破坏的程度,并保存攻击者的行踪。ext2属性是由sys_open()和sys_truncate()等系统调用检查和赋予的,不受用户识别号和其他因素的影响,在任何情况下,对具有不可修改(immutable)属性的文件的进行任何修改都会失败,不管是否是root用户进行的修改。
如果root用户去掉了文件的隐藏属性,就可以对该文件进行任意的删除、修改等操作。本文对系统进行的保护措施是:先对系统重要文件设置隐减属性,然后加载本文提出的安全保护模块。目的是使root用户也不能更改文件的隐藏属性,即不能篡改要保护的文件。从而保证系统重要文件不被破坏和删除。
2 文件系统的隐藏属性
众所周知,Linux内核中有大量安全特征,其中有很多特征有着广泛的应用,但是绝大多数的系统管理员(包括一些资深系统管理员)都忽略了ext2文件系统的隐藏属性(attribute)。Linux的这种安全特征甚至远没有Lids和Tripwire等外部安全工具受关注,但是使用这个特征可以很好地保护系统的安全。从Linux的1.1系列内核开始,ext2文件系统就开始支持一些针对文件和目录的额外标记或者叫做属性(attribute)。ext2文件系统支持表1列出的属性设置。
在这些属性中,最为重要的是a(Append Only)属性和不可修改(immutable)属性,它们对于提高文件系统的安全性和保障文件系统的完整性(尤其对于系统日志文件)有很大的作用。另外,由于ext3文件系统是以ext2文件系统为基础的,因此所有ext2文件系统支持的属性,ext3文件系统也都支持。
3 替换系统调用
替换系统调用就是我们自己构造一个系统调用,想办法使sys_call_table相应的系统调用号指向我们自己构造的函数。在原来的2.4内核里,可以将sys_call_table直接导出,这样我们就很容易拿到sys_call_table的控制权来实现系统调用的替换,但是从2.6的版本以后,考虑到安全问题不允许将sys_call_table再导出,这样就加大了取得syscall_table控制权的难度。下面讨论获取sys_call_table地址的方法。
3.1 通过System.map和vmLinux取得sys_call_table地址
在内核代码中存在许多符号(symbol),特别是大量的全局符号,内核通过它的地址,如c02f94a0这样的符号来使用变量,但是直接使用地址来引用变量又给内核编程带来了很大困难,所以内核提供了一种折中的方案,即将每个符号和其对应的地址保存在一个文件中,这样既可在编程开发时使用符号,又可以方便的得到其地址。System.map就是保存这种对应关系的文件。它通常位于/boot/System.map,在其内部记录了内核各个符号的内存定位信息。通过文本文件搜索,我们可以获取sys_call_table的地址,并作为LKM模块加载时的传递参数。
vmlinuz是可引导的、压缩的内核,其中“vm”代表“Virtual Memory”,通常位于/boot/vmlinuz,一般是在编译内核时通过“make z Image”创建或make bzImage创建,然后通过拷贝产生,在开头部分内嵌有gzip解压缩代码。由内核文件中包含的一个微型的gzip用于解压缩内核并引导它。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。通过shell命令:grep sys_call_table/boot/System.map或nm vmlinux grep sys_call_table就可以获得sys_call_table的地址。
3.2 通过中断向量取得sys_call_table地址
替换系统调用可以通过中断向量取得sys_call_table地址。基本思路是这样的,因为系统调用都是通过0x80中断来进行的,故可以通过查找0x80中断的处理程序来获得sys_call_table的地址。其基本步骤是,首先获取中断描述符表的地址,再从中查找0x80中断的服务例程,再搜索该例程的内存空间,以从其中获取sys_call_table的地址。
4 替换sys_ioctl()系统调用
chattr命令最终执行进sys_ioctl()系统调用里,所以,我们替换调用原有的sys_ioctl()函数。在新的sys_ioctl()函数里面,根据传进的参数进行判断,如果用户输入的是要求改写文件属性的chattr命令,那么就可以通过dbgprint函数调用printk,输出信息到环形buffer,该信息由klogd取出,交给syslogd存到系统日志文件/.var/log/messages里面,管理员查看该日志,会发现有人想要执行该操作,根据该信息输出的时间,能判断出是否合法用户在执行这条命令。
5 测试结果
本文的测试环境是Fedora core 5。在模块hijack.ko里面,通过替换sys_ioctl()系统调用,实现了监控root用户修改文件隐藏属性功能。测试步骤如表2所示。
6 结束语
本文使用LKM替换系统调用,实现监控特权命令的执行。以监控chattr命令执行为例。本文的安全实现前提是,系统管理员把系统的重要文件添加上隐藏属性,以防止系统重要文件被删除或篡改。设置完各种隐藏属性后,安装hijack模块,防止不法用户获取到root口令,破坏系统重要文件。
摘要:本文为了提高Linux系统的安全性,提出一种替换系统调用的方法。在分析特权命令和系统属性的基础上,提出了两种系统调用方法。用替换后的系统调用函数,监控特权命令的使用,并进行了测试实验。测试结果说明了本文所提出的方法可以有效防止不法用户通过获取到root口令而破坏系统重要文件。
关键词:Linux,系统调用,特权命令,安全
参考文献
[1]李善平,季江民,尹康凯.边干边学—Linux内核指导(第二版)[M].杭州:浙江大学出版社.2008.
[2]倪继利.Linux安全体系分析与编程[M].北京:电子工业出版社.2007.
[3]赵亮.探索Linux内核级安全增强系统[J].开放系统世界.2003.
[4]王艳丽.浅谈Linux用户管理[J].电子科技.2010.
[5]曹云鹏.关于Linux操作系统用户管理的研究[J].科技情报开发与经济.2003.
10.教学设计:调用系统子程序 篇十
Linux[1]作为一个自由软件, 在广大爱好者的支持下, 内核版本不断更新也不断增大, 通过编译内核可以轻易地对它进行修改, 使我们能够根据自己的要求度身定制一个更高效、更稳定的内核。
系统调用[2]是用户进程与系统之间的接口, 它们在内核中实现, 其主要目的是使得用户可以使用操作系统提供的操作底层设备的功能。用户程序肯定要操作系统设备, 没有系统调用, 程序员就需要了解硬件细节才能写出强大程序, 这显然不利于将精力集中在解决问题上。
学习操作系统设计技术的有效方法就是读懂并修改Linux的源代码, 编译内核和添加系统调用就是比较基础的内容, 本文就以这两部分来展开:一是编译内核, 二是添加系统调用。
一、编译内核
1. 到ftp://ftp.kernel.org/pub/linux/kernel/v2.6/中找到相关版本的压缩包linux-2.6.15.1.tar.bz2或linux-2.6.15.1.tar.gz
2. 首先cp命令或mv命令将压缩包放到/usr/src/redhat/SOURCES/下, 解压缩包:tar-jxvf linux-2.6.15.1.tar.bz2 (对应于.bz2文件) 或tar-xzvf linux-2.6.15.1.tar.gz (对应于.tar.gz (.tgz) 文件)
3. 在/usr/src/redhat/SOURCES/下得到解压后的文件linux-2.6.15.1, 并设置路径:cd/usr/src/redhat/SOURCES/linux-2.6.15.1, 一定要保证路径正确, make的有关命令一般在此目录下。
4. make mrproper, 该命令确保目录下没有相关的文件和编译设置, 如果已经编译过linux内核, 最好使用本命令。
5. make menuconfig, 自己配置编译选项, 建议保留默认值, 或者在当前linux-2.6.15.1目录下使用cp/usr/src/kernels/`uname-r`/.config.config将原来的配置文件拷贝过来。
6. make clean, 删除不必要的模块和文件
7. make bz Image, 编译内核并在/usr/src/redhat/SOURCES/linux-2.6.15.1/arch/i386/boot目录下生成内核程序文件bz Image
8. make modules, 内核模块的编译
9. make modules_install, 内核模块安装
10. 让新内核和旧内核都可以加载的配置的步骤:
在最后添加上:
保存后, reboot
设置采用新内核启动:启动时在grub界面按住e进行编辑, 按上下键选择刚刚的新内核, 按Enter键启动。
二、添加系统调用
可以用两种方法来添加系统调用:第一种方法是通过修改内核代码增加系统调用;第二种方法是利用内核模块机制添加系统调用。第一种方法因为修改了内核代码, 所以需要重新编译内核, 而第二种方法是将系统调用作为可加载的内核模块, 所以不用重新编译整个内核, 只要编译相应的模块。当然两者各有利弊。但是一般情况下, 内核中极为重要的地方, 是难以通过内核模块实现的, 必须直接对内核进行修改。这里我们采用第一种方法。
涉及到文件有:/usr/src/redhat/SOURCES/linux-2.615.1目录下,
1. 添加系统调用号表
2. 添加系统调用号
将#define__NR_mycall 294加入到unistd.h, 因为2.6.15.1内核的系统调用号已经到293了, 调用号在此基础上加1。并且将#define NR_syscalls 294改为#define NR_syscalls 295
3. 编写系统调用
vim./kernel/sys.c, 在最后一行加入如下代码:
4. 重新编译内核, 依第一部分的顺序进行
5. 编写用户测试程序
编译生成可执行文件[3]:
编译成功后, 执行以下命令, 运行测试程序:
6.结果:
发现和我们预想的结果不一样, Hello World!没有显示出来, 因为printk[4]不会直接打印出来, 而是需要命令:dmesg-c, 但要注意一定是执行完./test1后做才可以, 并且要在root权限下。
摘要:本文以实例来详细描述了从准备一直到使用新内核的Linux2.6内核编译过程, 然后介绍了添加系统调用的实现步骤, 最后给实验结果。
关键词:Linux,内核,编译内核,系统调用
参考文献
[1]鸟哥.鸟哥的Linux私房菜基础学习篇 (第三版) .北京:人民邮电出版社, 2010.
[2]李善平, 季江民, 尹康凯.操作系统课程设计.杭州:浙江大学出版社, 2009.
[3]宋劲杉.Linux C编程一站式学习.北京:电子工业出版社, 2009.
【教学设计:调用系统子程序】推荐阅读:
基于三菱PLC的双面铣床控制系统程序设计08-17
C语言程序设计课程教学设计08-27
vb程序设计教学探讨08-21
《Java程序设计基础》教学总结06-25
教学大纲c程序设计08-23
C语言程序设计2教学大纲09-06
计算机程序设计课程教学方法探讨09-01
c语言程序设计课程教学大纲20110-31
教学系统设计重点07-06
VB程序设计课程任务驱动教学方法研究09-04