ALTE DOCUMENTE
|
||||||||||
GENERAREA DE EXECUTABILE CU AJUTORUL MATLAB
Dezvoltarea aplicatiilor de timp real reprezinta un do meniu extrem de actual si în plina dezvoltare al automaticii. Prin dezvoltarea unor aplicatii de timp real se îmbina cunostiinte din diferite domenii, pornind de la electronica si masurari (placi de achizitie), continuând cu semnale, sisteme si transmisii de date si ajungând la algoritmi evoluati pentru analiza si sinteza semnalelor, pentru proiectarea regulatoarelor si software pentru dezvoltarea de aplicatii de timp real.
Pachetul de programe MATLAB/Simulink este de multa vreme un standard în ceea ce priveste analiza si sinteza sistemelor de reglare si control. Evolutia sa în timp este puternic corelata de cerintele tot mai pretentioase ale inginerilor automatisti si din alte domenii ingineresti. De fapt puterea sa de calcul îl face la ora actuala indispensabil în tot mai multe aspecte ale activitatilor stiintifice. MATLAB reprezinta un limbaj unanim acceptat în mediile stiintifice internationale.
Ideea de la care a pornit dezvoltarea acestui limbaj a fost aceea de a pune la dispozitia utilizatorilor de calculatoare personale din gama IBM-PC sau McIntosh puternicele biblioteci de programe LINPACK si EISPACK dezvoltate initial pentru mainframe-uri din gama PDP-11.
Pentru o mai bine încadrare a subiectelor tratate de capitolele urmatoare, vom sintetiza arhitectura dupa care este proiectat mediul MATLAB/Simulink/RTW.
Arhitectura MATLAB/Simulink/RTW
Initial a fost conceput limbajul de programare MATLAB, bazat pe limbajul C si extensia sa pe obiecte C++. În acest limbaj au fost implementate puternicele biblioteci de calcul matricial. De fapt ideea cea mai generoasa care sta la baza MATLAB, o reprezinta capacitatea de manipulare fara restrictii a unui element de baza de tip matrice complexa. În acest fel se implementeaza biblioteci de functii matriciale cât si biblioteci orientate pe element. Se elimina aproape total din procesul de programare necesitatea de a apela la instructiuni de ciclare de tip for sau while.
Cu ajutorul unui compilator special conceput (mcc, MATLAB C Compiler), programe scrise în limbaj MATLAB se pot translata în limbaj C/C++ care apoi se pot compila pentru a crea programe executabile. Chiar daca nu suntem programatori C/C++ experimentati, putem scrie programe în MATLAB pe care apoi sa le translatam în C/C++ si utiliza ulterior în alte aplicatii.
Efortul de a programa în MATLAB este cu mult mai mic decât cel facut în C. În general un program ce contine sute sau chiar mii de instructiuni C se poate condensa în numai câteva linii de instructiuni MATLAB.
Mediul MATLAB fiind un mediu deschis, proiectantii au constituit nuclee de programe grupate în asa-numitele toolbox-uri. În fapt, fiind bazat pe limbajul C, MATLAB nu contine propriu-zis instructiuni, ci face apel la o multitudine de functii grupate functional în toolbox-uri.
Odata cu cresterea puterii de calcul a microprocesoarelor, a fost posibila implementarea unei interfete grafice cu MATLAB, numite Simulink. În Simulink s-a proiectat o puternica biblioteca de obiecte de tip sistem cu care proiectantul poate implementa foarte rapid si intuitiv experimente de simulare din diverse domenii: control automat, procesare de semnale sau calcul financiar.
Retinem însa un fapt foarte important: MATLAB/Simulink au fost initial concepute pentru modelarea si simularea sistemelor dinamice. si la momentul actual pachetul de programe este în proportie covârsitoare utilizat pentru modelare si simulare. Din aceasta cauza exista o oarecare dihotomie în procesul global de implementare a solutiilor tehnice: procesul interactiv de proiectare a algoritmilor de reglare câstiga în calitate si rapiditate, pe când procesul de implementare efectiva a algoritmilor si testarea lor pe instalatie devenea un proces fara nici o legatura cu pachetul de simulare si modelare.
Pentru a putea oferi proiectantilor automatisti un pachet complet, s-a impus ulterior RTW (Real Time Workshop). Pornind de la un model Simulink se poate genera un executabil care sa implementeze functionarea modelului, eventual chiar în timp real.
În acest fel simularea functionarii unui sistem dinamic se poate face în timp real si chiar cu posibilitatea modificarii parametrilor în timpul functionarii în timp real.
In acest capitol se va descrie versiunea 3.0 a compilatorului MATLAB® .
Compilatorul MATLAB preia fisiere MATLAB (cu extensia .M, sau, pe scurt, fisiere-M) si genereaza sursa cod C sau C++ sau cod P.
Compilatorul MATLAB (MATLAB Compiler) genereaza urmatoarele tipuri de cod sursa:
Cod sursa C pentru constructia fisierelor MEX.
Cod sursa C sau C++ pentru a putea fi combinat cu alte module pentru a forma aplicatii de sine-statatoare.
Cod C pentru asa-numitele functii-S care se folosesc în Simulink®.
Biblioteci C partajate (shared) (numite si biblioteci cu legare dinamica sau DLL în sistemul Microsoft Windows 95/98/2000/NT) si biblioteci statice C++. Acestea pot fi folosite fara prezenta MATLAB pe calculatorul host, dar necesita MATLAB C/C++ Math Library si/sau Graphics Library.
Aplicatiile de sine-statatoare (stand-alone applications) nu necesita mediul MATLAB la momentul rularii. Ele pot functiona si fara ca MATLAB sa fie instalat pe sistemul respectiv. Totodata, compilatorul MATLAB necesita biblioteca matematica MATLAB C/C++ Math Library pentru a crea aplicatii independente (de sine-statatoare) care se bazeaza pe capabilitatile matematice si de analiza a datelor furnizate de MATLAB.
În fapt, MATLAB reprezinta o dezvoltare pentru PC-uri a bibliotecilor matematice LINPACK si EISPACK dezvoltate pentru mai vechile mainframe-uri PDP-11.
De asemenea, MATLAB Compiler mai necesita si biblioteca grafica MATLAB C/C++ Graphics Library pentru a crea aplicatii independente care folosesc functii Handle Graphics®.
Mediul MATLAB are la baza notiunea de interpretor MATLAB. În acest mediu se pot executa comenzi MATLAB de la prompter-ul de comanda (command prompt), se pot executa colectii de comenzi MATLAB grupate în fisiere script cu extensia .m sau se pot executa fisiere MEX. Când se foloseste mediul MATLAB, se utilizeaza de fapt interpretorul MATLAB. În sine MATLAB este un limbaj interpretor de nivel înalt. Expresia Compilator MATLAB este oarecum improprie, deoarece este vorba de fapt de un translator care translateaza comenzile MATLAB într-un sir de instructiuni care vor forma codul sursa scris în C sau C++. Mai trebuie facuta distinctia de compilatorul C sau C++, care se foloseste în faza finala pentru 21121f517v a obtine un executabil independent.
În acest capitol vom prezenta aceste categorii de cod sursa C sau C++ si vom explica structura acestui cod.
4.1. Familia Compilatorului MATLAB
Introducere în compilatorul MATLAB
Se va folosi în continuare versiunea 3 a MATLAB® Compiler. Compilatorul MATLAB preia fisiere script (M-files) la intrare si genereaza cod sursa C sau C++ sau cod sursa P la iesire. MATLAB Compiler poate genera urmatoarele tipuri de cod sursa:
cod sursa C pentru construirea fisierelor MEX (C-MEX files). Fisierele MEX (MATLAB External Files) sunt fisiere care sunt scrise în C si care pot fi apelate, printr-o interfata de aplicatie (API, Application Program Interface), si utilizate de programe MATLAB.
cod sursa C sau C++ pentru combinarea cu alte module pentru obtinerea de aplicatii de sine-statatoare (stand-alone applications). Aplicatiile de sine-statatoare (executabile sub DOS sau Windows, deci fisiere cu extensia .exe) nu necesita prezenta MATLAB în momentul executiei; ele pot rula chiar daca MATLAB nu este instalat pe sistemul în cauza. MATLAB Compiler necesita necesita biblioteca matematica MATLAB C/C++ (MATLAB C/C++ Math Library) pentru a crea executabile care se bazeaza pe nucleul matematic si de analiza a datelor ce confera forta MATLAB. MATLAB Compiler necesita de asemenea biblioteca grafica MATLAB C/C++ (MATLAB C/C++ Graphics Library) pentru a crea executabile care folosesc functii grafice (Handle Graphics® functions).
S-functii în cod C (C code S-functions) pentru a fi utilizate cu Simulink®. S-functiile sunt asa-numitele functii sistem care implementeaza mecanismele Simulink de simulare a evolutiei sistemelor dinamice continue, discrete sau hibride.
Biblioteci partajate în C (C shared libraries) care, sub sistemele de operare Microsoft Windows 95/98/2000/NT sunt cunoscute cu extensia DLL (dynamically linked libraries). Aceste functii cu legare dinamica se construiesc prin compilarea functiilor C-MEX.
Biblioteci statice C++ (C++ static libraries). Ele pot fi folosite fara existenta MATLAB, dar necesita prezenta MATLAB C/C++ Math Library.
Mai nou au aparut variantele Matlab C/C++ 2.3 si 3.0 care se integreaza mai bine în medii de dezvoltare a aplicatiilor precum Microsoft Visual Basic sau Excell.
Expresia MATLAB interpreter se refera la aplicatii care accepta comenzi MATLAB, executa M-files si MEX-files. Când se foloseste MATLAB, folosim de fapt interpretorul MATLAB. Expresia MATLAB Compiler se refera la un produs care translateaza M-files în cod sursa C sau C++.
Se va folosi notiunea de Compilator (scris cu majuscula) pentru MATLAB C Compiler pentru a face deosebirea de compilatoarele de C efectiv folosite.
Figura de mai jos ilustreaza diferitele moduri în care se poate folosi compilatorul MATLAB. Blocurile gri reprezinta codul scris de utilizator; blocurile albe reprezinta codul generat de compilator iar blocurile umbrite reprezinta unelte soft ale firmei MathWorks sau ale altor producatori.
Moduri de folosire a compilatorului MATLAB
Compilatorul preia fisierele script (.m) ale utilizatorului si genereaza cod C sau C++. El poate genera, de asemenea, unul din cele 5 fisiere wrapper în functie de target-ul specificat. Tabelul de mai sus arata fisierele wrapper pe care le poate genera compilatorul, target-ul asociat precum si optiunea -W (wrapper) folosita.
Fiecare nod numerotat din figura de mai jos indica o combinatie de cod C/C++ si un wrapper ce genereaza un target type specific.
Wrapper File Fisier interfatare |
Target Ţinta |
-W Setting Setari optiune -W |
|
Stand-alone C or C++ program |
-W main -W mainhg |
MEX |
MATLAB C MEX-file |
-W mex |
Library |
C shared library or C++ static library |
-W lib:libname |
Simulink S-function |
Simulink C MEX-file |
-W simulink |
COM |
COM object (Component Object Model) |
-W com:<componentname>[,<classname>[,<major>.<minor>]] -W comhg:<componentname>[,<classname>[,<major>.<minor>]] |
Excel |
Excel Plug-in |
-W excel:<componentname>[,<classname>[,<major>.<minor>]] -W excelhg:<componentname>[,<classname>[,<major>.<minor>]] |
Tabel 1-1: Compilatorul 3.0 Fisiere de interfatare (Wrappers) si Ţinte (Targets)
Fisierele formate prin combinarea codului C/C++, numite mai sus "User C/C++ Code", si fisierul wrapper sunt apoi pasate compilatorului C/C++ care le combina cu orice programe C/C++ ale utilizatorului si eventual le leaga împreuna cu bibliotecile corespunzatoare.
Rezultatul final al acestei secvente este descris în tabelul de mai sus.
reprezinta modalitatea de a indica functii de interfatare (Wrapper functions). Aceasta optiune specifica tipul de fisier de interfatare (wrapper) ce va fi generat de compilator. <optiune> poate fi unul dintre cuvintele cheie urmatoare: "mex" pentru a obtine un fisier mex (cu extensie .dll sub Windows, vezi calea 2), "main" pentru a obtine un executabil (stand-alone, fisier cu extensia .exe, vezi calea 1), "simulink" pentru calea 3, prin care se obtine un .dll ce se poate folosi într-un model Simulink, "lib:<string>" pentru a obtine o biblioteca C partajata sau o biblioteca C++ statica (cu numele string), "com:<component-name>,<class-name>,<version>", sau "none" (implicit) pentru a obtine un obiect COM. Pentru lib wrapper, <string> contine numele bibliotecii partajate ce se va construi. Când se genereaza un wrapper "lib", MCC creaza de asemenea un fisier MLIB ce descrie functiile componente ale bibliotecii partajate.
La origine mediul MATLAB a fost conceput ca un mediu de sine-statator. Acest limbaj de nivel foarte înalt satisface toate cerintele unei programari la nivel text orientate pe obiecte. Totusi, acest mediu era un mediu închis. Daca dorim sa beneficiem de multimea de functii MATLAB trebuie sa intram în acest mediu. Rezultatele se pot comunica altor medii de programare numai la nivel de fisiere de date.
Proiectantii de la MathWork au considerat necesara "deschiderea" mediului MATLAB pentru diverse alte medii de programare. Cum la baza MATLAB sta limbajul C/C++, pare foarte naturala crearea unei punti între cele doua medii de programare.
Comunicatia între C/C++ si MATLAB se face în dublu sens. Pe de o parte, programele scrise în C pot beneficia de bibliotecile matematica si grafica ale MATLAB. Pe de alta parte, programele MATLAB pot beneficia de functii MEX (.dll) ce se obtin din fisiere C/C++ compilate. Toata aceasta comunicatie se poate face prin intermediul asa-numitei Application Program Interface (API) de care dispune MATLAB.
Modul uzual de folosire a mediului MATLAB
Extensii prin folosirea MATLAB C Compiler
Crearea de aplicatii independente
Folosirea Compilatorului
Compilatorul Matlab (mcc, MATLAB C Compiler) poate translata M-files în C-files (fisiere C/C++ cu extensia .c sau .cpp). Fisierul C rezultant poate fi folosit în oricare din tipurile executabile incluzând fisiere MEX, executabile sau biblioteci prin generarea unui asa-numit wrapper file. Un wrapper file contine interfata necesara între codul generat de Compilator si tipul de executabil suportat. Spre exemplu, un MEX wrapper contine o rutina-poarta de tip MEX care seteaza parametrii de intrare si de iesire pentru invocarea codului generat de Compilator.
Codul produs de Compilatorul MATLAB este independent de tipul target-ului: MEX, executabil sau biblioteca. Fisierul wrapper furnizeaza interfata necesara pentru crearea target-ului.
Crearea de aplicatii independente în C
Compilatorul MATLAB se apeleaza cu comanda mcc (MATLAB C Compiler). Atunci când este invocat cu optiunea -m, fisierul de intrare (cu extensia .m) se translateaza într-un fisier sursa de cod C care poate fi convertit în oricare din tipurile executabile. "Compilatorul" produce de asemenea si un fisier ambalaj (wrapper file) necesar pentru aplicatia independenta. Apoi compilatorul ANSI C compileaza acest fisier sursa cod C iar fisierele cod obiect rezultate sunt legate cu bibiloteca matematica MATLAB C/C++ Math Library, care trebuie sa existe în momentul compilarii pe calculatorul gazda. Aceasta este conditia minimala pentru a evita erorile run-time. Daca programul apeleaza si la capabilitatile grafice ale MATLAB, atunci este necesara si prezenta bibliotecii grafice MATLAB C/C++ Graphics Library (libsgl), altcumva se semnaleaza în momentul link-editarii run-time error daca se întâlneste o functie din repertoriul Handle Graphics.
Crearea de aplicatii independente în C++
Compilatorul MATLAB, atunci când este invocat cu macro-optiunea -p translateaza fisierul MATLAB de intrare într-un fisier sursa C++ care apoi este compilat si link-editat de compilatorul ANSI C++. Ramân valabile toate observatiile anterioare.
Dezvoltarea unei aplicatii independente (crearea unui executabil)
Procesul de dezvoltare a unei aplicatii independente se poate reprezenta schematic ca în figura de mai jos. Trebuie sa subliniem un aspect important. Desi din context MATLAB C Compiler (mcc) este folosit doar pentru translatarea M-files în C/C++-files, el cuprinde un mecanism complet automatizat de obtinere a executabilului target, obtinut prin invocarea utilitarului mbuild, care se configureaza în functie de compilatorul C/C++ pe care îl folosim si de caile în care se afla utilitarele de sistem necesare.
Folosirea Compilatorului MATLAB poate produce doua tipuri de executabile.
Primul tip este tipul de aplicatie lansat în executie de la consola MS-DOS. Aceste aplicatii se regasesc în fisiere cu extensia .exe.
Al doilea tip de aplicatie este cu extensia .dll sub mediul Windows si reprezinta functii cu legare dinamica, adica functii apelate de aplicatiile Windows în momentul executiei.
În afara acestor doua tipuri de aplicatii, mcc poate genera, daca se specifica acest lucru, numai codul sursa C din care se pot obtine, ulterior, aplicatii de tipul .exe sau .dll.
MATLAB C Compiler (mcc) este executat în doua etape:
În prima etapa se realizeaza translatarea (traducerea) fisierului sursa din limbaj MATLAB (M-file) în fisier sursa cod C, independent de tinta (target). Aceasta translatare înlocuieste fiecare instructiune din limbajul MATLAB într-un set de instructiuni în limbajul C.
În a doua etapa, acest cod sursa C se compileaza corespunzator.
Daca este cerut un executabil .exe, se genereaza un fisier wrapper corespunzator care va gestiona procesul de generare a aplicatii. Se va folosi în acest proces un compilator ANSI C/C++ precum si un editor de legaturi care sa genereze fisierul target (cu extensia .exe) corespunzator.
Daca se solicita generarea unui fisier MEX, care are extensia .dll sub sistemul de operare Windows, atunci se genereaza un alt tip de fisier wrapper si procesul de generare se termina cu producerea fisierului .dll corespunzator.
Aceste fisier .dll generat nu se poate executa în mod MS-DOS, precum aplicatiile .exe, ci va putea fi folosit fie de o aplicatie Windows, fie direct din mediul MATLAB.
Din mediul MATLAB, o functie .dll se poate apela exact ca orice functie MATLAB (built-in sau .m). Daca în MATLAB exista doua fisiere cu acelasi nume si unul are extensia .m iar celalalt are extensia .dll, MATLAB va apela functia cu extensia .dll, care, în cele mai multe cazuri, se executa mai rapid.
MEX-files sunt subrutine cod obiect produse din cod sursa C sau Fortran. Ele se comporta exact ca functiile .m sau ca cele built-in cu care opereaza MATLAB. De fapt ele pot fi considerate functii built-in externe, ce nu se încarca la încarcarea programului MATLAB, ci numai când sunt apelate (sunt precompilate).
MEX-files sunt subrutine cu legare dinamica pe care interpretorul MATLAB le poate încarca si executa în mod automat. În acest mod putem apela din mediul MATLAB subrutine scrise în C sau Fortran ca si cum ele ar fi functii built-in care apartin MATLAB.
MEX-files au diferite aplicatii.
programe mari scrise în C sau Fortran ce nu mai necesita scrierea lor în limbaj MATLAB
Calcule laborioase si lente care se executa mai rapid folosind functii precompilate.
Totusi, fisierele MEX nu sunt adecvate oricarui tip de aplicatie. MATLAB este un sistem de foarte mare productivitate ce elimina foarte mult din efortul de programare.
În general programarea se recomanda a se face sub MATLAB. Nu se foloseste facilitatea MEX decât atunci când este absolut necesar.
Partea a doua a acestui proces se face automat sub controlul utilitarelor mbuild sau mex care se pot configura în functie de compilatorul C/C++ folosit si de alte elemente care se seteaza interactiv.
Este foarte important de subliniat o particularitate a acestui compilator. Asa cum în C/C++ avem de-aface numai cu functii (dintre care una principala, main), asa si compilatorul MATLAB nu accepta fisiere script de intrare ci numai functii. Chiar daca programul MATLAB (continut în fisierul script cu extensia .m) nu este în fapt o functie, el poate fi usor transformat într-o functie eventual fara parametri de intrare/iesire.
Spre exemplu, fisierul script nume.m se poate transforma într-o functie prin introducerea primei linii din fisier sub forma
function []=nume();
Dupa cum se observa din figura de mai sus, compilatorul MATLAB mcc se compune din doua utilitare principale: un translator din limbajul MATLAB în limbajul C si un utilitar numit mbuild care transforma automat fisierul sursa C într-un executabil în functie de o configurare prealabila.
Configurarea utilitarelor mbuild si mex
Compilatorul MATLAB este compus din trei componente principale:
un translator din limbajul MATLAB în limbajul C
un utilitar mbuild pentru construirea de aplicatii executabile sub MS-DOS (.exe)
un utilitar mex pentru construirea de subrutine cu legare dinamica apelabile din MATLAB sau din aplicatii Windows (.dll)
Translatorul realizeaza traducerea din limbajul MATLAB în limbajul C independent de contextul pentru care se genereaza aplicatia. Aceasta traducere se foloseste ulterior sub gestiunea unui fisier wrapper care gestioneaza prelucrarea sa ulterioara.
Cele doua utilitare sunt apelate de catre mcc în functie de tipul de aplicatie care se doreste. Mbuild se apeleaza pentru a genera fisiere cu extensia .exe iar mex se apeleaza pentru a obtine fisiere cu extensia .dll sub sistemul de operare Windows.
Întregul proces de generare de aplicatii se desfasoara automat sub controlul mcc. Pentru ca acest proces automat sa functioneze bine, este necesara configurarea prealabila a celor doua utilitare.
Este evident faptul ca utilitarul mbuild trebuie sa preia fisierul sursa C rezultat în urma procesului de translatare si sa-l transforme într-un executabil cu ajutorul unui compilator ANSI C/C++ care trebuie sa se afle pe calculatorul pe care se desfasoara procesul de compilare. Pentru ca rezultatul compilarii sa fie cel dorit, înainte de compilare este necesar sa configuram (setam) acest utilitar. Acest lucru se desfasoara foarte simplu cu ajutorul comenzii
>> mbuild -setup
Utilitarul va culege interactiv datele necesare unei bune functionari pe sistemul de calcul pe care se lanseaza:
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc C version 2.4 in C:\MATLABR12\sys\lcc
[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
Compiler: 2
Would you like to link with the C/C++ Graphics Library?([y]/n): n
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\Program Files\Microsoft Visual Studio
Are these correct?([y]/n): y
The default options file:
"C:\Documents and Settings\Cosmin\Application Data\MathWorks\ MATLAB\R12\compopts.bat"
is being updated from C:\MATLABR12\BIN\WIN32\ mbuildopts\ msvc60compp.bat...
Installing the MATLAB Visual Studio add-in ...
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\ template\MATLABWizard.awx
from C:\MATLABR12\BIN\WIN32\MATLABWizard.awx
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\ template\MATLABWizard.hlp
from C:\MATLABR12\BIN\WIN32\MATLABWizard.hlp
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\ addins\MATLABAddin.dll
from C:\MATLABR12\BIN\WIN32\MATLABAddin.dll
Merged C:\MATLABR12\BIN\WIN32\usertype.dat
with C:\Program Files\Microsoft Visual Studio\common\msdev98\ bin\usertype.dat
Note: If you want to use the MATLAB Visual Studio add-in with the MATLAB C/C++
Compiler, you must start MATLAB and run the following commands:
cd(prefdir);
mccsavepath;
(You only have to do this configuration step once.)
Lcc (Local C Compiler) este un compilator C înglobat în mediul MATLAB. El se poate folosi fara probleme pentru compilarea programelor MATLAB în cazul în care nu dispunem de un compilator C de la Borland, Watcom sau Microsoft.
Pentru generarea de aplicatii de timp real sub RTW este nevoie însa de un compilator C al uneia din firmele de mai sus.
În mod asemanator se realizeaza configurarea (setarea) utilitarului mex.
Exemplul 1: Obtinerea unui executabil fara a fi nevoie de MATLAB C/C++ Graphic Library. Se foloseste numai MATLAB C/C++ Math Library
Cel mai bine putem prezenta acest proces prin intermediul unui exemplu.
Scriem în MATLAB un program care sa afiseze transpusa unei matrici, apoi sa calculeze si sa afiseze valorile proprii si valorile singulare ale matricei. Vom edita un fisier script, numit compile_test.m care va avea urmatoarea forma:
function []=compile_test()
a=[1,2,3;4,5,6;7,8,9]
pause(5);
disp('Transpusa matricei este');
a'
pause(5);
disp('Valorile proprii ale matricei sunt:');
eig(a)
pause(5);
disp('Valorile singulare ale matricei sunt:');
svd(a)
Se observa cum de fapt am editat o functie, numita compile_test care nu are parametri de intrare sau de iesire, deci se comporta ca un fisier script clasic.
Dupa testarea în MATLAB a functionarii programului, dorim sa apelam compilatorul MATLAB pentru obtinerea unui fisier executabil sub DOS cu numele compile_test.exe.
Pentru aceasta, vom invoca în cea mai simpla forma compilatorul MATLAB mcc.
>> mcc -m compile_test.m
În caz ca procesul de compilare se desfasoara fara erori, va apare command prompt-ul MATLAB, >>.
Dupa modul în care am configurat mbuild, acesta nu va face link-editarea cu biblioteca grafica a MATLAB, deoarece nu avem nevoie în programul exemplu de nici o facilitate grafica.
Mediul MATLAB ofera un compilator C local (lcc, Local C Compiler), dar tot atât de bine programul de configurare (setup) poate localiza o multime de compilatoare ce pot fi instalate pe sistemul de calcul gazda: Microsoft Visual C (msvc), Borland C/C++, Watcom C, etc.
În cazul nostru, programul a localizat compilatorul Microsoft Visual C iar noi am fost de acord cu folosirea acestuia pentru a construi executabile.
Compilarea se efectueaza cu succes, obtinându-se urmatoarele fisiere:
compile_test.m
compile_test.c
compile_test.h
compile_test_main.c
compile_test.exe
Primul fisier compile_test.m este fisierul scris în limbajul MATLAB.
Fisierul compile_test.c este fisierul obtinut în urma procesului de translatare (traducere). Fisierul compile_test.h este fisierul header la care face apel compile_test.c în urma unei directive #include.
Fisierul compile_test_main.c este asa numitul fisier wrapper generat de translator pentru a se putea face o compilare corecta. El apeleaza o functie de biblioteca pentru a face initializarea, apeleaza functia principala si apoi efectueaza terminarea bibliotecii.
Fisierul compile_test.exe este fisierul executabil obtinut în urma compilarii si care se poate lansa în executie. El va functiona corect, lansat din mediul DOS, deci va fi un executabil independent de mediul MATLAB.
Exemplul 2: Obtinerea unui executabil cu ajutorul MATLAB C/C++ Graphic Library
În exemplul urmator, vom încerca sa folosim capabilitatile grafice ale MATLAB.
Dorim sa obtinem un executabil care sa afiseze sin(t) si cos(t) pentru un interval de timp de 10 secunde. Pentru aceasta editam fisierul MATLAB graphic_test.m:
function []=graphic_test();
t=0:.1:10;
subplot(211);plot(t,sin(t));grid;
subplot(212);plot(t,cos(t));grid;
Apelam din nou compilatorul cu optiunea -B sgl pentru a obtine aplicatii independente bazate pe biblioteca grafica MATLAB:
>> mcc -m -B sgl graphic_test
subplot.obj : error LNK2001: unresolved external symbol _mlfDatachildren
graphic_test_mainhg.obj : error LNK2001: unresolved external symbol _libmwsglmTerminate
graphic_test_mainhg.obj : error LNK2001: unresolved external symbol _libmwsglmInitialize
graphic_test_mainhg.obj : error LNK2001: unresolved external symbol _mclMainhg
graphic_test.exe : fatal error LNK1120: 4 unresolved externals
MBUILD.BAT: Error: Link of 'graphic_test.exe' failed.
??? Error using ==> mbuild
Unable to complete successfully
??? Error: An error occurred while shelling out to mbuild (error code = 1).
Unable to build executable (specify the -v option for more information).
Error in ==> C:\matlabR12\toolbox\compiler\mcc.dll
Se observa ca sunt semnalate o serie întreaga de erori de compilare.
Acestea apar datorita faptului ca am configurat mbuild fara a marca optiunea de legare a bibliotecii grafice C/C++ a MATLAB. Reconfigurând din nou cu comanda mbuild -setup, vom obtine un compilator MATLAB capabil sa compileze corect fisierul MATLAB care face apel la functii grafice.
Mai mult, în acest caz vom obtine urmatoarele fisiere:
graphic_test.m
graphic_test.c
graphic_test.h
graphic_test_main.c
graphic_test_mainhg.c
Se observa aparitia a înca unui fisier wrapper, anume graphic_test_mainhg.c, care va diferi de cel implicit graphic_test_main.c prin faptul ca va include o serie de fisiere header diferite. Acest fisier wrapper, care va contine în nume extensia mainhg, va apare atunci când ne vom lega la biblioteca grafica a MATLAB.
Limitari ale folosirii compilatorului
4.3.1. Folosirea obiectelor de tip sistem
Din cele prezentate mai sus se observa ca putem dezvolta aplicatii independente folosind exclusiv bibliotecile matematice si grafice ale MATLAB.
În cazul specialistului automatist este de mare importanta colectia de biblioteci dedicate cunoscuta sub denumirea de Tools. Aceste biblioteci sunt specializate pe lucrul cu obiecte.
Compilatorul MATLAB nu este capabil sa prelucreze astfel de obiecte. Spre exemplu, un sistem este un obiect MATLAB reprezentat sub forma de functie de transfer sau ca cvadruplu de stare. Aceste obiecte nu pot fi manipulate de compilator, asa cum rezulta din exemplul urmator.
Exemplul 3: Folosirea functiilor orientate pe obiecte
Concepem un program MATLAB care sa reprezinte raspunsul la intrare treapta al unui sistem de ordinul 2 pe diferite intervale de timp, cu diferiti pasi de discretizare si pentru valori diferite ale pulsatiei si factorului de amortizare:
function []=test();
iar='y';
while iar=='y'
T=input('timp simulare [sec]= ');
pas=input('pas de simulare= ');
omega=input('omega= ');
csi=input('csi= ');
t=0:pas:T;
y=step(omega^2,[1,2*csi*omega,omega^2],t);
plot(t,y);
pause(5);
iar=input('Continuam? [y/n] ','s');
end;
În urma aplicarii comenzii de compilare, aceasta este efectuata dar se vor emite câteva avertizari:
>> mcc -m -B sgl test.m
Warning: File: step Line: 112 Column: 10
The MATLAB Compiler does not currently support MATLAB object-oriented programming. References to the method "ss" will produce a run-time error.
Warning: File: step Line: 95 Column: 10
The MATLAB Compiler does not currently support MATLAB object-oriented programming. References to the method "tf" will produce a run-time error.
În momentul lansarii în executie sub DOS a executivului rezultat vom abtine
deci, asa cum am fost avertizati la compilare, obtinem un asa-numit run-time error.
Exemplul 4: Înlocuirea functiilor orientate pe obiecte
Programul poate fi modificat în asa fel încât sa nu apelam la obiectele definite în control toolbox, deci putem sa folosim expresia raspunsului la intrare treapta a sistemului de ordinul 2 cu poli complecsi conjugati.
function []=test2();
iar='y';
while iar=='y'
T=input('timp simulare [sec]= ');
pas=input('pas de simulare= ');
omega=input('omega= ');
csi=input('csi= ');
t=0:pas:T;
fi=atan(sqrt(1-csi^2)/csi);
y=1-exp(-csi*omega.*t)/(sqrt(1-csi^2)).*sin(omega*sqrt(1-csi^2).*t+fi);
plot(t,y);
pause(5);
iar=input('Continuam? [y/n] ','s');
end;
În urma procesului de compilare, nu se genereaza nici un mesaj de avertizare sau eroare, iar în urma executiei sub DOS a executabilului, se obtine:
Fisiere MEX (MATLAB External Files)
Compilatorul MATLAB (MATLAB Compiler (mcc)) poate translata fisiere MATLAB, cu extensia .m în fisiere sursa C. Fisierul C rezultat poate fi folosit pentru producerea oricaror tipuri de executabile, incluzând fisiere MEX (.dll sub Windows), .exe sau biblioteci, prin generarea unui fisier wrapper corespunzator. Un fisier wrapper contine interfata necesara între codul C generat de Compilator si un tip de executabil suportat de sistemul de operare sau de mediul MATLAB/Simulink.
Spre exemplu, un MEX-wrapper contine rutina de interfatare care seteaza parametrii de intrare si de iesire ai functiilor C generate de compilator. Fisierul wrapper furnizeaza interfata necesara catre tipul-tinta dorit.
Compilatorul MATLAB, când este invocat cu macrooptiunea -x, produce un fisier MEX dintr-un fisier M. Compilatorul produce urmatoarele operatii:
Translateaza codul M în cod C
Genereaza un MEX-wrapper
Invoca utilitarul mex care construieste fisierul final MEX din fisierul C si cel MEX-wrapper prin legare cu versiunea MEX a bibliotecii matematice (libmatlbmx).
Figura de mai jos ilustreaza procesul de constructie a unui fisier MEX.
Interpretorul MATLAB încarca dinamic MEX-fisierele de care are nevoie. Anumite fisiere MEX ruleaza semnificativ mai repede decât M-fisierele echivalente.
Codul C sau C++ compilat astfel ruleaza mai repede decât echivalentul M-file deoarece:
Codul compilat ruleaza mai rapid decât cel interpretat.
C sau C++ pot evita excesul de alocare de memorie pe care îl face interpretorul MATLAB.
Exista cazuri în care compilarea functiilor M-file nu conduce la un surplus de viteza de simulare:
daca functiile sunt puternic vectorizate
daca contin multe apeluri la functii built-in, matematice sau grafice.
Oricum, compilarea sporeste mult viteza functiilor care contin bucle.
În afara avantajului sporirii vitezei de executie a simularilor, fisierele MEX permit apelarea unor functii sau programe scrise în C sau Fortran ca si cum ar fi functii intrinseci (built-in).
Programele C sau Fortran apelabile din MATLAB se numesc fisiere MEX (MATLAB External Files). Aceste fisiere MEX sunt subrutine legate dinamic (.dll) pe care interpretorul MATLAB le poate încarca si executa automat.
Fisierele MEX au diferite aplicatii:
Programe preexistente scrise în C sau Fortran pot fi apelate din MATLAB, fara a fi nevoie sa scriem M-fisierele corespondente în MATLAB.
Calculele lente (în general bucle FOR) care nu ruleaza rapid în MATLAB pot fi scrise în C sau Fortran pentru mai multa eficienta.
MEX-fisierele nu sunt însa utile pentru toate aplicatiile. MATLAB este un sistem de mare productivitate conceput tocmai pentru a evita consumul mare de timp al aplicatiilor compilate scrise în limbaj C sau Fortran. În general, cea mai mare parte din programare se executa în MATLAB. Facilitatile MEX se folosesc numai în aplicatiile care o cer.
Exemplul 5: Construirea unui MEX-file pentru un program Simulink
Consideram un program de simulare a raspunsului unui sistem fizic la un semnal de intrare. Sistemul fizic (un brat robotic dublu în plan vertical, actionat de doua motoare de curent continuu) are un model matematic profund neliniar, descris de o functie MATLAB numita brd_stare.m:
function xprim=brd_stare(x);
global m1 m2 l1 l2 jm1 jm2 n1 n2 un pn kv1 kv2 tv1 tv2 in r1 r2 L1 L2 nn ke1 ke2 mn g randam
j11=(m1+m2)*l1^2+m2*l2 ^2+2*m2*l1*l2*cos (x(3))+jm1*n1^2;
j12=m2*l2*(l2+l1*cos(x(3)));j21=j12;
j22=m2*l2^2+jm2*n2^2;
alfa1=-2*m2*l1*l2*x(2) *x(4)*sin(x(3))-m2*l1*l2*x(4) *x(4)*sin(x(3))+(m1+m2)*g*l1*sin (x(1))+m2*g*l2*sin(x(1)+x(3));
alfa2=m2*l1*l2*x(2)*x(2)*sin (x(3))+m2*g*l2*sin(x(1)+x(3));
xprim=[x(2);(j22*(n1*ke1* x(5)-alfa1)-j12* (n2*ke2*x(6)-alfa2))/ (j11*j22-j12*j21);
x(4);(-j21*(n1*ke1*x(5) -alfa1)+j11*(n2*ke2*x(6)- alfa2))/(j11*j22-j12*j21);
(x(7)-r1*x(5)-n1*ke1*x(2)) /L1;(x(8)-r2*x(6)-n2*ke2*x(4))/L2;
(kv1*x(9)-x(7))/tv1;(kv2*x(10)-x(8))/tv2];
Modelul Simulink (brd_step) care implementeaza ecuatiile de functionare este urmatorul:
Trebuie sa remarcam faptul ca o functie MATLAB încetineste viteza de simulare deoarece, la fiecare apel al functiei, se apeleaza si analizorul gramatical (parser). Apelam compilatorul MATLAB pentru a obtine un MEX-fisier din aceasta functie MATLAB.
>> mcc -x brd_stare.m
În acest fel obtinem un fisier .dll (DLL-Dynamic Linked Library), cu numele brd_stare.dll
Daca în acelasi director se afla brd_stare.m dar si brd_stare.dll, se încarca si executa fisierul MEX, care sub Windows are extensia .dll.
Simulând raspunsul la intrare treapta pentru 100 secunde, simularea dureaza 45 de secunde cu fisierul functie brd_stare.m si 33 de secunde cu fisierul MEX brd_stare.dll.
Exemplul 6: Fisier pentru compilare cu RTW
Daca se încearca compilarea fisierului utilizând RTW, vom obtine un semnal de eroare deoarece RTW nu accepta înca blocuri de tip MATLABFcn.
Pentru a surmonta acest neajuns, din analiza modelului constatam ca acesta implementeaza raspunsul la intrare treapta al unui sistem neliniar. Avem doua marimi de intrare, considerate ca marimi de stare cu indicele 9 respectiv 10.
Functia brd_stare.m are continutul:
function xprim=brd_stare(x);
global m1 m2 l1 l2 jm1 jm2 n1 n2 un pn kv1 kv2 tv1 tv2 in r1 r2 L1 L2 nn ke1 ke2 mn g randam
j11=(m1+m2)*l1^2+m2*l2 ^2+2*m2*l1*l2*cos (x(3))+jm1*n1^2;
j12=m2*l2*(l2+l1*cos(x(3)));j21=j12;
j22=m2*l2^2+jm2*n2^2;
alfa1=-2*m2*l1*l2*x(2) *x(4)*sin(x(3))-m2*l1*l2*x(4) *x(4)*sin(x(3))+(m1+m2)*g*l1*sin (x(1))+m2*g*l2*sin(x(1)+x(3));
alfa2=m2*l1*l2*x(2)*x(2)*sin (x(3))+m2*g*l2*sin(x(1)+x(3));
xprim=[x(2);(j22*(n1*ke1* x(5)-alfa1)-j12* (n2*ke2*x(6)-alfa2))/ (j11*j22-j12*j21);
x(4);(-j21*(n1*ke1*x(5) -alfa1)+j11*(n2*ke2*x(6)- alfa2))/(j11*j22-j12*j21);
(x(7)-r1*x(5)-n1*ke1*x(2)) /L1;(x(8)-r2*x(6)-n2*ke2*x(4))/L2;
(kv1*x(9)-x(7))/tv1;(kv2*x(10)-x(8))/tv2];
Daca se calculeaza raspunsul la intrare treapta, intrarile se seteaza corespunzator.
Cu alte cuvinte, x(9)=1, x(10)=1; Se rescrie functia de mai sus, sub numele de brd_stare1.m
function xprim=brd_stare1(x);
m1=10;m2=2.5;
l1=1;l2=.5;
jm1=3.3e-4;jm2=jm1;
n1=200;n2=n1;
un=64; %tensiunea nominala
pn=380; %puterea nominala
kv1=1;kv2=kv1; %factor amplificare tensiune variator
tv1=.012;tv2=tv1; %constanta de timp variator
in=9.2; %curentul rotoric nominal
r1=1.4;r2=r1; %rezistenta rotorica
L1=.0023;L2=L1; %inductanta rotorica
nn=2750; %turatia nominala
ke1=.37;ke2=ke1; %constanta electrica mcc
mn=2.89; %momentul nominal
g=9.8;
randam=.9; %randamentul
xprim=[x(2);
((m2*l2^2+jm2*n2^2)* (n1*ke1*x(5)-(-2*m2*l1*l2*x(2)* x(4)*sin(x(3))-m2*l1 *l2*x(4)*x(4)*sin(x(3))+(m1+m2)*g*l1* sin(x(1))+m2*g*l2*sin(x(1) +x(3))))-(m2*l2*(l2+l1*cos(x(3)))) *(n2*ke2*x(6)-(m2*l1*l2*x(2) *x(2)*sin(x(3))+m2*g* l2*sin(x(1)+x(3)))))/(((m1+m2) *l1^2+m2*l2^2+2*m2*l1*l2 *cos(x(3))+jm1*n1^2)*(m2*l2^2+jm2*n2^2) -(m2*l2*(l2+l1*cos(x(3)))^2));
x(4);
(-(m2*l2*(l2+l1* cos(x(3))))* (n1*ke1*x(5)-(-2*m2*l1*l2 *x(2)*x(4)*sin(x(3))-m2 *l1*l2*x(4)*x(4) *sin(x(3))+(m1+m2)*g*l1 *sin(x(1))+m2*g*l2 *sin(x(1)+x(3))))+((m1+m2) *l1^2+m2*l2^2+2*m2*l1*l2 *cos(x(3))+jm1*n1^2) *(n2*ke2*x(6)-(m2*l1*l2*x(2) *x(2)*sin(x(3))+m2* g*l2*sin(x(1)+x(3)))))/ (((m1+m2)*l1^2+m2*l2^2+ 2*m2*l1*l2*cos(x(3)) +jm1*n1^2)*(m2*l2^2+jm2*n2^2) -(m2*l2*(l2+l1*cos(x(3)))^2));
(x(7)-r1*x(5)-n1*ke1*x(2))/L1;
(x(8)-r2*x(6)-n2*ke2*x(4))/L2;
(kv1-x(7))/tv1;
(kv2-x(8))/tv2];
Se observa ca variabilele nu le-am declarat globale iar parametrii dependenti de stare (j11, j12, j22, alfa1, alfa2) nu se mai calculeaza înainte (pentru scurtarea scrierii ecuatiilor) ci se introduc direct în ecuatiile de integrat. Ecuatiile diferentiale depind de stare si de parametrii constanti definiti la început. Functia este pretabila formatului ode, adica este de forma . Cu alte cuvinte, ecuatiile se scriu în clar.
Se scrie un fisier script care sa integreze, din conditii initiale si pe un interval de 100 de secunde, ecuatiile diferentiale neliniare descrise în functia brd_stare1.m. Acest fisier îl numim brd_step1.m si are forma:
function [] = brd_step1();
[tout,xout]=ode45(@brd_stare1,[0,100],ones(8,1));
yout=xout*ones(8,1);
plot(tout,yout);
Integrarea ecuatiilor în MATLAB, folosind functia brd_step1.m dureaza 42 de secunde, iar varianta brd_step1.exe, realizata cu compilarea cu mcc -m -B sgl brd_step1.m dureaza 30 de secunde, o reducere substantiala de timp.
De ce se compileaza M-fisierele ?
Sunt trei motive principale pentru compilarea fisierelor script:
Crearea de aplicatii de sine-statatoare sau a bibliotecilor C partajate (DLL sub Windows) sau a bibliotecilor statice C++
Pentru ascunderea (protejarea) algoritmilor folositi
Pentru cresterea vitezei de executie a programelor.
Aplicatii de sine-statatoare si biblioteci
Cu ajutorul executabilelor obtinute cu ajutorul compilatorului MATLAB se poate folosi avantajul functiilor matematice MATLAB fara a fi nevoie sa fim proprietarii unui pachet MATLAB. Aplicatiile de sine-statatoare reprezinta un mod convenabil de a îngloba puterea MATLAB si a o distribui prin aplicatii personalizate diversilor utilizatori.
Se pot dezvolta algoritmi în MATLAB pentru realizarea de calcule speciale si apoi se poate folosi compilatorul MATLAB pentru crearea de biblioteci partajate (biblioteci cu legare dinamica, DLL, sub Windows) sau biblioteci statice C++. Se pot integra astfel diversi algoritmi în aplicatii C/C++. Dupa ce se compileaza aplicatia se poate include algoritmul MATLAB pentru calcule specializate în programul utilizatorului.
Ascunderea (protejarea) algoritmilor folositi
Fisierele MATLAB (M-files) sunt text ASCII pe care oricine le poate vedea sau modifica. Fisierele MEX sunt fisiere binare. Distribuirea fisierelor MEX sau a aplicatiilor de sine statatoare (cu extensia .exe) în locul fisierelor M ascund sau protejeaza proprietatea algoritmilor si previn modificarea fisierelor M.
Executia mai rapida
În mod uzual codul compilat cu compilatorul C sau C++ ruleaza mai rapid deoarece:
Codul compilat ruleaza mai rapid decât cel interpretat.
C sau C++ pot evita excesul de alocare a memoriei pe care îl face interpretorul MATLAB.
Exista însa situatii când performantele programului compilat nu cresc. Cazurile când nu vom obtine o crestere simtitoare a vitezei fata de executia M-fiierelor sunt:
Programul este puternic vectorizat
Se lucreaza intens cu functii MATLAB built-in de indexare, matematice sau grafice.
Cazurile în care performantele se îmbunatatesc simtitor sunt acelea în care M-functiile contin bucle for, while sau if.
4.5 Limitari si restrictii
Codul MATLAB
Versiunea de fata a compilatorului MATLAB suporta aproape toate functionalitatile MATLAB. Totusi, exista câteva limitari si restrictii care vor fi enumerate mai jos. Aceste restrictii se refera la aceasta versiune, dar versiunile urmatoare vor depasi aceste obstacole.
Compilatorul MATLAB nu poate compila:
Fisiere script (M-files). Din aceasta cauza orice fisier script care se compileaza se transforma într-o functie fara parametri de intrare sau de iesire (este prevazuta în antet cu cuvântul cheie function).
M-files care folosesc obiecte. Marea majoritate a functiilor care manipuleaza sisteme sunt orientate pe obiect si deci nu pot fi compilate cu succes în aceasta versiune.
M-files care folosesc functia input sau eval pentru a manipula variabile din spatiul de lucru (workspace variables).
Observatie: input sau eval care nu folosesc workspace variables se vor compila si executa corect.
De asemenea, compilatorul MATLAB nu poate compila functii MATLAB built-in (functii precompilate, care nu au drept corespondent un fisier .M).
Remarcam însa ca majoritatea acestor functii sunt disponibile pentru compilare deoarece se gasesc în MATLAB Math Built-in Library (libmatlb).
În aditie, compilatorul nu va onora declaratiile global conditionale sau declaratiile persistente.
Aplicatii de sine-statatoare (Stand-Alone Applications)
Restrictiile si limitarile de mai sus se aplica si în cazul aplicatiilor de sine-statatoare. Functiile din tabelul de mai jos sunt suportate în modul MEX, dar nu sunt suportate pentru construirea executabilelor.
add_block |
add_line |
applescript |
assignin |
callstats |
close_system |
cputime |
dbclear |
dbcont |
dbdown |
dbquit |
dbstack |
dbstatus |
dbstep |
dbstop |
dbtype |
dbup |
delete_block |
delete_line |
diary |
echo |
edt |
errorstat |
errortrap |
evalin |
fields |
fschange |
functionscalled |
get_param |
hcreate |
help |
home |
hregister |
inferiorto |
inmem |
isglobal |
isjava |
isruntime |
java |
javaArray |
javaMethod |
javaObject |
keyboard |
linmod |
lookfor |
macprint |
mactools |
methods |
mislocked |
mlock |
more |
munlock |
new_system |
open_system |
pack |
pfile |
rehash |
runtime |
set_param |
sim |
simget |
simset |
sldebug |
str2func |
superiorto |
system_dependent |
trmginput |
type |
vms |
what |
which |
who |
whos |
Tabel 1-2: Tabel cu functiile nesuportate în modul de sine-statator
(Unsupported Functions in Stand-Alone Mode)
Observatie: Nu se pot folosi functii din Handle Graphics decât daca avem instalata Graphics Library. În plus aplicatiile de sine-statatoare nu pot accesa functii Simulink. Desi compilatorul MATLAB poate compila M-files care apeleaza aceste functii, biblioteca MATLAB C/C++ Math nu le suporta. De aceea, daca nu se scriu propriile versiuni ale rutinelor nesuportate în cod C sau ca MEX-fisiere, se va obtine o eroare run-time.
4.6 MATLAB Compiler pentru Microsoft Windows pe PC-uri
Se examineaza cerintele de sistem, procedurile de instalare si de configurare pentru MATLAB Compiler pe PC rulând sub Windows 95/98/2000 sau Windows NT.
Cerintele sistemului
Nu se poate instala MATLAB Compiler decât daca avem instalat MATLAB 6/Release 12 pe sistemul de calcul (PC). MATLAB Compiler nu impune cerinte suplimentare sistemului de operare sau memoriei fata de cele necesare rularii MATLAB.
Tabela de mai jos arata cerintele pentru crearea de aplicatii pentru PC folosind MATLAB.
Se creaza |
Este necesar |
MEX-files Fisiere MEX |
ANSI C compiler MATLAB Compiler |
Stand-alone C applications Aplicatii de sine-statatoare (.exe) |
ANSI C compiler MATLAB Compiler MATLAB C/C++ Math Library |
Stand-alone C++ applications Aplicatii de sine-statatoare (.exe) |
C++ compiler MATLAB Compiler MATLAB C/C++ Math Library |
Tabela 2-3: Cerintele software pentru a crea aplicatii pe PC-uri
Observatie: MATLAB include un compilator ANSI C (Lcc, Local C Compiler) care se poate utiliza cu MATLAB Compiler.
MATLAB C/C++ Math Library este un produs care se vinde separat.
MATLAB C/C++ Graphics Library este un produs care se vinde separat. Versiunea 3.0 a compilatorului MATLAB integreaza Compilatorul MATLAB si MATLAB C/C++ Math Library împreuna cu MATLAB C/C++ Graphics Library. Daca aplicatia foloseste Handle Graphics, este nevoie de MATLAB C/C++ Graphics Library pentru a dezvolta aplicatii de sine statatoare. Desi MATLAB Compiler suporta crearea de aplicatii C++ de sine-statatoare, nu suporta crearea de C++ MEX-files.
Compilatoarele ANSI C si C++ suportate pe PC
Pentru a crea C MEX-files, aplicatii C/C++ de sine-statatoare sau biblioteci cu legare dinamica (dynamically linked libraries - DLL) cu MATLAB Compiler, trebuie instalat si configurat un compilator C/C++ compatibil. Se pot folosi urmatoarele compilatoare C/C++ pe 32 de biti pentru a crea aplicatii Windows pe 32 de biti de tipul dynamically linked libraries (DLL) sau Windows NT:
Lcc C version 2.4 (inclus în MATLAB)
Watcom C/C++ versiunea 10.6 & 11.0
Borland C++ versiunile 5.0, 5.2, 5.3, 5.4, & 5.5
Microsoft Visual C++ (MSVC) versiunile 5.0 & 6.0
Fisiere de optiuni pentru compilatoare
MathWorks furnizeaza fisiere de optiuni pentru toate compilatoarele C/C++suportate. Aceste fiiere contin semafoarele si setarile necesare compilatorului.
Fisierele de optiuni sunt construite atât pentru utilitarul mbuild cât si pentru utilitarul mex.
Utilitarele mex si mbuild stocheaza fisierele de optiuni mexopts.bat si compopts.bat care sunt create în urma procesului de configurare (setare, -setup) într-un subdirector numit Application Data\MathWorks\MATLAB.
Cu comanda cd(prefdir) ne putem pozitiona în directorul respectiv pentru a vedea toate fisierele de configurare pe care le stocheaza MATLAB.
>> cd(prefdir)
>> dir
compopts.bat launchpad_cache.txt mexopts.bat
.. cwdhistory.m matlab.prf toolbox_cache.xml
MATLAB.ini history.m matlabprefs.mat
În \bin\win32 din radacina MATLAB se afla doua subdirectoare, mbuildsopts si mexopts în care se afla fisiere de optiuni pentru cele doua utilitare si pentru toate compilatoarele suportate de MATLAB. Pentru fiecare compilator exista doua fisiere cu extensia .bat si .stp. Numele fisierului se compune din numele compilatorului urmat de compp în cazul mbuild si de opt în cazul mex.
Acest tabel arata fisierele de optiuni preconfigurate incluse în MATLAB pentru utilitarul mex.
Compilatorul |
Fisierul de optiuni |
Lcc C, Version 2.4 (inclus în MATLAB) |
lccopts.bat |
Microsoft C/C++, Version 5.0 Microsoft C/C++, Version 6.0 |
msvc50opts.bat msvc60opts.bat |
Watcom C/C++, Version 10.6 Watcom C/C++, Version 11.0 |
watcopts.bat (numai mex, nu si pt. mbuild) wat11copts.bat (numai mex, nu si pt. mbuild) |
Borland C++, Version 5.0 Borland C++, Version 5.2 Borland C++ Builder 3 Borland C++ Builder 4 Borland C++ Builder 5 |
bccopts.bat bccopts.bat bcc53opts.bat bcc54opts.bat bcc55opts.bat |
4.7 Construirea de aplicatii executabile pornind de la programe MATLAB sub Windows
Sub ambele sisteme de operare (Windows sau UNIX) pasii pentru construirea de executabile (programe de sine-statatoare) sunt aceeasi:
Verificati daca mcc poate genera fisiere C/C++ din cod sursa MATLAB. Acest lucru se poate face folosind optiunea -mc a Compilatorului MATLAB. Astfel, se preia un fisier sursa MATLAB (spre exemplu fisierul hello.m aflat în exemplele mbuild pentru msvc6.0) si se genereaza doar o translatare în C a acestui fisier, fara a activa si utilitarul mbuild incorporat în mcc. Astfel:
>> mcc -mc -v hello.m
Compiler version: 2.1
Parsing file "D:\matlabR12\extern\examples\compiler\hello.m"
(Referenced from: "Compiler Command Line").
Generating file "hello.h".
Generating file "hello.c".
Generating file "hello_main.c".
Probeaza faptul ca s-au generat fisierele C corespunzatoare.
Verificam daca utilitarul mbuild care este inclus în mcc functioneaza corect. Pentru aceasta vom compila efectiv, folosind compilatorul Microsoft C/C++, Version 6.0 , cele doua fisiere .c obtinute la prima faza:
>> mbuild -v hello.c hello_main.c
This is mbuild (c) 1996 - 2000 The MathWorks, Inc.
-> Default options filename found in C:\Documents and Settings\Cosmin\Application Data\MathWorks\MATLAB\R12
-> Options file = C:\Documents and Settings\Cosmin\Application Data\MathWorks\MATLAB\R12\compopts.bat
-> COMPILER = cl
-> Compiler flags:
COMPFLAGS = -c -Zp8 -G5 -W3 -nologo
OPTIMFLAGS = -O2 -DNDEBUG
DEBUGFLAGS = -Zi -Fd"hello.pdb"
Name directive = "/out:hello.exe"
File link directive =
Lib. link directive =
Rsp file indicator = @
.. Etc.
Se observa ca nu se obtin erori, deci cele doua componente functioneaza corect. De fapt, în prima etapa nu sunt probleme, deoarece Compilatorul MATLAB (translatorul MATLAB->C) este integrat în mediul MATLAB, deci traduce orice comanda MATLAB în secventa C corespunzatoare. Probleme pot apare în faza de compilare efectiva sau de link-editare, când se leaga diverse module din medii diferite: biblioteci din MATLAB si biblioteci C.
De fapt ne putem da seama daca sunt probleme testând de la început programul MATLAB cu comanda
>> mcc -m hello.m
sau
>> mcc -mv hello.m
Daca nu se semnaleaza erori, înseamna ca mediile de programare MATLAB si C sunt bine integrate. Configurarea utilitarului mbuild a fost prezentata în 1.2.1.
Utilizarea mcc
>> mcc
invoca MATLAB Compiler.
Sintaxa generala este:
mcc [-options] mfile1 [mfile2 ... mfileN] [C/C++file1 ... C/C++fileN]
Descriere
mcc este comanda MATLAB care invoca MATLAB Compiler. Aceasta comanda se poate da fie de la prompterul MATLAB fie dintr-o linie de comanda DOS sau UNIX (stand-alone mode).
Sintaxa liniei de comanda
Se pot specifica unul sau mai multe semafoare de optiuni pentru MATLAB. Cele mai multe semafoare de optiuni au o singura litera ca nume. Ele se pot enumera separat în linia de comanda, de exemplu:
mcc -m -g myfun
Se pot grupa aceste optiuni care nu au argumente folosind o singura linie de optiuni, spre exemplu:
mcc -mg myfun
Optiunile care cer argumente nu se pot grupa decât daca se grupeaza optiunea cu argumente ultima în lista. Spre exemplu, urmatoarele formate sunt valide:
mcc -m -A full myfun % Optiuni listate separat
mcc -mA full myfun % Optiuni combinate, optiunea A ultima
Acest format nu este valid:
mcc -Am full myfun % Optiuni combinate, optiunea A nu este ultima
În cazul în care avem mai multe optiuni cu cu argumente, una dintre aceste optiuni se poate combina într-o lista în care este ultima. Se pot plasa mai multe liste combinate într-o linie de comanda.
Daca în linia de comanda a mcc se include nume de fisiere C sau C++, fisierele sunt pasate direct utilitarului mex sau mbuild împreuna cu codurile sursa C sau C++ generate.
Folosirea Macrourilor pentru a simplifica procesul de Compilare
MATLAB Compiler, prin setul sau exhaustiv de optiuni, da posibilitatea utilizatorului sa utilizeze foarte flexibil toate uneltele disponibile pentru construirea unui target adecvat. Deoarece numarul de argumente si de optiuni este foarte mare, avem nevoie de cele mai multe ori de o abordare simplificata a compilarii prin folosirea unei optiuni simple dar cuprinzatoare, numita macro, care ne permite finalizarea usoara a procedurilor de baza ale procesului de compilare.
Daca se doreste obtinerea de avantaje din flexibilitatea utilitarelor utilizate, atunci putem utiliza explicit toate optiunile dorite cu care este prevazut Compilatorul.
Tabelul de mai jos arata relatiile dintre abordarea cu macrouri a compilarii si echivalentul alternativei cu multioptiuni.
Macro Option |
Bundle File |
Creates |
Option Equivalence Translate M to C/C++ Function Wrapper | Target Language | | Output Stage | | | Helper Functions | | | | | | | | M-File Library | | | | | |
-m |
macro_option_m |
Stand-alone C application |
-t -W main -L C T link:exe -h libmmfile.mlib |
-p |
macro_option_p |
Stand-alone C++ application |
-t -W main -L Cpp T link:exe -h libmmfile.mlib |
-x |
macro_option_x |
MEX-function |
-t -W mex -L C T link:mexlibrary libmatlbmx.mlib |
-S |
macro_option_S |
SimulinkS-function |
-t -W simulink -L C T link:mex libmatlbmx.mlib |
-B sgl |
sgl |
Stand-alone C graphics Library application |
-m -W mainhg libmwsglm.mlib |
-B sglcpp |
sglcpp |
Stand-alone C++ graphics library application |
-p -W mainhg libmwsglm.mlib |
-B pcode |
pcode |
MATLAB P-code |
-t -L P |
-g |
macro_option_g |
Enable debug |
-G -A debugline:on -O none |
Interpretarea unei macro-optiuni.
A. Macrouri pentru realizarea de executabile fara a apela la biblioteca grafica
Optiunea -m spune Compilatorului sa produca o aplicatie de sine-statatoare dintr-o sursa C generata de translatorul MATLAB-->C. Macroul -m este echivalent cu seria de optiuni:
-t -W main -L C -T link:exe -h libmmfile.mlib
Acest tabel arata semnificatia celor 5 optiuni ce compun macroul -m si informatia care o furnizeaza Compilatorului.
Optiunea |
Functia |
-t |
Translateaza cod M în cod C/C++ . |
-W main |
Produce un fisier wrapper potrivit pentru aplicatia executabila |
-L C |
Genereaza cod C ca limbaj tinta. |
-T link:exe |
Creaza un executabil ca iesire. |
-h |
În mod automat gaseste si compileaza functii helper incluse în fisierul sursa M-file. |
libmmfile.mlib |
Leaga cu aceasta biblioteca distribuita daca este necesar (în faza link) |
codegen - translateaza M-files în C/C++ files si genereaza un wrapper file. (Aceasta este setarea implicita -T.)
compile:mex - la fel cu codegen, în plus compileaza C/C++ files într-o forma .obj pretabila pentru legarea într-un MEX-file (.dll) de tip S-functie Simulink.
compile:mexlibrary - la fel cu codegen, în plus compileaza C/C++ files într-o forma object (.obj) pretabila pentru legarea într-un MEX-file (.dll) obisnuit (nu de tip S-functie).
compile:exe - la fel cu codegen, în plus compileaza C/C++ files într-o forma object (.obj) pretabila pentru legarea într -o aplicatie de sine-statatoare (.exe).
compile:lib - la fel cu codegen, în plus compileaza C/C++ files într-o forma object (.obj) pretabila pentru legarea într într-o biblioteca partajata (shared library/DLL).
link:mex - la fel cu compile:mex, în plus leaga fisierele obiect într-un fisier MEX (.dll) de tip Simulink S-function.
link:mexlibrary - la fel cu compile:mexlibrary, în plus leaga fisierele object într-un fisier MEX (cu extensia .dll) obisnuit (non S-function).
link:exe - la fel cu compile:exe, în plus leaga fisierele object într-un executabil de sine statator (aplicatie DOS cu extensia .exe).
link:lib - la fel cu compile:lib, în plus leaga fisierele object într-o biblioteca partajata (shared library/DLL).
În exemplul care urmeaza, construim functia fact.m ce calculeaza factorialul si îl afiseaza cu ajutorul functiei de afisare afisare.m
function nfact=fact(n)
nfact=factorial(n);
fprintf('%d!=',n);
afisare(nfact);
function []=afisare(var);
disp(var);
>> mcc -t -W main -L C -h -T link:exe libmmfile.mlib fact.m
este echivalent cu
>> mcc -m fact.m
>> dir fact*.*
fact.asv fact.c fact.exe fact.h fact.m fact_main.c
Daca lansam comanda
>> fact(3) din MATLAB, obtinem
>> fact(3)
ans =
Daca dorim sa o lansam ca o comanda DOS, obtinem eroare, deoarece comenzile DOS (programele executabile .exe) nu returneaza o valoare, ca o functie:
>> !fact(3)
ERROR: N must be a positive integer.
EXITING
Apelul functiei se poate face dintr-o functie ce nu returneaza nimic:
function []=dos_interf();
n=input('Introduceti un nr. natural: ');
fact(n);
>> mcc -v -m dos_interf.m
>> dir dos*.*
dos_interf.c dos_interf.exe dos_interf.h dos_interf.m dos_interf_main.c
Comanda DOS va fi
C:\MATLAB6p5\work>dos_interf
Introduceti un nr. natural: 4
Se observa cum functia a fost executata sub DOS.
Optiunile folosite la compilare sunt echivalentul macrooptiunii -m si au urmatoarele interpretari:
>> mcc -t -W main -L C -T link:exe libmmfile.mlib dos_interf.m
dos_interf.obj : error LNK2001: unresolved external symbol _mlfFact
dos_interf.exe : fatal error LNK1120: 1 unresolved externals
Exemplu de configurare a unui proces de compilare
Comanda
>> mcc -v -m dos_interf.m
de mai sus este cea care este cel mai comod de folosit si ne scuteste de a tine seama de o serie întreaga de optiuni de compilare si link-editare. Comanda este achivalenta cu
>> mcc -t -W main -L C -h -T link:exe libmmfile.mlib dos_interf.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\dos_interf.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\fact.m"
(Referenced from: "c:\matlab6p5\work\dos_interf.m").
Parsing file "c:\matlab6p5\work\afisare.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Generating file "dos_interf.h".
Generating file "dos_interf.c".
Generating file "fact.h".
Generating file "fact.c".
Generating file "afisare.h".
Generating file "afisare.c".
Generating file "dos_interf_main.c".
Executing command: mbuild -O -v -output 'dos_interf' 'dos_interf.c' 'fact.c' 'afisare.c' 'dos_interf_main.c' -link exe -nohg
This is mbuild Copyright 1984-2002 The MathWorks, Inc.
Procesul de elaborare a executabilului poate fi descompus în mai multi pasi pe care putem sa-i controlam separat.
Spre exemplu, daca dorim sa realizam doar o translatie a functiei MATLAB dos_interf.m în cod C, putem da comanda:
>> mcc -v -t -L C dos_interf.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\dos_interf.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\fact.m"
(Referenced from: "c:\matlab6p5\work\dos_interf.m").
Generating file "dos_interf.h".
Generating file "dos_interf.c".
Generating file "fact.h".
Daca dorim sa facem translatarea tuturor functiilor apelate în cod C, atunci folosim optiunea -h:
>> mcc -v -t -h -L C dos_interf.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\dos_interf.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\fact.m"
(Referenced from: "c:\matlab6p5\work\dos_interf.m").
Parsing file "c:\matlab6p5\work\afisare.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Parsing file "c:\matlab6p5\toolbox\ matlab\specfun\factorial.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Generating file "dos_interf.h".
Generating file "dos_interf.c".
Generating file "fact.h".
Generating file "fact.c".
Generating file "afisare.h".
Generating file "afisare.c".
Generating file "factorial.h".
Generating file "factorial.c".
Executabilul DOS este realizat de catre utilitarul mbuild. Acesta va prelua la intrare fisierele .c corespunzatoare functiilor ce se compileaza, le transforma în fisiere .obj (cod obiect) pe care apoi le leaga cu bibliotecile MATLAB necesare pentru a crea executabilul.
Bibliotecile necesare sunt furnizate de fisierul wrapper ce se construieste automat cu ajutorul optiunii -W main.
>> mcc -v -t -L C -W main -h dos_interf.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\dos_interf.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\fact.m"
(Referenced from: "c:\matlab6p5\work\dos_interf.m").
Parsing file "c:\matlab6p5\work\afisare.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Parsing file "c:\matlab6p5\toolbox\ matlab\specfun\factorial.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Generating file "dos_interf.h".
Generating file "dos_interf.c".
Generating file "fact.h".
Generating file "fact.c".
Generating file "afisare.h".
Generating file "afisare.c".
Generating file "factorial.h".
Generating file "factorial.c".
Generating file "dos_interf_main.c".
Se observa cum din fisierul dos_interf.m se obtin o serie de fisiere .c si headerele corespondentele .h; fiecare functie utilizator sau MATLAB se transpune într-un grup de fisiere (.c si .h) care sun gestionate de un fisier wrapper numit dos_interf_main.c.
Cu comanda urmatoare se pot compila toate fisierele .c obtinute pentru a obtine corespondentele în cod obiect .obj:
>> mcc -v -T compile:exe dos_interf.c fact.c afisare.c factorial.c dos_interf_main.c
Compiler version: 3.0
Executing command: mbuild -O -v -c 'dos_interf.c' 'fact.c' 'afisare.c' 'factorial.c' 'dos_interf_main.c' -link exe -no_mmfile -nohg
This is mbuild Copyright 1984-2002 The MathWorks, Inc.
-->"cl -c -Zp8 -G5 -W3 -nologo /Fodos_interf.obj -IC:\MATLAB6p5\extern\include -IC:\MATLAB6p5\simulink\include -O2 -DNDEBUG dos_interf.c"
dos_interf.c
--> "cl -c -Zp8 -G5 -W3 -nologo /Fofact.obj -IC:\MATLAB6p5\extern\include -IC:\MATLAB6p5\simulink\include -O2 -DNDEBUG fact.c"
fact.c
--> "cl -c -Zp8 -G5 -W3 -nologo /Foafisare.obj -IC:\MATLAB6p5\extern\include -IC:\MATLAB6p5\simulink\include -O2 -DNDEBUG afisare.c"
afisare.c
--> "cl -c -Zp8 -G5 -W3 -nologo /Fofactorial.obj -IC:\MATLAB6p5\extern\include -IC:\MATLAB6p5\simulink\include -O2 -DNDEBUG factorial.c"
factorial.c
factorial.c(136) : warning C4761: integral size mismatch in argument; conversion supplied
--> "cl -c -Zp8 -G5 -W3 -nologo /Fodos_interf_main.obj -IC:\MATLAB6p5\extern\include -IC:\MATLAB6p5\simulink\include -O2 -DNDEBUG dos_interf_main.c"
dos_interf_main.c
În acest moment se pot link-edita fisierele .obj obtinute. Aceasta se face cu comanda:
>> mcc -v -T link:exe dos_interf.obj fact.obj afisare.obj factorial.obj dos_interf_main.obj libmmfile.mlib
Compiler version: 3.0
Executing command: mbuild -O -v -output 'dos_interf' 'dos_interf.obj' 'fact.obj' 'afisare.obj' 'factorial.obj' 'dos_interf_main.obj' -link exe -no_mmfile -nohg
This is mbuild Copyright 1984-2002 The MathWorks, Inc.
Utilitarul mbuild se foloseste pentru a compila si link-edita fisierele sursa C independente de context ce se genereaza de mcc în prima faza. Utilitarul mbuild se poate invoca direct sub forma urmatoare:
a) daca se face compilarea fisierelor, fisierele de compilat au extensia .c si fisierele de iesire vor fi de tip .obj:
>> mbuild -O -v -c 'dos_interf.c' 'fact.c' 'afisare.c' 'factorial.c' 'dos_interf_main.c' -link exe -no_mmfile -nohg
b) daca mbuild se apeleaza cu fisiere de intrare de tip .obj, atunci se va face link-editarea cu bibliotecile mentionate (libmmfile.mlib)
>> mbuild -O -v -output 'dos_interf' 'dos_interf.obj' 'fact.obj' 'afisare.obj' 'factorial.obj' 'dos_interf_main.obj' -link exe -no_mmfile -nohg
>> mcc -v -m dos_interf.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\dos_interf.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\fact.m"
(Referenced from: "c:\matlab6p5\work\dos_interf.m").
Parsing file "c:\matlab6p5\work\afisare.m"
(Referenced from: "c:\matlab6p5\work\fact.m").
Generating file "dos_interf.h".
Generating file "dos_interf.c".
Generating file "fact.h".
Generating file "fact.c".
Generating file "afisare.h".
Generating file "afisare.c".
Generating file "dos_interf_main.c".
Executing command: mbuild -O -v -output 'dos_interf' 'dos_interf.c' 'fact.c' 'afisare.c' 'dos_interf_main.c' -link exe -nohg
This is mbuild Copyright 1984-2002 The MathWorks, Inc.
Prin comparatie, comanda cu macroul -m
>> mcc -v -m dos_interf.m
este identica cu comanda explicita
>> mcc -t -W main -L C -h -T link:exe libmmfile.mlib dos_interf.m
Daca se face mai întâi translatarea si fisierul wrapper (adica se foloseste numai mcc, nu si mbuild), sau daca se apeleaza apoi utilitarul mbuild atunci se observa ca se vor compila si M-fisierele ce apartin bibliotecilor MATLAB predefinite, nu numai cele ale utilizatorului, în cazul în care nu specificam biblioteca MATLAB libmmfile.mlib.
>> mcc -v -t -W main -L C -h libmmfile.mlib dos_interf.m >> mcc -v -t -W main -L C -h -T link:exe libmmfile.mlib dos_interf.m |
>> mcc -v -t -W main -L C -h dos_interf.m |
Compiler version: 3.0 Parsing file "c:\matlab6p5\work\dos_interf.m" (Referenced from: "Compiler Command Line"). Parsing file "c:\matlab6p5\work\fact.m" (Referenced from: "c:\matlab6p5\work\dos_interf.m"). Parsing file "c:\matlab6p5\work\afisare.m" (Referenced from: "c:\matlab6p5\work\fact.m"). Generating file "dos_interf.h". Generating file "dos_interf.c". Generating file "fact.h". Generating file "fact.c". Generating file "afisare.h". Generating file "afisare.c". Generating file "dos_interf_main.c". |
Compiler version: 3.0 Parsing file "c:\matlab6p5\work\dos_interf.m" (Referenced from: "Compiler Command Line"). Parsing file "c:\matlab6p5\work\fact.m" (Referenced from: "c:\matlab6p5\work\dos_interf.m"). Parsing file "c:\matlab6p5\work\afisare.m" (Referenced from: "c:\matlab6p5\work\fact.m"). Parsing file "c:\matlab6p5\toolbox\ matlab\specfun\factorial.m" (Referenced from: "c:\matlab6p5\work\fact.m"). Generating file "dos_interf.h". Generating file "dos_interf.c". Generating file "fact.h". Generating file "fact.c". Generating file "afisare.h". Generating file "afisare.c". Generating file "factorial.h". Generating file "factorial.c". Generating file "dos_interf_main.c". |
Daca se vor face multe apeluri la functii din bibliotecile MATLAB (matematice, grafice, toolbox-uri) atunci translatarea sau crearea de executabile este însotita de translatarea tuturor functiilor întâlnite, lucru ce duce la o avalansa de fisiere de tip .c si .h ce se creaza.
Rezulta ca se recomanda apelul cu macrooptiunea -m aplicata asupra functiei principale.
B. Macrouri pentru realizarea de executabile cu apel la biblioteca grafica
Consideram urmatoarele 3 functii MATLAB
function []=dos_grafic();
titlu=input('Introduceti titlul graficului: ','s');
ti=input('Timp initial [sec]: ');
tf=input('Timp final [sec]: ');
dt=input('dt [sec]: ');
[x,y]=calcule(ti,tf,dt);
grafic(x,y);
title(titlu);
function [x,y]=calcule(ti,tf,dt);
x=ti:dt:tf;
y=sin(x)+2*cos(3*x);
function []=grafic(x,y);
plot(x,y);
Fisierul dos_grafic.m se poate compila cu macrocomanda
>> mcc -v -B sgl dos_grafic.m
Macrocomanda este echivalenta cu
>> mcc -v -m -W mainhg libmwsglm.mlib dos_grafic.m
>> mcc -v -B sgl dos_grafic.m >> mcc -v -m -W mainhg libmwsglm.mlib dos_grafic.m |
>> mcc -v -t -L C -W mainhg -h -T link:exe dos_grafic.m |
Compiler version: 3.0 Parsing file "c:\matlab6p5\work\dos_grafic.m" (Referenced from: "Compiler Command Line"). Parsing file "c:\matlab6p5\work\calcule.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Parsing file "c:\matlab6p5\work\grafic.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graph2d\title.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Generating file "dos_grafic.h". Generating file "dos_grafic.c". Generating file "calcule.h". Generating file "calcule.c". Generating file "grafic.h". Generating file "grafic.c". Generating file "title.h". Generating file "title.c". Generating file "dos_grafic_mainhg.c". Executing command: mbuild -O -v -output 'dos_grafic' 'dos_grafic.c' 'calcule.c' 'grafic.c' 'title.c' 'dos_grafic_mainhg.c' -link exe -no_mwsglm |
Compiler version: 3.0 Parsing file "c:\matlab6p5\work\dos_grafic.m" (Referenced from: "Compiler Command Line"). Parsing file "c:\matlab6p5\work\calcule.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Parsing file "c:\matlab6p5\work\grafic.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graph2d\title.m" (Referenced from: "c:\matlab6p5\work\dos_grafic.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graphics\gca.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graph2d\title.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graphics\isappdata.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graph2d\title.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graph2d\private\mwbypass.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graph2d\title.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graphics\gcf.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graphics\gca.m"). Parsing file "c:\matlab6p5\toolbox\matlab\datatypes\isfield.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graphics\isappdata.m"). Parsing file "c:\matlab6p5\toolbox\matlab\graphics\getappdata.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graph2d\private\mwbypass.m"). Parsing file "c:\matlab6p5\toolbox\matlab\datatypes\iscell.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graph2d\private\mwbypass.m"). Parsing file "c:\matlab6p5\toolbox\matlab\lang\nargchk.m" (Referenced from: "c:\matlab6p5\toolbox\matlab\graphics\getappdata.m"). Generating file "dos_grafic.h". Generating file "dos_grafic.c". Generating file "calcule.h". Generating file "calcule.c". Generating file "grafic.h". Generating file "grafic.c". Generating file "title.h". Generating file "title.c". Generating file "gca.h". Generating file "gca.c". Generating file "isappdata.h". Generating file "isappdata.c". Generating file "graph2d_private_mwbypass.h". Generating file "graph2d_private_mwbypass.c". Generating file "gcf.h". Generating file "gcf.c". Generating file "isfield.h". Generating file "isfield.c". Generating file "getappdata.h". Generating file "getappdata.c". Generating file "iscell.h". Generating file "iscell.c". Generating file "nargchk.h". Generating file "nargchk.c". Generating file "dos_grafic_mainhg.c". Executing command: mbuild -O -v -output 'dos_grafic' 'dos_grafic.c' 'calcule.c' 'grafic.c' 'title.c' 'gca.c' 'isappdata.c' 'graph2d_private_mwbypass.c' 'gcf.c' 'isfield.c' 'getappdata.c' 'iscell.c' 'nargchk.c' 'dos_grafic_mainhg.c' -link exe -no_mmfile -no_mwsglm |
Se observa din tabelul de mai sus faptul ca, daca dorim sa prelucram pas cu pas fisierul dos_grafic.m putem sa provocam o functionare neoptimizata a compilatorului. Nemaiincluzând biblioteca grafica libmwsglm.mlib putem provoca o avalansa de translatari în C a functiilor din bibliotecile grafice si matematice din MATLAB.
C. Macrouri pentru realizarea de biblioteci partajate
Ne propunem construirea unei biblioteci partajate constituita din mai multe functii ce se pot apela din mediul MATLAB sau dintr-un executabil.
Experimentul presupune construirea a doua functii: sinus.m si cosinus.m.
function y=sinus(x);
y=sin(x);
function y=cosinus(x);
y=cos(x);
function []=main();
a=[sinus(1),sinus(2);cosinus(3),cosinus(4)];
a
b=a'
Construirea unei biblioteci partajate my_lib.mlib
Cele doua functii sinus si cosinus se vor grupa într-o biblioteca pe care o denumim my_lib.mlib
>> mcc -v -t -L C -W lib:'my_lib' -T link:lib -h libmmfile.mlib sinus.m cosinus.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\sinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\cosinus.m"
(Referenced from: "Compiler Command Line").
Generating file "sinus.h".
Generating file "sinus.c".
Generating file "cosinus.h".
Generating file "cosinus.c".
Generating file "my_lib.c".
Generating file "my_lib.h".
Generating file "my_lib.exports".
Generating file "my_lib.mlib".
Executing command: mbuild -O -v -output 'my_lib' 'sinus.c' 'cosinus.c' 'my_lib.c' -link shared 'my_lib.exports' -no_mmfile -nohg
La acelasi rezultat ajungem si daca apelam la comanda
>> mcc -v -B csharedlib:'my_lib' sinus.m cosinus.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\sinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\cosinus.m"
(Referenced from: "Compiler Command Line").
Generating file "sinus.h".
Generating file "sinus.c".
Generating file "cosinus.h".
Generating file "cosinus.c".
Generating file "my_lib.c".
Generating file "my_lib.h".
Generating file "my_lib.exports".
Generating file "my_lib.mlib".
Executing command: mbuild -O -v -output 'my_lib' 'sinus.c' 'cosinus.c' 'my_lib.c' -link shared 'my_lib.exports' -no_mmfile -nohg
Construirea unui executabil pornind de la main.m care face apel la functiile din biblioteca distribuita my_lib.mlib
>> mcc -v -t -L C -W main -T link:exe -h my_lib.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_main.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_main.c' -link exe my_lib.lib -no_mmfile -nohg
La acelasi rezultat ajungem cu comanda macro:
>> mcc -v -m my_lib.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_main.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_main.c' -link exe my_lib.lib -no_mmfile -nohg
D. Macrouri pentru realizarea de biblioteci partajate cu apel la functii grafice MATLAB
a. Numai functia principala face apel la functii grafice.
function []=main();
t=0:.1:10;
x=sinus(t)+sinus(2*t).*cosinus(3*t);
plot(t,x);
Biblioteca distribuita ramâne aceeasi, în schimb executabilul se va obtine folosind comenzile:
>> mcc -v -B sgl my_lib.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_mainhg.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_mainhg.c' -link exe my_lib.lib -no_mmfile -no_mwsglm
>> mcc -v -m -W mainhg libmwsglm.mlib my_lib.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_mainhg.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_mainhg.c' -link exe my_lib.lib -no_mmfile -no_mwsglm
b. Functiile din biblioteca partajata fac apel la functii grafice MATLAB
function []=main();
t=0:.1:10;
x=sinus(t)+sinus(2*t).*cosinus(3*t);
figure(1);plotare(t,x);
figure(2);plot(x,t);
function []=plotare(x,y);
plot(x,y);
În acest caz, biblioteca partajata se reface prin adaugarea functiei plotare.m.
1. Construirea bibliotecii partajate se poate face cu una dintre comenzile:
>> mcc -v -t -L C -W libhg:'my_lib' -T link:lib -h libmmfile.mlib libmwsglm.mlib sinus.m cosinus.m plotare.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\sinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\cosinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\plotare.m"
(Referenced from: "Compiler Command Line").
Generating file "sinus.h".
Generating file "sinus.c".
Generating file "cosinus.h".
Generating file "cosinus.c".
Generating file "plotare.h".
Generating file "plotare.c".
Generating file "my_lib.c".
Generating file "my_lib.h".
Generating file "my_lib.exports".
Generating file "my_lib.mlib".
Executing command: mbuild -O -v -output 'my_lib' 'sinus.c' 'cosinus.c' 'plotare.c' 'my_lib.c' -link shared 'my_lib.exports' -no_mmfile -no_mwsglm
>> mcc -v -B csglsharedlib:'my_lib' sinus.m cosinus.m plotare.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\sinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\cosinus.m"
(Referenced from: "Compiler Command Line").
Parsing file "c:\matlab6p5\work\plotare.m"
(Referenced from: "Compiler Command Line").
Generating file "sinus.h".
Generating file "sinus.c".
Generating file "cosinus.h".
Generating file "cosinus.c".
Generating file "plotare.h".
Generating file "plotare.c".
Generating file "my_lib.c".
Generating file "my_lib.h".
Generating file "my_lib.exports".
Generating file "my_lib.mlib".
Executing command: mbuild -O -v -output 'my_lib' 'sinus.c' 'cosinus.c' 'plotare.c' 'my_lib.c' -link shared 'my_lib.exports' -no_mmfile -no_mwsglm
2. Construirea executabilului main.exe se poate face cu comenzile sau macrocomenzile:
>> mcc -v -t -L C -W mainhg -T link:exe -h my_lib.mlib libmwsglm.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_mainhg.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_mainhg.c' -link exe my_lib.lib -no_mmfile -no_mwsglm
>> mcc -v -B sgl my_lib.mlib main.m
Compiler version: 3.0
Parsing file "c:\matlab6p5\work\main.m"
(Referenced from: "Compiler Command Line").
Generating file "main.h".
Generating file "main.c".
Generating file "main_mainhg.c".
Executing command: mbuild -O -v -output 'main' 'main.c' 'main_mainhg.c' -link exe my_lib.lib -no_mmfile -no_mwsglm
|