在MATLAB環(huán)境中調(diào)用DLL對(duì)硬件資源訪問(wèn)的方法
摘要:MATLAB是一款高性能的科學(xué)與工程計(jì)算軟件,具有強(qiáng)大的數(shù)值計(jì)算和分析能力,但其對(duì)硬件的訪問(wèn)能力較弱。在MATLAB環(huán)境中實(shí)現(xiàn)對(duì)硬件資源的直接訪問(wèn)可以極大的方便對(duì)數(shù)據(jù)的處理及算法的驗(yàn)證,基于這種目的提出一種擴(kuò)展MATLAB訪問(wèn)硬件的方法,通過(guò)MATLAB外部函數(shù)接口調(diào)用第三方器件商提供的動(dòng)態(tài)鏈接庫(kù)導(dǎo)出函數(shù),在MATLAB平臺(tái)下實(shí)現(xiàn)對(duì)一般硬件的訪問(wèn),并具體介紹了該方法在氣壓高度計(jì)原型系統(tǒng)設(shè)計(jì)中的應(yīng)用。該方法簡(jiǎn)化了MATLAB與硬件的數(shù)據(jù)交互,對(duì)于原型系統(tǒng)設(shè)計(jì)和算法的驗(yàn)證提供了一種有效的手段。
關(guān)鍵詞:MATLAB;動(dòng)態(tài)鏈接庫(kù);硬件訪問(wèn);數(shù)據(jù)采集
MATLAB是美國(guó)MathWorks公司開(kāi)發(fā)的高性能的科學(xué)與工程計(jì)算軟件,憑借其強(qiáng)大的科學(xué)計(jì)算和繪圖功能、大量穩(wěn)定可靠的算法庫(kù)和簡(jiǎn)潔高效的編程語(yǔ)言,被科技工作者們廣泛應(yīng)用于自動(dòng)控制、數(shù)學(xué)運(yùn)算、信號(hào)分析、圖像處理等各行各業(yè)。盡管MATLAB本身是一個(gè)完整的、自成體系的編程和數(shù)據(jù)處理環(huán)境,但由于語(yǔ)言的特性使其訪問(wèn)硬件的能力相對(duì)較差,這在一定程度上限制了它的使用。對(duì)于那些涉及復(fù)雜算法同時(shí)又需要對(duì)硬件資源進(jìn)行訪問(wèn)的系統(tǒng),一般的做法是在一個(gè)通用的編程平臺(tái)(如Visual C++、Visual Basic、Delphi等)上實(shí)現(xiàn)對(duì)硬件資源的訪問(wèn),而后調(diào)用MATLAB算法對(duì)數(shù)據(jù)進(jìn)行處理。這種方法優(yōu)點(diǎn)是通用性好,程序運(yùn)行效率高,適用大多數(shù)場(chǎng)合,但對(duì)開(kāi)發(fā)人員編程能力有較高要求,開(kāi)發(fā)周期較長(zhǎng)。在一些需要快速的驗(yàn)證模型和算法的場(chǎng)合,為充分發(fā)揮MATLAB強(qiáng)大的數(shù)值計(jì)算能力,以MATLAB作為主開(kāi)發(fā)平臺(tái)來(lái)得更為合適。隨著模塊化的設(shè)計(jì)思想在越來(lái)越多的產(chǎn)品中得到體現(xiàn),器件生產(chǎn)廠商們一般都會(huì)提供該產(chǎn)品的二次開(kāi)發(fā)函數(shù)庫(kù),方便了開(kāi)發(fā)者們對(duì)硬件操作的同時(shí),也使得MATLAB通過(guò)外部程序接口實(shí)現(xiàn)對(duì)硬件的訪問(wèn)成為可能。
文中具體論述一種基于動(dòng)態(tài)鏈接庫(kù)調(diào)用實(shí)現(xiàn)MATLAB訪問(wèn)一般硬件的方法,并將該方法用于對(duì)高精度氣壓傳感器MS5803的數(shù)據(jù)采集,實(shí)現(xiàn)了MATLAB與硬件的無(wú)縫結(jié)合,極大的方便了數(shù)據(jù)的后續(xù)處理。
1 動(dòng)態(tài)鏈接庫(kù)
在具體闡述MATLAB環(huán)境下調(diào)用動(dòng)態(tài)鏈接庫(kù)函數(shù)訪問(wèn)外部硬件之前,有必要對(duì)動(dòng)態(tài)鏈接庫(kù)做簡(jiǎn)要介紹。動(dòng)態(tài)鏈接庫(kù)英文為Dynamic Linka ble Library,縮寫DLL,最初是為了解決代碼共享的問(wèn)題而提出的.通俗的理解可以把DLL看成一種倉(cāng)庫(kù),它提供一些可以直接拿來(lái)使用的變量、函數(shù)或類。動(dòng)態(tài)鏈接庫(kù)可以使用不同編程語(yǔ)言來(lái)編寫,只要符合標(biāo)準(zhǔn)即可。為了加深對(duì)動(dòng)態(tài)鏈接庫(kù)函數(shù)調(diào)用的理解,下面以C/C++語(yǔ)言為例簡(jiǎn)要介紹動(dòng)態(tài)鏈接庫(kù)的編寫步驟。首先介紹兩組關(guān)鍵字:
1)_declspec(dllimport)
這組關(guān)鍵字表示從DLL中導(dǎo)入函數(shù)或者數(shù)據(jù),一般用在DLL對(duì)應(yīng)的頭文件中。
2)_declspec(dllexport)
這組關(guān)鍵字表示從DLL中導(dǎo)出函數(shù)或者數(shù)據(jù),一般用在DLL對(duì)應(yīng)的工程文件中。
編寫動(dòng)態(tài)鏈接庫(kù)函數(shù)的方法與編寫一般函數(shù)的方法基本相同,只不過(guò)要對(duì)庫(kù)中的可導(dǎo)出函數(shù)進(jìn)行必要的申明。下面以VC環(huán)境下一個(gè)最簡(jiǎn)單的DLL工程dll_test進(jìn)行說(shuō)明,工程包含dll_test.h和dll_test.cpp兩個(gè)文件。
編譯上述dll_test工程即可得到動(dòng)態(tài)鏈接庫(kù)dll_test.dll(在Debug或Release目錄下),此動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)了add和sub函數(shù)的功能。在解決一些實(shí)際問(wèn)題過(guò)程中,有時(shí)會(huì)遇到只有DLL而沒(méi)有與之相對(duì)應(yīng)的頭文件的情況,而MATLAB在調(diào)用DLL文件中的函數(shù)之前,必須具備頭文件中的函數(shù)聲明才行,這樣根據(jù)上述DLL的編寫規(guī)范可以很容易的編寫出與所調(diào)用的DLL相對(duì)應(yīng)的頭文件。
2 MATLAB調(diào)用C/C++動(dòng)態(tài)鏈接庫(kù)
從Matlab6.5(R13)起,Matlab提供了對(duì)動(dòng)態(tài)連接庫(kù)DLL文件的接口。利用這個(gè)接口,可以在Matlab中調(diào)用動(dòng)態(tài)連接庫(kù)導(dǎo)出的函數(shù)。MAT LAB加載和使用動(dòng)態(tài)鏈接庫(kù)函數(shù)僅通過(guò)7~8個(gè)函數(shù)就可以實(shí)現(xiàn),只要掌握這些函數(shù)的使用方法,就掌握了加載和應(yīng)用動(dòng)態(tài)鏈接的基本方法,從而可以在MATLAB平臺(tái)下輕松實(shí)現(xiàn)對(duì)硬件的訪問(wèn)。
利用MATLAB共享庫(kù)接口實(shí)現(xiàn)對(duì)外部DLL庫(kù)的調(diào)用主要有以下幾個(gè)步驟。
1)加栽動(dòng)態(tài)鏈接庫(kù)文件
在使用動(dòng)態(tài)鏈接庫(kù)之前,必須將所需的動(dòng)態(tài)鏈接庫(kù)加載到MATLAB工作空間中,之后MATLAB才能調(diào)用動(dòng)態(tài)庫(kù)中的函數(shù)。函數(shù)lodalibrary用于加載動(dòng)態(tài)鏈接庫(kù),其使用語(yǔ)法如下:
loadlibrary(‘shdib’,‘hfile’)
loadlibrary函數(shù)有兩個(gè)輸入?yún)?shù),參數(shù)shrlib表示庫(kù)文件的名稱,參數(shù)hfile為對(duì)應(yīng)庫(kù)的C語(yǔ)言頭文件,C語(yǔ)言的頭文件用于向MATLAB提供基本的函數(shù)說(shuō)明。下面以一示例說(shuō)明loadlibrary的用法,在命令提示窗口中輸入如下命令:
>>loadlibrary(‘dll_test’,‘dll_test.h’) (1)
通過(guò)以上命令即將dll_test.dll加載到MATLAB工作空間中。
2)瀏覽動(dòng)態(tài)庫(kù)中的函數(shù)
成功加載動(dòng)態(tài)鏈接庫(kù)后便可調(diào)用庫(kù)中提供的函數(shù)。與函數(shù)使用類似,在調(diào)用函數(shù)之前首先要明確函數(shù)各輸入輸出參數(shù)的含義及數(shù)據(jù)類型。一般情況下動(dòng)態(tài)庫(kù)編寫者會(huì)提供相應(yīng)函數(shù)的幫助文檔,以便用戶理解函數(shù)的含義并對(duì)其進(jìn)行調(diào)用。動(dòng)態(tài)鏈接庫(kù)大多使用C或者C++語(yǔ)言編寫,然而標(biāo)準(zhǔn)的C或C++數(shù)據(jù)類型與MATLAB所使用的數(shù)據(jù)類型不盡相同,因此調(diào)用函數(shù)前首先要弄清被調(diào)用函數(shù)參數(shù)對(duì)應(yīng)于MATLAB環(huán)境下的數(shù)據(jù)類型。使用函數(shù)libfunctions可在MATLAB環(huán)境下查看動(dòng)態(tài)庫(kù)中函數(shù)的聲明,并將原C函數(shù)中參數(shù)類型以對(duì)應(yīng)MATLAB參數(shù)類型顯示,之后便能正確的按照MATLAB語(yǔ)法規(guī)則進(jìn)行調(diào)用。libfunctions用法如下:
libfunctions(‘libname’,‘-full’)
參數(shù)libname為已加載到MATLAB工作空間的動(dòng)態(tài)庫(kù)文件名,-full為可選參數(shù)用于輸出函數(shù)的詳細(xì)說(shuō)明。
>>libfunctions(‘dll_test’,‘-full’) (2)
輸入語(yǔ)句(2)后命令行中會(huì)顯示所有dll_test庫(kù)中的函數(shù),如下:
Functions in library dll_test:
int32 add(int32,int32)
int32 sub(int32,int32)
3)調(diào)用動(dòng)態(tài)庫(kù)中的導(dǎo)出函數(shù)
明確了動(dòng)態(tài)庫(kù)中函數(shù)的參數(shù)類型后,便可利用MATLAB提供的calllib接口函數(shù)對(duì)庫(kù)中函數(shù)進(jìn)行調(diào)用。calllib函數(shù)使用方法如下:
[x1,…,xN]=calllib(‘libname’,‘funcname’,arg1,…,argN)
參數(shù)libname表示被調(diào)用函數(shù)所在的庫(kù)文件名,funcname為被調(diào)用的函數(shù)名稱,arg1,…,argN為函數(shù)funename的輸入?yún)?shù),x1,…,xN為函數(shù)funcname的返回值。以下為dll_test.dll中add函數(shù)的調(diào)用示例:
>>calllib(‘dll_test’,‘add’,1,2)
ans=
3
4)卸載動(dòng)態(tài)鏈接庫(kù)
當(dāng)不再需要對(duì)動(dòng)態(tài)庫(kù)中的函數(shù)進(jìn)行訪問(wèn)后,應(yīng)及時(shí)將動(dòng)態(tài)庫(kù)從MATLAB工作空間中卸載。與加載動(dòng)態(tài)庫(kù)類似MATLAB也提供對(duì)應(yīng)的卸載動(dòng)態(tài)庫(kù)的命令unloadlibrary,例如:
>>unloadlibrary(‘dll_test’)
通過(guò)以上4步便可實(shí)現(xiàn)在MATLAB環(huán)境下對(duì)動(dòng)態(tài)鏈接庫(kù)導(dǎo)出函數(shù)的調(diào)用。在實(shí)際應(yīng)用中通過(guò)調(diào)用硬件商提供的動(dòng)態(tài)鏈接庫(kù)或者將其提供的API函數(shù)編譯為動(dòng)態(tài)鏈接庫(kù),便可實(shí)現(xiàn)在MATLAB平臺(tái)下實(shí)現(xiàn)對(duì)硬件資源的訪問(wèn)。
c++相關(guān)文章:c++教程
評(píng)論