Creazione di C-MEX S-Function più complesse |
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-FunctionOgni programma che definisce una S_Function deve necessariamente iniziare con il seguente blocco di istruzioni:
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-FunctionSi includa la sottostante sequenza di istruzioni solo al termine del main della S_Function:
Queste istruzioni provvedono ad instradare la S_Function verso l’applicazione scelta, Simulink o Real-Time Workshop. Compilazione condizionata delle S-FunctionLa compilazione delle S_Function può essere effettuata nei seguenti modi:
Gestione degli erroriDurante 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:
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:
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:
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:
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 |