亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        在MATLAB環(huán)境中調(diào)用DLL對硬件資源訪問的方法

        2012-01-15 06:02:34饒和昌趙英俊
        電子設(shè)計(jì)工程 2012年14期
        關(guān)鍵詞:庫中調(diào)用動態(tài)

        饒和昌,趙英俊

        (華中科技大學(xué) 機(jī)械科學(xué)與工程學(xué)院,湖北 武漢430074)

        MATLAB是美國MathWorks公司開發(fā)的高性能的科學(xué)與工程計(jì)算軟件,憑借其強(qiáng)大的科學(xué)計(jì)算和繪圖功能、大量穩(wěn)定可靠的算法庫和簡潔高效的編程語言,被科技工作者們廣泛應(yīng)用于自動控制、數(shù)學(xué)運(yùn)算、信號分析、圖像處理等各行各業(yè)[1-2]。盡管MATLAB本身是一個完整的、自成體系的編程和數(shù)據(jù)處理環(huán)境,但由于語言的特性使其訪問硬件的能力相對較差,這在一定程度上限制了它的使用。對于那些涉及復(fù)雜算法同時又需要對硬件資源進(jìn)行訪問的系統(tǒng),一般的做法是在一個通用的編程平臺(如 Visual C++、Visual Basic、Delphi等)上實(shí)現(xiàn)對硬件資源的訪問,而后調(diào)用MATLAB算法對數(shù)據(jù)進(jìn)行處理。這種方法優(yōu)點(diǎn)是通用性好,程序運(yùn)行效率高,適用大多數(shù)場合,但對開發(fā)人員編程能力有較高要求,開發(fā)周期較長。在一些需要快速的驗(yàn)證模型和算法的場合,為充分發(fā)揮MATLAB強(qiáng)大的數(shù)值計(jì)算能力,以MATLAB作為主開發(fā)平臺來得更為合適。隨著模塊化的設(shè)計(jì)思想在越來越多的產(chǎn)品中得到體現(xiàn),器件生產(chǎn)廠商們一般都會提供該產(chǎn)品的二次開發(fā)函數(shù)庫,方便了開發(fā)者們對硬件操作的同時,也使得MATLAB通過外部程序接口實(shí)現(xiàn)對硬件的訪問成為可能。

        文中具體論述一種基于動態(tài)鏈接庫調(diào)用實(shí)現(xiàn)MATLAB訪問一般硬件的方法,并將該方法用于對高精度氣壓傳感器MS5803的數(shù)據(jù)采集,實(shí)現(xiàn)了MATLAB與硬件的無縫結(jié)合,極大的方便了數(shù)據(jù)的后續(xù)處理。

        1 動態(tài)鏈接庫

        在具體闡述MATLAB環(huán)境下調(diào)用動態(tài)鏈接庫函數(shù)訪問外部硬件之前,有必要對動態(tài)鏈接庫做簡要介紹。動態(tài)鏈接庫英文為Dynamic Linkable Library,縮寫DLL,最初是為了解決代碼共享的問題而提出的,通俗的理解可以把DLL看成一種倉庫,它提供一些可以直接拿來使用的變量、函數(shù)或類[3]。動態(tài)鏈接庫可以使用不同編程語言來編寫,只要符合標(biāo)準(zhǔn)即可。為了加深對動態(tài)鏈接庫函數(shù)調(diào)用的理解,下面以C/C++語言為例簡要介紹動態(tài)鏈接庫的編寫步驟。首先介紹兩組關(guān)鍵字:

        1)_declspec(dllimport)

        這組關(guān)鍵字表示從DLL中導(dǎo)入函數(shù)或者數(shù)據(jù),一般用在DLL對應(yīng)的頭文件中。

        2)_declspec(dllexport)

        這組關(guān)鍵字表示從DLL中導(dǎo)出函數(shù)或者數(shù)據(jù),一般用在DLL對應(yīng)的工程文件中。

        編寫動態(tài)鏈接庫函數(shù)的方法與編寫一般函數(shù)的方法基本相同,只不過要對庫中的可導(dǎo)出函數(shù)進(jìn)行必要的申明。下面以VC環(huán)境下一個最簡單的DLL工程dll_test進(jìn)行說明,工程包含dll_test.h和dll_test.cpp兩個文件。

        //dll_test.h

        __declspec(dllexport) int add(int m, int n);

        __declspec(dllexport) int sub(int m, int n);

        //dll_test.cpp

        #include ”dll_test.h”

        __declspec(dllexport) int add(int m, int n)

        {

        return (m+n);

        }

        __declspec(dllexport) int sub(int m, int n)

        {

        return (m - n);

        }

        編譯上述dll_test工程即可得到動態(tài)鏈接庫dll_test.dll(在Debug或Release目錄下),此動態(tài)鏈接庫實(shí)現(xiàn)了add和sub函數(shù)的功能。在解決一些實(shí)際問題過程中,有時會遇到只有DLL而沒有與之相對應(yīng)的頭文件的情況,而MATLAB在調(diào)用DLL文件中的函數(shù)之前,必須具備頭文件中的函數(shù)聲明才行,這樣根據(jù)上述DLL的編寫規(guī)范可以很容易的編寫出與所調(diào)用的DLL相對應(yīng)的頭文件。

        2 MATLAB調(diào)用C/C++動態(tài)鏈接庫

        從Matlab6.5(R13)起,Matlab提供了對動態(tài)連接庫 DLL文件的接口[1]。利用這個接口,可以在Matlab中調(diào)用動態(tài)連接庫導(dǎo)出的函數(shù)。MATLAB加載和使用動態(tài)鏈接庫函數(shù)僅通過7~8個函數(shù)就可以實(shí)現(xiàn),只要掌握這些函數(shù)的使用方法,就掌握了加載和應(yīng)用動態(tài)鏈接的基本方法,從而可以在MATLAB平臺下輕松實(shí)現(xiàn)對硬件的訪問。

        利用MATLAB共享庫接口實(shí)現(xiàn)對外部DLL庫的調(diào)用主要有以下幾個步驟[4]。

        1)加載動態(tài)鏈接庫文件

        在使用動態(tài)鏈接庫之前,必須將所需的動態(tài)鏈接庫加載到MATLAB工作空間中,之后MATLAB才能調(diào)用動態(tài)庫中的函數(shù)。函數(shù)lodalibrary用于加載動態(tài)鏈接庫,其使用語法如下:

        loadlibrary(‘shrlib’, ‘hfile’)

        loadlibrary函數(shù)有兩個輸入?yún)?shù),參數(shù)shrlib表示庫文件的名稱,參數(shù)hfile為對應(yīng)庫的C語言頭文件,C語言的頭文件用于向MATLAB提供基本的函數(shù)說明。下面以一示例說明loadlibrary的用法,在命令提示窗口中輸入如下命令:

        >>loadlibrary(‘dll_test’, ’dll_test.h’) (1)

        通過以上命令即將dll_test.dll加載到MATLAB工作空間中。

        2)瀏覽動態(tài)庫中的函數(shù)

        成功加載動態(tài)鏈接庫后便可調(diào)用庫中提供的函數(shù)。與函數(shù)使用類似,在調(diào)用函數(shù)之前首先要明確函數(shù)各輸入輸出參數(shù)的含義及數(shù)據(jù)類型。一般情況下動態(tài)庫編寫者會提供相應(yīng)函數(shù)的幫助文檔,以便用戶理解函數(shù)的含義并對其進(jìn)行調(diào)用。動態(tài)鏈接庫大多使用C或者C++語言編寫,然而標(biāo)準(zhǔn)的C或C++數(shù)據(jù)類型與MATLAB所使用的數(shù)據(jù)類型不盡相同,因此調(diào)用函數(shù)前首先要弄清被調(diào)用函數(shù)參數(shù)對應(yīng)于MATLAB環(huán)境下的數(shù)據(jù)類型。使用函數(shù)libfunctions可在MATLAB環(huán)境下查看動態(tài)庫中函數(shù)的聲明,并將原C函數(shù)中參數(shù)類型以對應(yīng)MATLAB參數(shù)類型顯示,之后便能正確的按照MATLAB語法規(guī)則進(jìn)行調(diào)用。libfunctions用法如下:

        libfunctions(‘libname’, ‘-full’)

        參數(shù)libname為已加載到MATLAB工作空間的動態(tài)庫文件名,-full為可選參數(shù)用于輸出函數(shù)的詳細(xì)說明。

        >>libfunctions(‘dll_test’, ‘-full’) (2)

        輸入語句(2)后命令行中會顯示所有dll_test庫中的函數(shù),如下:

        Functions in library dll_test:

        int32 add(int32, int32)

        int32 sub(int32, int32)

        3)調(diào)用動態(tài)庫中的導(dǎo)出函數(shù)

        明確了動態(tài)庫中函數(shù)的參數(shù)類型后,便可利用MATLAB提供的calllib接口函數(shù)對庫中函數(shù)進(jìn)行調(diào)用。calllib函數(shù)使用方法如下:

        [x1, ..., xN]=calllib(‘libname’, ‘funcname’, arg1, ...,argN)

        參數(shù)libname表示被調(diào)用函數(shù)所在的庫文件名,funcname為被調(diào)用的函數(shù)名稱,arg1,…,argN為函數(shù)funcname的輸入?yún)?shù),x1,…,xN為函數(shù)funcname的返回值。以下為dll_test.dll中add函數(shù)的調(diào)用示例:

        >> calllib(‘dll_test’, ‘a(chǎn)dd’, 1, 2)

        ans=

        3

        4)卸載動態(tài)鏈接庫

        當(dāng)不再需要對動態(tài)庫中的函數(shù)進(jìn)行訪問后,應(yīng)及時將動態(tài)庫從MATLAB工作空間中卸載。與加載動態(tài)庫類似MATLAB也提供對應(yīng)的卸載動態(tài)庫的命令unloadlibrary,例如:

        >>unloadlibrary(‘dll_test’)

        通過以上4步便可實(shí)現(xiàn)在MATLAB環(huán)境下對動態(tài)鏈接庫導(dǎo)出函數(shù)的調(diào)用。在實(shí)際應(yīng)用中通過調(diào)用硬件商提供的動態(tài)鏈接庫或者將其提供的API函數(shù)編譯為動態(tài)鏈接庫,便可實(shí)現(xiàn)在MATLAB平臺下實(shí)現(xiàn)對硬件資源的訪問。

        3 用MATLAB實(shí)現(xiàn)傳感器的數(shù)據(jù)采集

        MS5803是瑞士Intersema公司生產(chǎn)的一款集成有壓阻式壓力傳感器和ADC接口的SMD混合集成電路,具有體積?。?.2×6.4 mm)、穩(wěn)定性好、低功耗(1 μA)、高分辨率、高精度等特點(diǎn),其內(nèi)置的24位A/D轉(zhuǎn)換器可實(shí)現(xiàn)對壓力和溫度的采樣,通過標(biāo)準(zhǔn)I2C和SPI接口與外部設(shè)備通信[5]。本設(shè)計(jì)以MATLAB為軟件開發(fā)平臺,MS5803為目標(biāo)器件,通過DLL調(diào)用方式實(shí)現(xiàn)對傳感器的數(shù)據(jù)采集,并對氣壓高度算法進(jìn)行快速測試與驗(yàn)證。氣壓高度計(jì)的原型系統(tǒng)結(jié)構(gòu)框圖如圖1所示[6]。

        圖1 氣壓高度計(jì)原型系統(tǒng)結(jié)構(gòu)Fig.1 Structure diagram of a barometric altimetry prototype

        圖 1中GY7502為USB轉(zhuǎn)SPI適配器,一端與筆記本相連,另一端與MS5803連接,MS5803選擇工作在SPI接口模式。該原型系統(tǒng)通過一個簡單的接口適配器便建立了PC與傳感器的連接,之后即可按照一定的通信規(guī)則進(jìn)行編程完成對MS5803數(shù)據(jù)采集,輕松的實(shí)現(xiàn)了數(shù)據(jù)由目標(biāo)器件到上位機(jī)的傳輸,后續(xù)借助于PC強(qiáng)大的運(yùn)算功能快速的對算法和模型進(jìn)行測試。

        下面以MATLAB環(huán)境下實(shí)現(xiàn)對MS5803數(shù)據(jù)的采集為例,具體介紹前述關(guān)于擴(kuò)展MATLAB硬件訪問能力的方法。

        GY7502型USB-SPI適配器以動態(tài)鏈接庫的方式提供了開發(fā)所需的接口函數(shù)并提供了各功能函數(shù)的頭文件定義,開發(fā)者只需要熟悉各個接口函數(shù)的定義及其功能便能方便的實(shí)現(xiàn)對SPI接口器件的操作,而無需關(guān)注底層硬件的具體實(shí)現(xiàn)。以下為本設(shè)計(jì)中使用到了庫函數(shù)聲明。

        //GY7502.h

        DWORD __stdcall GY7502_Open();//打開設(shè)備

        DWORD __stdcall GY7502_Close();//關(guān)閉設(shè)備

        DWORD __stdcall GY7502_SetConfig(pGY7502_CONFIG_INFO pConfigInfo);

        //設(shè)置通信頻率及SPI總線模式

        DWORD __stdcall GY7502_Read(pGY7502_DATA_INFO pDataInfo);//讀 SPI總線

        DWORD __stdcall

        GY7502_Write (pGY7502_DATA_INFO pDataInfo);// 寫SPI總線

        pGY7502_CONFIG_INFO和pGY7502_DATA_INFO為GY7502.h定義的兩種結(jié)構(gòu)體數(shù)據(jù)類型分別用于配置GY7502適配器工作模式和作為接收或發(fā)送數(shù)據(jù)的緩存。

        MS5803在出產(chǎn)的時候生產(chǎn)廠商已經(jīng)對其進(jìn)行了初始標(biāo)定,并將標(biāo)定系數(shù)C1~C6固化在內(nèi)部的128位PROM中,傳感器采樣轉(zhuǎn)換輸出的原始數(shù)據(jù)D1和D2需要經(jīng)過系數(shù)C1~C6按照MS5803數(shù)據(jù)手冊提供的模型進(jìn)行修正,才能計(jì)算出真實(shí)意義上的壓力值和溫度值。為此傳感器每次上電后系統(tǒng)需要先讀取出系數(shù)C1~C6,之后才能進(jìn)行壓力和溫度的采樣,基本工作流程如圖2所示。

        圖2 數(shù)據(jù)采集基本工作流程Fig.2 Flow chart of data acquisition

        下面給出在MATLAB環(huán)境下通過調(diào)用動態(tài)鏈接庫的方法實(shí)現(xiàn)傳感器數(shù)據(jù)采集的關(guān)鍵程序段。

        %sample.m

        %加載GY7502所需的動態(tài)鏈接庫

        loadlibrary GY7502 GY7502.h

        %定義配置參數(shù)和讀寫緩沖

        SetConfigInfo=libstruct('GY7502_CONFIG_INFO')

        DataInfo=libstruct('GY7502_DATA_INFO')

        D1=libstruct('GY7502_DATA_INFO')

        D2=libstruct('GY7502_DATA_INFO')

        ...

        %打開設(shè)備建立連接

        calllib(‘GY7502’, ‘GY7502_Open’)

        %配置GY7502工作模式

        calllib (‘GY7502’, ‘GY7502_SetConfig’, GY7502_CONFIG_INFO)

        %復(fù)位傳感器,讀取標(biāo)定系數(shù)C1~C6

        %啟動一次采樣

        %讀取壓力和溫度轉(zhuǎn)換數(shù)值D1、D2

        [result, D1]= calllib (‘GY7502’, ‘GY7502_Write’,DataReadD1)

        [result, D2]= calllib (‘GY7502’, ‘GY7502_Write’,DataReadD2)

        %計(jì)算溫度T及溫度補(bǔ)償后的壓力P

        %采樣結(jié)束斷開連接

        calllib(‘GY7502’, ‘GY7502_Close’)

        %卸載動態(tài)鏈接庫

        unloadlibrary GY7502

        完成數(shù)據(jù)采集之后,便可進(jìn)行壓力與高度換算。由于數(shù)據(jù)直接引入到MATLAB工作環(huán)境,借助于MATLAB強(qiáng)大的數(shù)值計(jì)算功能,極大地方便了后續(xù)算法及模型的測試工作,同時也降低了開發(fā)者的工作強(qiáng)度。

        4 結(jié) 論

        MATLAB強(qiáng)大的數(shù)值計(jì)算能力深受廣大科技工作者的喜愛,但其對硬件的支持能力相對較弱。文中通過調(diào)用動態(tài)鏈接庫的方法,增強(qiáng)了MATLAB對硬件的訪問能力,使得開發(fā)者可以在MATLAB環(huán)境下直接對硬件進(jìn)行操作,極大地方便了系統(tǒng)算法和模型的測試。

        [1]楊波,亓波.精通Matlab7.0混合編程[M].北京:電子工業(yè)出版社,2006.

        [2]張志涌.精通Matlab6.5版 [M].北京:北京航空航天大學(xué)出版社,2003.

        [3]任哲.MFC Windows應(yīng)用程序設(shè)計(jì)[M].2版.北京:清華大學(xué)出版社,2007.

        [4]潘大夫,汪博,周志強(qiáng).Matlab與C/C++混合編程技術(shù)研究[J].計(jì)算機(jī)應(yīng)用,2009,30(2):465-469.PAN Da-fu,WANG Bo,ZHOU Zhi-qiang.Research on mixed programming technology of Matlab and C/C++[J].Computer Engineering and Design,2009,30(2):465-469.

        [5]MEAS Switzerland SA.DS-MS5803-01BA.pdf[EB/OL].(2010-05-11)[2011-04-15].http://www.intersema.ch/index.php?option=com_rubberdoc&view=doc&id=88&format=raw.

        [6]趙天成,饒和昌.一種基于MS5803和氣象數(shù)據(jù)的高度測量方法[J].電子設(shè)計(jì)工程,2011,19(14):44-47.ZHAO Tian-cheng,RAO He-chang.A barometric altimetry method based on MS5803 and meteorological data[J].Electronic Design Engineering,2011,19(14):44-47.

        猜你喜歡
        庫中調(diào)用動態(tài)
        國內(nèi)動態(tài)
        動物城堡
        動物城堡
        國內(nèi)動態(tài)
        國內(nèi)動態(tài)
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        動態(tài)
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        智能盤庫在自動化立體庫中的探索和應(yīng)用
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        亚洲AV无码永久在线观看| 青青草是针对华人绿色超碰| 国产成人精品一区二区日出白浆| 亚洲伊人av综合福利| 日韩亚洲国产中文字幕| 黄片视频免费观看蜜桃| 99久久精品费精品国产一区二| 亚洲国产高清在线观看视频| yw193.can尤物国产在线网页| 免费人妻精品区一区二区三| 国产一区二区三区内射| 国产精品人人做人人爽人人添| 亚洲人成网站色www| 亚洲av无码片在线观看| 久久久久久一级毛片免费无遮挡| 日韩少妇人妻一区二区| 亚洲一区二区三区偷拍厕所| 丰满少妇呻吟高潮经历| 国产AV无码专区亚洲AⅤ| 午夜视频免费观看一区二区 | 小黄片免费在线播放观看| 青青草视频在线观看色| 久久久老熟女一区二区三区| 国产亚洲精品自在久久蜜tv| 国产在线视频网站不卡| 亚洲成av人片乱码色午夜| 欧美午夜精品一区二区三区电影| 色播中文字幕在线视频| 精品人妻一区二区三区av| 精品国产一区二区三区性色| 亚洲精品v欧洲精品v日韩精品| 国产精品jizz观看| 日韩久久av电影| 视频一区视频二区亚洲| 美女扒开大腿让男人桶| 国产精品毛片无码| 亚洲a∨好看av高清在线观看| 亚洲精品天堂日本亚洲精品| 人妻 偷拍 无码 中文字幕| 国产成人精品一区二区三区免费| 性一交一乱一伦一视频一二三区|