在MATLAB环境中调用DLL对硬件资源访问的方法

2013-07-30 14:46:24来源: 电子设计工程

    MATLAB是美国MathWorks公司开发的高性能的科学与工程计算软件,凭借其强大的科学计算和绘图功能、大量稳定可靠的算法库和简洁高效的编程语言,被科技工作者们广泛应用于自动控制、数学运算、信号分析、图像处理等各行各业。尽管MATLAB本身是一个完整的、自成体系的编程和数据处理环境,但由于语言的特性使其访问硬件的能力相对较差,这在一定程度上限制了它的使用。对于那些涉及复杂算法同时又需要对硬件资源进行访问的系统,一般的做法是在一个通用的编程平台(如Visual C++、Visual Basic、Delphi等)上实现对硬件资源的访问,而后调用MATLAB算法对数据进行处理。这种方法优点是通用性好,程序运行效率高,适用大多数场合,但对开发人员编程能力有较高要求,开发周期较长。在一些需要快速的验证模型和算法的场合,为充分发挥MATLAB强大的数值计算能力,以MATLAB作为主开发平台来得更为合适。随着模块化的设计思想在越来越多的产品中得到体现,器件生产厂商们一般都会提供该产品的二次开发函数库,方便了开发者们对硬件操作的同时,也使得MATLAB通过外部程序接口实现对硬件的访问成为可能。
    文中具体论述一种基于动态链接库调用实现MATLAB访问一般硬件的方法,并将该方法用于对高精度气压传感器MS5803的数据采集,实现了MATLAB与硬件的无缝结合,极大的方便了数据的后续处理。

1 动态链接库
   
在具体阐述MATLAB环境下调用动态链接库函数访问外部硬件之前,有必要对动态链接库做简要介绍。动态链接库英文为Dynamic Linka ble Library,缩写DLL,最初是为了解决代码共享的问题而提出的.通俗的理解可以把DLL看成一种仓库,它提供一些可以直接拿来使用的变量、函数或类。动态链接库可以使用不同编程语言来编写,只要符合标准即可。为了加深对动态链接库函数调用的理解,下面以C/C++语言为例简要介绍动态链接库的编写步骤。首先介绍两组关键字:
    1)_declspec(dllimport)
    这组关键字表示从DLL中导入函数或者数据,一般用在DLL对应的头文件中。
    2)_declspec(dllexport)
    这组关键字表示从DLL中导出函数或者数据,一般用在DLL对应的工程文件中。
    编写动态链接库函数的方法与编写一般函数的方法基本相同,只不过要对库中的可导出函数进行必要的申明。下面以VC环境下一个最简单的DLL工程dll_test进行说明,工程包含dll_test.h和dll_test.cpp两个文件。
    a.jpg
    编译上述dll_test工程即可得到动态链接库dll_test.dll(在Debug或Release目录下),此动态链接库实现了add和sub函数的功能。在解决一些实际问题过程中,有时会遇到只有DLL而没有与之相对应的头文件的情况,而MATLAB在调用DLL文件中的函数之前,必须具备头文件中的函数声明才行,这样根据上述DLL的编写规范可以很容易的编写出与所调用的DLL相对应的头文件。

2 MATLAB调用C/C++动态链接库
   
从Matlab6.5(R13)起,Matlab提供了对动态连接库DLL文件的接口。利用这个接口,可以在Matlab中调用动态连接库导出的函数。MAT LAB加载和使用动态链接库函数仅通过7~8个函数就可以实现,只要掌握这些函数的使用方法,就掌握了加载和应用动态链接的基本方法,从而可以在MATLAB平台下轻松实现对硬件的访问。
    利用MATLAB共享库接口实现对外部DLL库的调用主要有以下几个步骤。
    1)加栽动态链接库文件
在使用动态链接库之前,必须将所需的动态链接库加载到MATLAB工作空间中,之后MATLAB才能调用动态库中的函数。函数lodalibrary用于加载动态链接库,其使用语法如下:
    loadlibrary(‘shdib’,‘hfile’)
    loadlibrary函数有两个输入参数,参数shrlib表示库文件的名称,参数hfile为对应库的C语言头文件,C语言的头文件用于向MATLAB提供基本的函数说明。下面以一示例说明loadlibrary的用法,在命令提示窗口中输入如下命令:
    >>loadlibrary(‘dll_test’,‘dll_test.h’)        (1)
    通过以上命令即将dll_test.dll加载到MATLAB工作空间中。
    2)浏览动态库中的函数
    成功加载动态链接库后便可调用库中提供的函数。与函数使用类似,在调用函数之前首先要明确函数各输入输出参数的含义及数据类型。一般情况下动态库编写者会提供相应函数的帮助文档,以便用户理解函数的含义并对其进行调用。动态链接库大多使用C或者C++语言编写,然而标准的C或C++数据类型与MATLAB所使用的数据类型不尽相同,因此调用函数前首先要弄清被调用函数参数对应于MATLAB环境下的数据类型。使用函数libfunctions可在MATLAB环境下查看动态库中函数的声明,并将原C函数中参数类型以对应MATLAB参数类型显示,之后便能正确的按照MATLAB语法规则进行调用。libfunctions用法如下:
    libfunctions(‘libname’,‘-full’)
    参数libname为已加载到MATLAB工作空间的动态库文件名,-full为可选参数用于输出函数的详细说明。
    >>libfunctions(‘dll_test’,‘-full’)              (2)
    输入语句(2)后命令行中会显示所有dll_test库中的函数,如下:
    Functions in library dll_test:
    int32 add(int32,int32)
    int32 sub(int32,int32)
    3)调用动态库中的导出函数
    明确了动态库中函数的参数类型后,便可利用MATLAB提供的calllib接口函数对库中函数进行调用。calllib函数使用方法如下:
    [x1,…,xN]=calllib(‘libname’,‘funcname’,arg1,…,argN)
    参数libname表示被调用函数所在的库文件名,funcname为被调用的函数名称,arg1,…,argN为函数funename的输入参数,x1,…,xN为函数funcname的返回值。以下为dll_test.dll中add函数的调用示例:
    >>calllib(‘dll_test’,‘add’,1,2)
    ans=
       3
    4)卸载动态链接库
    当不再需要对动态库中的函数进行访问后,应及时将动态库从MATLAB工作空间中卸载。与加载动态库类似MATLAB也提供对应的卸载动态库的命令unloadlibrary,例如:
    >>unloadlibrary(‘dll_test’)
    通过以上4步便可实现在MATLAB环境下对动态链接库导出函数的调用。在实际应用中通过调用硬件商提供的动态链接库或者将其提供的API函数编译为动态链接库,便可实现在MATLAB平台下实现对硬件资源的访问。

[1] [2]

关键字:MATLAB  动态链接库  硬件访问  数据采集

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/Test_and_measurement/2013/0730/article_7605.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
MATLAB
动态链接库
硬件访问
数据采集

小广播

独家专题更多

TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved