资源描述:
《在matlab环境下实现对硬件资源的访问》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在MATLAB环境下实现对硬件资源的访问
2、第1内容显示中摘要:在MATLAB环境下对硬件资源如I/O端口或存储单元进行访问的方法进行讨论,通过MEX程序的设计,MATLAB可以访问硬件资源,与硬件进行数据交换,也可以在外部程序中调用MATLAB的函数。在MEX程序中需要将MATLAB下的数据格式进行转换为C语言可以处理的数据类型。最后,结合应用实例说明MEX程序的设计。MATLAB语言是一种高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境。尽管MATLAB本身的编
3、程和数据处理的环境是完整的和自成体系的,可经常在这种环境下,仍有必要与外部的程序和数据进行通讯和数据交换,如需要控制数据采集板的硬件,读取采集后存于数据缓存区的数据等;为此它提供了应用程序接口(API)函数来支持这样的操作,这样可以利用该函数来访问硬件资源。MATLAB环境提供了MEX-文件,利用该文件可以调用用户自己的C语言或FORTRAN语言程序,就像调用内部函数一样方便,这些程序是MATLAB编译器自身可以加载和运行的动态连接子程序库。本文主要就如何利用MEX文件实现在Windows环境下对数据采集硬件资源的控制和访问。1W
4、indows环境下对硬件资源的访问我们有时可能需要在MATLAB下直接操作I/O端口,或者自己设计了专用的数据采集硬件设备并在MATLAB下使用,希望能够访问这些硬件资源。由于MATLAB是在Windows环境下运行,要在它的环境下实现对硬件资源(如I/O端口或存储单元)的访问,就有必要了解Windows下对硬件进行操作的原理。在Windows中,操作系统对I/O端口进行保护,它将检查是否允许当前程序对这个端口进行操作,如果允许,操作系统就代为执行I/O指令;否则,操作系统就会采取相应处理步骤,要么中止该程序,要么向用户报警。在W
5、indows中,真正的核心是VMM(虚拟机管理器)和VxD(虚拟设备驱动程序),它们工作在特权级0上,控制着整个系统的运转。正是VMM和VxD一起负责管理I/O端口操作。系统正常运转后,如果应用程序执行了1条I/O指令,VMM接收到这个消息后,它将调用曾申请截获该端口的VxD提供的处理函数。此时VxD可能会根据程序的需要选择采取以下四种动作之一:忽略这条I/O指令;仿真执行I/O指令;局部解除对该端口截获;代替应用程序执行I/O指令。如果I/O端口被保护,则应用程序需要利用VxD程序进行访问,否则应用程序可以直接进行访问。系统初始
6、化完毕后,没有VxDs申请要截获的I/O端口对应用程序来说就是可直接使用Input/Output指令进行访问。对内存单元的访问要复杂一些,一般情况下硬件使用的是物理地址如D800:0。而在Windows中,内存采用平板模式,利用分页式的内寸管理方案,即内存段起始地址为0,而偏移地址是线性地址,这样要访问实际的物理地址,就要先将物理地址变换为线性地址,而后利用指针对线性地址进行操作,就如同对其它内存单元进行操作一样。在Windows中,可以调用SDK中的MapPhysToLinear服务函数将物理地址转换为线性地址,也可以利用现有的
7、VxD程序进行转换,如使用VtoolsD公司的MAPDEV.VXD。2MATLAB环境下MEX程序的设计MEX程序提供了MATLAB和外部应用程序(如C语言程序)的接口,它自身包含两部分代码:(1)执行外部程序中的计算和输入/输出命令的程序代码;(2)通过入口函数mexFunction及其参数prhs,nrhs,plhsnlhs将MATLAB环境下的变量和数据与应用程序进行接口,这部分程序称为关口程序。当MATLAB要执行子程序调用时,常用以下命令格式:[a,b,c……]=func(d,e,f……)其中,a,b,c为左端变量,表示
8、函数调用后要返回的参数值,而d,e,f等为右边变量,表示调用函数时要送往函数的参数值。在MEX程序中关口函数总是为mexFunction,其变量和格式为:voidmexFunction(intnlhs,mxArray*plhs[],Intnrhs,ConstmxArray*plhs[])其中nrhs,nlhs分别表示输入/输出(右端/左端)参数数目;*plhs[],*prhs[]分别表示指向左端输出/右端输入变量的指针,这两个变量具有MATLAB特有的数据结构mxArray形式。在MEX程序中,也可以调用MATLAB函数或用户自
9、定义的函数。调用的指令为mxCallMATLAB(plhs,*plhs[]),nrhs,*prhs[],char*command-name),其中plhs,*plhs,nrhs,*prhs等参数意义和前述参数意义相同,而*command-nam