Creazione di C-MEX S-Function più complesse

Precedente Home Su Successiva

Istruzioni richieste all’inizio di una S-Function

Istruzioni richieste alla fine di una S-Function

Compilazione condizionata delle S-Function

Gestione degli errori  

Il precedente caso, molto semplice, contiene solo alcune delle numerose routine utilizzabili all’interno del nostro codice. In questa sezione si vuole istruire all’uso di queste routine studiando le problematiche che si incontrano durante l’elaborazione del codice.

Istruzioni richieste all’inizio di una S-Function

Ogni programma che definisce una S_Function deve necessariamente iniziare con il seguente blocco di istruzioni:

 

#define S_FUNCTION_NAME your_sfunction_name_here

#define S_FUNCTION_LAVEL 2

#include “simstruct.h”

dove your_sfunction_name_here indica il nome della S_Function che ci si appresta a realizzare e le altre istruzioni definiscono: la prima il tipo di livello della S_Function, la seconda dice a Simulink dove trovare le macro mediante le quali accedere alla struttura dati simstruct.

Istruzioni richieste alla fine di una S-Function

Si includa la sottostante sequenza di istruzioni solo al termine del main della S_Function:

  #ifdef MATLAB­MEX_FILE   /* Il file è stato compilato come MEX-file? */

  #include “simulink.c”    /* Interfaccia tra Simulink e MEX-file */

  #else

  #include “cg_sfun.h”     /* Funzione per la registrazione della*/

                           /* generazione del codice */

  #endif

Queste istruzioni provvedono ad instradare la S_Function verso l’applicazione scelta, Simulink o Real-Time Workshop.

Compilazione condizionata delle S-Function

La compilazione delle S_Function può essere effettuata nei seguenti modi:

MATLAB_MEX_FILE – Indica che la S_Function è stata realizzata come MEX-file per essere utilizzata con Simulink

RT – Indica che la S_Function è stata costruita con codice generato da Real-Time Workshop per applicazioni in tempo reale utilizzanti un solver a passo fisso.

NRT – Indica che la S_Function è stata costruita mediante codice generato da Real-Time Workshop per un’applicazione non in tempo reale che utilizza un solver a passo variabile.

Gestione degli errori

Durante la realizzazione di S_Function può essere utile introdurre dei controlli che determinino la correttezza degli eventi che si susseguono con il fine di interrompere l’esecuzione e visualizzare un opportuno messaggio di errore. Nell’esempio della funzione timestwo non erano necessari molti controlli, si effettua solo un controllo sul numero di parametri nella funzione mdlInitializeSizes, ma per altre funzioni potrebbe essere importante prevedere maggiori controlli.

Il procedimento da usare nel trattamento degli errori è di utilizzare il seguente codice:

ssSetErrorStatus(S,”errore rilevato dovuto a ….”);

return;

Si noti che la stringa di caratteri contenente il messaggio di errore deve risiedere in un area di memoria persistente. Un’altra soluzione come quella che segue non può essere accettata:

mdlOutputs( )

{

    char msg[256];   // ERRORE: specificare “static char msg[256];

    sprintf(msg,”errore dovuto a %s , string );

    ssSetErrorStatus(S,msg);

    return;

}

L’approccio suggerito in questo paragrafo è alternativo all’utilizzo della funzione mexErrMsgTxt la quale, in caso di errore, interrompe la S_Function e restituisce il controllo a Simulink, in questo caso la nostra S_Function non sarebbe exception free con la conseguenza che il codice non sarà ottimizzato, come si è già detto in precedenza. Si consiglia quindi di evitare l’utilizzo di funzioni come mexErrMsgTxt o mxCalloc, una funzione per l’allocazione di memoria, e di scrivere codice exception free utilizzando il seguente comando all’interno di mdlInitializeSizes:

ssSetOptions(S,SS_OPTION_EXCEPTION_FREE_CODE);

Di questo ne beneficeranno le prestazione della S_Function. Le routine che non generano interruzioni sono quelle che accedono ai puntatori e modificano i parametri, per esempio  le routine mxGetPr, mxGetData, mxGetNumberOfDimensions, mxGetM, mxGetN, e mxGetNumberOfElements.

Ci sono routine chiamate durante l’esecuzione della S_Function che potrebbero contenere interruzioni, queste sono:

mdlGetTimeOfNextVarInt

mdlOutputs

mdlUpdate

mdlDerivatives

Se ne sono prive conviene specificare la nostra S_Function come exception free nel modo già spiegato.

Se il codice è exception free ed è stato predisposto il trattamento degli errori (ssSetErrorStatus) in caso di errore Simulink interrompe l’esecuzione e visualizza il messaggio. In caso di errore di gestione della memoria o altri errori critici, l'assenza dell'opzione SS_OPTION_EXCEPTION_FREE_CODE può portare alla chiusura di Simulink o ad un comportamento imprevedibile da parte del Matlab.

Questa pagina è stata aggiornata il 03/01/04.

Testo originale: Massimo Demofonte

Aggiornamento e adattamento: Leonardo Daga

Leonardo Daga's Warehouseâ, http://leonardodaga.insyde.it
Send any Comments to: leonardo.daga@gmail.com