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