Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
Paolo Tripicchio
Corso di Meccatronica
Anno accademico 2007/2008
Indice
1 The MathWorks 4
1.1 Il MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Il Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Lo Stateflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1
2.9.1 Rate Transitions e Blocchi Asincroni . . . . . . . . . . 33
4 Ottimizzazioni fixed-point 41
4.1 Rappresentazione fixed-point . . . . . . . . . . . . . . . . . . . 41
2
Elenco delle figure
3
Capitolo 1
The MathWorks
4
1.1 Il MATLAB
Il MATLAB è un linguaggio ad alto livello ed un ambiente interattivo che
permette all’utente di compiere processi computazionalmente dispendiosi in
maniera più veloce che con i linguaggi di programmazione tradizionali.
E’ possibile utilizzare MATLAB in un largo numero di applicazioni tra le
quali il filtraggio di segnali ed immagini, la progettazioni di controllori, la
effettuazione di test e misurazioni, la modellazione finanziaria e la biologia
computazionale. Toolbox aggiuntivi estendono l’ambiente MATLAB permet-
tendo di risolvere particolari classi di problemi.
Il MATLAB fornisce una serie di meccanismi per documentare e condivire il
proprio lavoro. Riassumendo il MATLAB fornisce:
1.2 Il Simulink
Il Simulink è ua piattaforma per la simulazione e la progettazione model-
based dei sistemi dinamici. Esso fornisce un ambente grafico interattivo e un
insieme di librerie di blocchi personalizzabile che permettono di progettare
accuratamente, simulare, implementare e testare sistemi tempo varianti.
Dei prodotti aggiuntivi estendono l’ambiente Simulink con strumenti per la
modellazione e la generazione di codice specifica.
Simulink è integrato con MATLAB garantendo un accesso immediato ad un
numeroso insieme di strumenti per lo sviluppo di algoritmi, la visualizzazione
dei dati, l’analisi dei dati e il calcolo numerico.
Riassumendo il Simulink fornisce:
5
• Un numero estensivo ed espandibile di librerie di blocchi predefiniti
• Un editor grafico interattivo per l’assemblamento e la gestione intuitiva
dei diagrammi a blocchi
• La capacità di trattare progetti complessi segmentando i modelli dentro
gerarchie dei componenti del progetto
• La capacità di interfacciarsi con altri programmi di simulazione e di
incorporare codice scritto a mano
• Le opzioni per simulare i sistemi tempo-varianti interattivamente con
passo fisso o variabile
• Le funzioni per definire interattivamente gli ingressi e vedere le uscite
per valutare il comportamento del modello
• Un accesso completo alle funzionalità del MATLAB
• Strumenti per l’analisi di modello e strumenti diagnostici per assicurare
la consistenza del modello ed identificare gli errori di modellazione
1.3 Lo Stateflow
Lo Stateflow è uno strumento per la simulazione e la progettazione interattiva
dei sistemi ad eventi che si va ad aggiungere al Simulink. Lo Stateflow
fornisce gli elementi richiesti per la descrizione della logica complessa in una
forma naturale e comprensibile. Fornisce quindi un ambiente efficiente per
la progettazione di sistemi embedded che contengono logica di supervisione
o di controllo.
I diagrammi Stateflow permettono una rappresentazione grafica degli stati
paralleli o gerarchici e delle transizioni event-driven tra di essi. Con l’utilizzo
dello Stateflow Coder è anche possibile generare codice C ottimizzato dai
diagrammi Stateflow. Riassumendo lo Stateflow:
• Fornisce elementi di linguaggio, gerarchia, parallelismo e semantica di
esecuzione deterministica per la descrizione di logica complessa in una
forma naturale e comprensibile
• Offre la possibiltà di definire funzioni in maniera grafica attraverso di-
agrammi di flusso, in maniera procedurale tramite il linguaggio MAT-
LAB e in forma tabellare con le tabelle della verità.
• Schedula le transizioni e gli eventi usando una logica temporale
6
• Supporta le macchine a stati finiti di Mealy e di Moore
7
Capitolo 2
8
so di generazione dei programmi tramite Real-Time Workshop può essere
configurato secondo le proprie esigenze modificando i seguenti componenti:
9
– Si può rendere visibile al codice esterno ogni segnale, parametro e
altra struttura dati rendendo più facile il tuning dei parametri e
la monitorizzazione dei segnali.
– E’ possibile modificare o preparare i files di script del Target Lan-
guage Compiler per personalizzare la trasformazione dei blocchi
Simulink in codice sorgente.
• Un template makefile
• Un comando make
10
Figura 2.1: Real-Time Workshop Flowchart
11
Figura 2.2: File generati e dipendenze
12
multitasking risulterà in una esecuzione del modello più efficiente.
I concetti seguenti sono utili nella descrizione di come esegue il modello. Ri-
porto qui i nomi delle funzioni usate nei target GRT e ERT con tra parentesi
le analoghe chiamate GRT-compatibili.
rtOneStep()
{
Controllo interrupt overflow
Attivazione interrupt "rtOneStep"
ModelOutputs -- passo temporale maggiore.
LogTXY -- Log Tempo, stati e porte di uscita.
ModelUpdate -- passo temporale maggiore.
Integrate -- Integrazione nei passi temporali minori per
13
-- gli stati continui
ModelDerivatives
Do 0 o Più
ModelOutputs
ModelDerivatives
EndDo (Il numero di iterazioni dipende dal solutore.)
Calcolo derivate per aggiornare stati continui.
EndIntegrate
}
main()
{
Initializzazione (inclusa istallazione di rtOneStep come
interrupt service routine, ISR, per un clock real-time).
While(tempo < tempo finale)
Esecuzione processi in Background.
EndWhile
Mask interrupts (Disattiva rtOneStep dall’esecuzione.)
Completa tutti i Processi in Background.
Shutdown
}
rtOneStep()
{
Controllo interrupt overflow
Attivazione interrupt "rtOneStep"
14
ModelOutputs(tid=0) -- passo temporale maggiore.
LogTXY -- Log Tempo, stati e porte di uscita.
ModelUpdate(tid=0) -- passo temporale maggiore.
Integrate -- Integrazione nei passi temporali minori per
-- gli stati continui
ModelDerivatives
Do 0 o Più
ModelOutputs(tid=0)
ModelDerivatives
EndDo (Il numero di iterazioni dipende dal solutore.)
Calcolo derivate per aggiornare stati continui.
EndIntegrate
For i=1:NumTasks
If (hit in task i)
ModelOutputs(tid=i)
ModelUpdate(tid=i)
EndIf
EndFor
}
main()
{
Initializzazione (inclusa istallazione di rtOneStep come
interrupt service routine, ISR, per un clock real-time).
While(time < final time)
Esecuzione processi in Background.
EndWhile
Mask interrupts (Disattiva rtOneStep dall’esecuzione.)
Completa tutti i Processi in Background.
Shutdown
}
15
2.4 Temporizzazione del Programma
I programmi real-time richiedono una temporizzazione attenta per l’invo-
cazione dei task per assicurare che il codice del modello termini la sua es-
ecuzione prima che avvenga un’altra chiamata del task. Questo include il
tempo per leggere e scrivere dati da e verso hardware esterno.
La figura 2.3 mostra la temporizzazione dell’interruzione. L’intervallo di
16
2.5 Differenze tra i Modelli di Esecuzione Rapid
Prototyping ed Embedded
Il Rapid Prototyping fornisce una interfaccia di programmazione delle ap-
plicazioni (API) che non cambia tra le definizioni di modello. L’ Embed-
ded Coder invece fornisce una API ottimizzata su misura al proprio modello.
Quando viene utilizzato lo stile embedded di generazione del codice la model-
lazione viene fatta nel modo in cui si vuole che esegua il codice nel sistema
embedded.
Una delle maggiori differenze tra lo stile di generazione del codice Rapid
Prototyping ed Embedded è che quest’ultimo contiene meno funzioni entry-
point. Lo stile di codice Embedded può essere configurato per avere un unica
funzione run-time, model step.
Quindi facendo riferimento allo pseudocodice di esecuzione del modello pre-
sentato prima si possono eliminare gli statements Loop...EndLoop e rag-
gruppare ModelOutputs, LogTXY e ModelUpdate in un singolo statement,
model step.
Altrimenti si avrà
17
– model terminate: Questa funzione contiene tutto il codice di
terminazione e deve essere chiamato come parte dello spegnimento
del sistema.
18
• Il tempo di campionamento di ciascun blocco deve essere un multiplo
intero del tempo di campionamento base(il più veloce).
19
modelli multirate che utilizzano processi asincroni (vedi paragrafo 2.9.1).
Nei sistemi single-tasking non ci sono problemi nell’avere più tempi di cam-
pionamento. Nei sistemi multitasking o pseudomultitasking invece differenti
frequenze di campionamento possono causare problemi facendo eseguire i
blocchi nell’ordine sbagliato. Per prevenire errori nei dati calcolati si deve
quindi controllare l’esecuzione del modello durante queste transizioni. Quan-
do si connettono blocchi più veloci e più lenti si devono aggiungere blocchetti
Rate Transition tra essi (o dobbiamo farli aggiungere da Simulink).
20
Utilizzando il blocchetto Rate Transition è possibile assicurare che i trasferi-
menti dati nella propria applicazione siano sia protetti che deterministici. Se
queste caratteristiche non sono desiderate è possibile tuttavia compromettere
l’integrità dei dati e il determinismo in favore di una minore latenza.
21
Figura 2.4: Configurazione blocco Rate Transition
22
veloce a lento usano invece un semaforo. La latenza massima in questo
caso è minore uguale ad un periodo di campionamento del processo più
veloce.
23
memoria e risorse di calcolo. Nel caso di applicazioni su sistemi embed-
ded real-time queste risorse addizionali generalmente non sono disponibili.
Si possono però diminuire i requisiti dell’applicazione utilizzando il Target
Language Compiler fornito con il Real-Time Workshop per rendere le
S-function inlined.
1. ‘Non mi interessa l’efficienza. Voglio scrivere una versione del mio al-
goritmo che giri su Simulink e Real-Time Workshop automaticamente.’
1. Noninlined S-function
2. Wrapper S-function
24
2.8.3 Wrapper S-Functions
Una wrapper S-function è ideale per interfacciare il codice scritto a mano o
un grosso algoritmo incapsulato in diverse procedure. In questa situazione di
solito le procedure risiedono in moduli separati dalla S-function. Il modulo
S-function contiene delle chiamate alle proprie procedure. Poichè l’S-function
contiene solo chiamate e nessun codice viene chiamata wrapper S-function.
Oltre alla wrapper MEX S-function è necessario creare un TLC wrapper che
complementa la funzione. Il codice TLC rispecchia il codice dell’S-function
presentando solamente chiamate di funzione.
25
Nei prossimi paragrafi voglio mostrare come generare una semplice wrap-
per S-function e i vantaggi che conseguono dal rendere tale S-function inlined.
// File wrapsfcn.c
/*
* mdlInitializeSizes - initializzo le dimensioni degli array
*/
26
ssSetInputPortDirectFeedThrough(S, 0, 1);
if (!ssSetNumOutputPorts(S,1)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetNumSampleTimes( S, 1);
}
/*
* mdlInitializeSampleTimes - questa impostazione indica che il tempo
* di campionamento è derivato dal blocco pilota
*/
/*
* mdlOutputs - calcola l’uscita chiamando my_alg
*/
/*
* mdlTerminate - funzione chiamata quando termina il programma.
*/
27
La routine mdlOutputs dell’S-function contiene una chiamata di funzione a
my alg che è la funzione C che contiene l’algoritmo da eseguire. Questo è
invece il codice di esempio per my alg.c:
#ifdef MATLAB_MEX_FILE
#include "tmwtypes.h"
#else
#include "rtwtypes.h"
#endif
real_T my_alg(real_T u)
{
return(u * 2.0);
}
*y = my_alg(*uPtrs[0]);
#include <math.h>
#include <string.h>
#include "wrapper.h"
#include "wrapper.prm"
28
/* Compute block outputs */
void mdlOutputs(int_T tid)
{
/* Level2 S-Function Block: <Root>/S-Function (wrapsfcn) */
{
/* Le S-functions noninlined creano un oggetto SimStruct e
* generano una chiamata alla routine mdlOutputs dell’S-function
*/
SimStruct *rts = ssGetSFunction(rtS, 0);
sfcnOutputs(rts, tid);
}
/* Terminate function */
void mdlTerminate(void)
{
/* Level2 S-Function Block: <Root>/S-Function (wrapsfcn) */
{
/* Le S-functions noninlined richieddono un oggetto SimStruct e
* la chiamata alla routine mdlTerminate dell’S-function
*/
SimStruct *rts = ssGetSFunction(rtS, 0);
sfcnTerminate(rts);
}
}
#include "wrapper.reg"
/* [EOF] wrapper.c */
29
TLC per l’S-function.
Il codice generato effettua la chiamata alla S-function (wrapsfcn.c) in md-
lOutputs attraverso questo codice:
%% File : wrapsfcn.tlc
%% Function: BlockTypeSetup
%% Function: Outputs
30
%implements "wrapsfcn" "C"
Il compito successivo è quello di istruire Real-Time Workshop che la rou-
tine my alg deve essere dichiarata extern nel file generato wrapper.h. Poichè
questa operazione va fatta una sola volta per ogni blocco wrapsfcn S-function
viene utilizzata la funzione BlockTypeSetup. In questa funzione si dice al
Target Language Compiler di creare un buffer e di inserire il buffer che con-
tiene la dichiarazione di my alg come extern all’interno del file di intestazione
generato wrapper.h.
Il passo finale è di inserire la chiamata alla funzione my alg. Questo viene
fatto nella funzione Outputs. In questa funzione si accede all’ingresso e us-
cita del blocco e si piazza una chiamata diretta a my alg che verrà inserita
in wrapper.c.
Il codice generato utilizzando il wrapper TLC è simile al codice generato di
default ma la funzione mdlTerminate non contiene più una chiamata ad una
funzione vuota e mdlOutputs chiama direttamente my alg.
void mdlOutputs(int_T tid)
{
/* S-Function Block: <Root>/S-Function */
rtB.S_Function = my_alg(rtB.U); /* chiamata a my_alg inserita
nel codice */
/* Outport Block: <Root>/Out */
rtY.Out = rtB.S_Function;
}
Oltre a questo wrapper.reg non crea più una SimStruct figlia per la S-function
il che fa risparmiare più di 1 K di memoria.
31
void mdlOutputs(int_T tid)
{
/* S-Function Block: <Root>/S-Function */
rtB.S_Function = 2.0 * rtB.U; /* inserzione esplicita
dell’algoritmo */
/* Outport Block: <Root>/Out */
rtY.Out = rtB.S_Function;
}
32
singolo dove la componente dell’impianto è attiva solamente in simulazione.
Durante la generazione di codice la componente dell’impianto è effettiva-
mente tagliata fuori dal sistema e il codice viene generato solo per il blocco
di interruzione e la parte di controllo del modello.
33
Capitolo 3
34
• Fornisce un Model Advisor che controlla la configurazione del modello
e suggerisce consigli per l’ottimizzazione del codice.
• Fornisce una strategia chiamata rate grouping per i modelli multi-rate
multitasking che genera funzioni separate per il processo con rate di
base e i processi con sub-rate nel modello.
• Fornisce la capacità di verificare il codice prodotto permettendo di im-
portare il codice nuovamente in Simulink tramite una S-function per
un test di tipo software-in-the-loop con un modello di impianto.
• Documenta il codice generato in un report HTML che descrive i mod-
uli del codice e le impostazioni di configurazione applicate in fase di
generazione del codice.
struct _RT_MODEL_model_Tag {
...
};
RT_MODEL_model model_M;
RT_MODEL_model *model_M = &model_M_;
35
3.2 Esecuzione di Programmi Stand-Alone
Di default Real-Time Workshop Embedded Coder genera programmi stand-
alone che non richiedono sistemi operativi real-time esterni. Un progamma
stand-alone richiede qualche minima modifica per essere adattato all’hard-
ware di interesse. L’architettura di programma supporta l’esecuzione di mod-
elli con uno o più rates di campionamento.
Il nucleo di un programma stand-alone è il ciclo main. Ad ogni iterazione il
ciclo main esegue un processo di background o un processo vuoto e controlla
che si verifichi la condizione di terminazione.
Il ciclo main è interrotto periodicamente da un timer. La funzione Real-Time
Workshop rt OneStep o è installata come interrupt service routine (ISR) del
timer o è chiamata da una ISR del timer ad ogni passo di clock.
L’attività di rt OneStep differisce in base al modello generato. In un modello
single-rate rt OneStep chiama semplicemente la funzione model step. In un
modello multi-rate rt OneStep assegna priorità e schedula l’esecuzione dei
blocchi in accordo al loro rate di esecuzione.
Real-Time Workshop Embedded Coder genera codice molto differente nei
modelli multi-rate a seconda dei seguenti fattori:
• Nel caso in cui il modello esegua in modalità singletasking oppure
multitasking.
36
Disattiva interrupts (Disattiva rt_OneStep)
Completa tutti i background tasks
Shutdown
}
3.4 rt OneStep
Le operazioni di rt OneStep differiscono se il modello è single-rate o multi-
rate e in base alla modalità del solutore(SingleTasking o MultiTasking).
rt_OneStep()
{
Controlla overflow dell’Interrupt o altri errori
Attiva "rt_OneStep" (timer) interrupt
Model_Step() -- Passo temporale con output,logging,update
}
Per il caso single-rate rt OneStep è progettata per eseguire model step all’in-
terno di un singolo periodo di clock. Per assicurare questa temporizzazione
rt OneStep mantiene e controlla un flag di timer overrun.
All’inizio le interruzioni sono disabilitate fino a che non è stato controllato
il flag di overrun e le altre condizioni di errore. Se il flag è clear rt OneStep
lo setta e procede con gli interrupt del timer attivati. Il flag viene poi pulito
solamente in seguito ad un ritorno con successo da model step.
Quindi se rt OneStep è riinterrotto prima di aver completato model step
la nuova interruzione viene scoperta attraverso il flag di overrun. Questa
è una condizione di errore che può essere gestita a piacimento. Di default
rt OneStep segnala un errore e ritorna immediatamente.
37
3.4.2 Multi-Rate Multitasking
Il seguente pseudocodice mostra il design di rt OneStep in un programma
multitasking multi-rate.
rt_OneStep()
{
Controlla base-rate interrupt overrun
Attiva "rt_OneStep" interrupt
Determina quali rates devono eseguire in questo passo
Model_Step0() -- esegui codice con il passo base-rate
For N=1:NumTasks-1 -- itera i sub-rate tasks
If (sub-rate task N è schedulato)
Controlla sub-rate interrupt overrun
Model_StepN() -- esegui codice passo sub-rate
EndIf
EndFor
}
38
della schedulazione sono gestiti dalla funzione rate monotonic scheduler che
viene chiamata da model step0. I contatori sono in effetti divisori del clock
rate che contano fino al periodo di campionamento associato con ciascun pro-
cesso sub-rate.
I flag di evento indicano se un determinato processo è schedulato per l’ese-
cuzione. rt OneStep gestisce i flag di evento con la funzione model SetEventsFor-
ThisBaseStep. Quando un contatore indica che il tempo di campionamento
di un processo è passato model SetEventsForThisBaseStep imposta il flag di
evento per quel processo.
Ad ogni invocazione rt OneStep aggiorna la struttura dati del suo schedu-
latore e esegue un passo del processo base-rate. Successivamente itera tra i
flag dello schedulatore in ordine di tid chiamando incondizionatamente mod-
el stepN per ogni task il cui flag è impostato. Questo assicura che i processi
sono eseguiti in ordine di priorità.
Naturalmente le interruzioni devono essere disabilitate prima della chiamata
a rt OneStep. L’array dei flag di evento e le variabili di loop usate sono
salvate come variabili locali nello stack cosı̀ da assicurare che il codice sia
rientrante.
L’ rt OneStep per modelli multi-rate gestisce anche un array di flag per il
timer overrun. La logica con cui si controlla l’overrun di ogni singolo processo
è la stessa usata per i modelli single-rate.
39
azzera il contatore. Questa condizione indica che tutti i blocchi che girano a
quel rate devono essere eseguiti nella prossima chiamata a model step. mod-
el step è responsabile per il controllo dei contatori.
• Impostare gli ingressi del modello associati con il rate base prima di
chiamare model step0.
40
Capitolo 4
Ottimizzazioni fixed-point
41
Figura 4.1: Rappresentazione fixed-point
42
gestione dell’overflow: Wrap e saturate. L’overflow avviene quando il numero
che deve essere salvato come risultato di una operazione matematica supera il
numero di bit che il tipo dati del risultato può contenere. Il metodo saturate
deve essere utilizzato solo nel caso in cui sia essenziale per la sicurezza poichè
aumenta l’uso della ROM e il tempo di esecuzione.
Per ciascuna uscita dei blocchi nel modello è possibile specificare la lunghez-
za della parola e la locazione del punto binario. In base al tipo di operazioni
matematiche eseguite su uno o più numeri fixed-point il risultato potrebbe
richiedere una lunghezza di parola maggiore. Per prima cosa è necessario
simulare il modello cercando le uscite che approssimano nel miglior modo i
valori ottenuti da una simulazione floating point dello stesso modello. Una
scelta inappropiata del range e della risoluzione può fornire un risultato in-
accurato e aumentare la dimensione del codice. Nel caso peggiore si possono
anche ottenere risultati errati a causa di underflow e overflow.
43
Figura 4.2: Simulink fixed-point
44
6. Ottimizzare l’ordine delle operazioni di divisione e moltiplicazione dan-
do come primo ingresso l’ingresso di moltiplicazione al blocco apposito
(ROM, tempo di esecuzione)
45
Capitolo 5
46
• Rimozione di Conversioni di Tipo Ridondanti. Blocchi di con-
versione di tipo non necessari sono rimossi. Per esempio un blocco di
conversione di tipo int con ingresso e uscita di tipo int è ridondante e
viene rimosso.
47
5.3 Implement Logic Signals as Boolean Data
Simulink è impostato per non segnalare un errore quando un segnale di tipo
double va a pilotare un blocco con ingresso booleano. Questo è stato fatto
per mantenere la compatibilità con precedenti versioni di Simulink che sup-
portavano solo i tipi double. Spuntando questa opzione invece si seleziona un
controllo rigido sul tipo booleano. Questa opzione è raccomandata : il codice
generato richiede meno memoria in quanto un segnale booleano è tipicamente
di un byte mentre un segnale double richiede otto bytes di memoria.
48
5.5 Inline Parameters
Selezionare questa opzione ha due effetti:
49
5.7 Enable Local Block Outputs
Quando questa opzione viene attivata i segnali dei blocchi sono dichiarati lo-
calmente nelle funzioni invece di essere dichiarati globalmente quando questo
è possibile.
E’ possibile attivare questa opzione solo quando viene attivata l’0pzione
Signal Storage Reuse.
50
temporanee. Quando questa opzione è attiva Real-Time Workshop riunisce
i calcoli dei blocchi in una singola espressione invece di generare espressioni
separate e dichiarazioni di memoria per ogni blocco del modello.
Questa riduzione può aumentare notevolmente l’efficienza del codice gener-
ato generando codice molto simile al codice scritto a mano. In molti casi
interi gruppi di calcolo vengono ridotti in una linea di codice altamente ot-
timizzata. Molti blocchi Simulink supportano l’expression folding.
Un semplice esempio di come l’expression folding modifica il codice generato
da un modello è il seguente.
Con l’expression folding attivato questo modello genera una singola linea di
calcoli per l’uscita come mostrato nella funzione di uscita.
}
I commenti generati indicano i calcoli dei blocchi che sono stati combinati
in una singola espressione. I commenti documentano anche i parametri dei
blocchi che appaiono nell’espressione.
51
Se l’expression folding è disattivata lo stesso modello calcola i risultati tempo-
ranei sia dei guadagni dei blocchi che dei valori dei prodotti prima dell’uscita
finale come mostrato nel codice seguente.
/* Gain: ’<Root>/k1’ */
rtb_Product_i = exprfld_U.i1 * exprfld_P.k1_Gain;
/* Gain: ’<Root>/k2’ */
rtb_k2_i = exprfld_U.i2 * exprfld_P.k2_Gain;
/* Product: ’<Root>/Product’ */
rtb_Product_i *= rtb_k2_i;
/* Outport: ’<Root>/Out1’ */
exprfld_Y.Out1 = rtb_Product_i;
52
5.13 Remove Code from Floating-Point to In-
teger Conversions That Wraps Out-of-
Range Values
Questa opzione fa rimuovere a Real-Time Workshop il codice che assicura che
l’esecuzione del codice generato produca gli stessi risultati della simulazione
quando avviene una conversione che va fuori range. Questo riduce la dimen-
sione e aumenta la velocità del codice prodotto a scapito della possibilità
di produrre risultati che non corrispondono a quelli della simulazione se si
hanno valori fuori scala.
53
• Remove internal state zero initialization : Se l’opzione è disattiva
viene generato del codice che inizializza a zero le strutture di lavoro
interne.
54
Figura 5.1: Pannello Hardware Implementation
55
Figura 5.2: Pannello Real-Time Workshop
56
Figura 5.4: Pannello Templates
57
Figura 5.5: Pannello C166 Options
58