|
Appunti tecniche |
|
Visite: 1763 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Prove con il carburatore elettronico comandato in retroazioneProve con il carburatore elettronico comandato in retroazione 1 1855 Henry Bessemer brevetta il metodo per fabbricare l'acciaio1855 Henry Bessemer brevetta il metodo per fabbricare l'acciaio Dalla manifattura alla fabbricaDALLA MANIFATTURA ALLA FABBRICA L'affermazione del lavoro in fabbrica ha |
Il progetto che si intende realizzare è descritto dalle seguenti specifiche.
Si consideri lo scenario costituito da due
sistemi . Un primo sistema P collegato a una cisterna contenente del liquido e
che ne controlla il livello. Il sistema P mantiene in un'area privata le
seguenti informazioni sullo stato della cisterna: temperatura, pressione e
livello del liquido. Un secondo sistema C può controllare il sistema P inviando
ad esso comandi, e richiedendo tutte le informazioni di stato della cisterna di
cui P ha piena visibilità. C e P sono connessi per tramite di un porto
parallelo PIA e uno seriale UART. C può inviare comandi a P interfacciandosi
attraverso
- Inviare comandi al sistema P
- Visualizzare lo stato della cisterna fornito da P
Figura - Schema sistema di controllo
Il record contenente le informazioni sullo stato della cisterna, di dimensione di 256 byte, è contenuto in un buffer così strutturato:
Figura - Record di stato della cisterna
Il sistema P ciclicamente trasferisce
l'intero record dal buffer alla memoria utilizzando un dispositivo DMA. Il DMA
deve essere programmato in modo da trasferire il buffer M1 nella memoria M2
ogni secondo. Il sistema C richiede l'intero record di stato (memorizzato nella
memoria M2 di P) a P attraverso
I comandi che possono essere inviati da C a P sono i seguenti:
Codifica |
Comandi |
|
Inserisci Liquido |
|
Preleva liquido |
|
Riempi la cisterna a metà |
|
Svuota la cisterna |
|
Riempi la cisterna |
S (s Maiuscola) |
Visualizza lo stato della cisterna |
Figura - Codifica dei comandi
Tali comandi operano sull'informazione contenuta nello stato della cisterna "livello del liquido" che è codificata su 4 byte. L'intero record contenente lo stato della cisterna ha dimensione di 256 byte. Le operazioni base, "inserisci liquido" e "preleva liquido" agiscono per valori discreti, se s è il valore del livello del liquido, si ha:
Figura - Modifica del livello del liquido
Tali operazioni prevedono controlli sullo stato della cisterna, non si può inserire liquido se la cisterna è piena e non si può prelevare liquido se la cisterna è vuota.
In ASIM è stato prodotto un file di configurazione il cui schema è riportato di seguito:
Figura - Configurazione ASIM del sistema
Il file di configurazione contiene le seguenti informazioni:
CHIP Name: MEM-A
Type: MMU/BUS. Identif: 01. BUS: 0000.
Addres 1:
Com1: 0000. Com2: 0010. Com3: 0008. Com4: 0000.
Figura - Configurazione della memoria
MEM-A rappresenta la memoria del sistema C ed è connessa al BUS che presenta l'id 01 (pari all'identificativo della memoria stessa). Ponendo Com2 a 0010, equivale ad allocare 10Kbyte di RAM, mentre porre Com3 a 0008 equivale ad allocare 8 Kbyte di ROM.
Il primo byte di RAM è allocato all'indirizzo 8000, mentre il primo byte di ROM è allocato all'indirizzo 0000.
CHIP Name: M68000
Type: CPU. Identif: 02. BUS: 0001.
Addres 1:
Com1: 0000. Com2: 0000. Com3: 0000. Com4: 0000.
Figura - Configurazione del processore
M68000 rappresenta
CHIP Name: I8251USART
Type: Device. Identif: 03. BUS: 0001.
Addres 1:
Com1: 0002. Com2: 0000. Com3: 0000. Com4: 0006.
Figura - Schema della USART
Il dispositivo USART (Universal Synchronous-asynchronous Receiver Transmitter) consente di realizzare una connessione seriale fra dispositivi (ad es. il collegamento seriale di un sistema verso un dispositivo periferico quale un terminale, un modem, una stampante, etc., per effettuare un trasferimento di dati) secondo un protocollo sincrono o asincrono.
È necessario notare
che in questo caso è stato inserito come dispositivo per la gestione delle
interruzioni il processore 0002. Ponendo invece Com4 pari a 0006 si sta
connettendo questa USART con identificativo pari a 03 con
CHIP Name: I8251USART
Type: Device. Identif: 06. BUS: 0004.
Addres 1:
Com1: 0005. Com2: 0003. Com3: 0000. Com4: 0003.
Le considerazioni
introdotte per l'USART precedente sono del tutto analoghe anche per questo
dispositivo: è necessario solo notare che in questo caso è stato inserito come
dispositivo per la gestione delle interruzioni il processore 0005. Inserendo un
valore pari a 0003 alla porta Com2 si fa in modo che
CHIP Name: M2
Type: MMU/BUS. Identif: 04. BUS: 0000.
Addres 1:
Com1: 000D. Com2: 0010. Com3: 0008. Com4: 0000.
M2 rappresenta la memoria del sistema P ed è connessa al BUS che presenta l'id 04 (pari all'identificativo della memoria stessa). Ponendo Com2 a 0010, equivale ad allocare 10Kbyte di RAM, mentre porre Com3 a 0008 equivale ad allocare 8 Kbyte di ROM.
Il primo byte di RAM è allocato all'indirizzo 8000, mentre il primo byte di ROM è allocato all'indirizzo 0000.
Le considerazioni, ovviamente, sono del tutto analoghe a quelle della memoria MEM-A
CHIP Name: M68000
Type: CPU. Identif: 05. BUS: 0004.
Addres 1:
Com1: 0000. Com2: 0000. Com3: 0000. Com4: 0000.
M68000 rappresenta
CHIP Name: TERMINAL
Type: Device. Identif: 07. BUS: 0001.
Addres 1:
Com1: 0002. Com2: 0001. Com3: 0002. Com4: 0000.
Figura - Schema del terminale
ASIM mette a disposizione, come dispositivo base per realizzare l'I/O da e per un sistema, un dispositivo da utilizzare, appunto, come terminale video- tastiera denominato TERMINAL.
Nel nostro caso tale dispositivo è
configurato come segue: Alla porta Com1 abbiamo connesso
CHIP Name: M6821PIA
Type: Device. Identif: 09. BUS: 0004.
Addres 1:
Com1: 0005. Com2: 0005. Com3: 0000. Com4: 0208.
Figura - Configurazione della PIA
Il dispositivo PIA (Periferal Interface Adapter) è un dispositivo parallelo, a parallelismo 8 bit, facente parte della famiglia dei processori Motorola 68xx. Il dispositivo contiene due sezioni quasi identiche, ciascuna dotata di 8 bit dati configurabili, anche singolarmente, come linee di ingresso o di uscita. Ciascun porto può, quindi, funzionare in ingresso, uscita o in configurazione mista (in-out). L'utilizzo tipico previsto è quello di controllore di una periferica con comunicazione full duplex e con possibilità di controllare le operazioni di I/O mediante interruzioni e schemi di handshaking preconfigurati. Due coppie di linee di controllo sono utilizzate per gestire l'handshaking per la sincronizzazione della periferica connessa al dispositivo. Di queste, CA1 e CB1, in ingresso al dispositivo, acquisiscono eventi dalle periferiche e controllano la linea di interruzione IRQA e IRQB verso il processore; le altre due linee, CA2 e CB2, possono essere programmate per operare come segnali in ingresso (in tal caso si comportano in modo analogo alla CA1 e CB1) sia in uscita per implementare forme di handshaking. Il controllo delle operazioni realizzabili con le due linee è programmato, come di seguito mostrato, mediante i campi del registro di controllo.
Nel
nostro caso è stata posta a 0005
Figura 11
Figura - Possibili connessioni della PIA
CHIP Name: M6821PIA
Type: Device. Identif: 08. BUS: 0001.
Addres 1:
Com1: 0002. Com2: 0000. Com3: 0000. Com4: 0209.
Le considerazioni appena introdotte sono del tutto analoghe per questa PIA che presenta l'identificativo pari a 08: in questo caso non risulta più necessario specificare la linea di interruzione relativa a IRQA in quanto i comandi sono catturati tramite il terminale e le sue apposite interruzioni: l'unica PIA che quindi deve notificare al processore che intende eseguire un comando è proprio l'altra PIA ovvero quella che presenta l'identificativo pari a 09. Questo tipo di PIA non ha bisogno di inviare interruzioni al processore.
CHIP Name: I8237DMA
Type: Device. Identif: 0A. BUS: 0004.
Addres 1:
Com1: 0005. Com2: 0004. Com3: 0005. Com4: 0000.
Figura - Schema del DMA
Il dispositivo Direct Memory Access (DMA) è un dispositivo in grado di operare da master di bus, in grado di gestire cicli bus di trasferimento dati ( in sostituzione del processore). Esso viene utilizzato per aumentare le prestazioni di un sistema di calcolo gestendo, in sostituzione del processore ma in modo più efficiente, le operazioni di trasferimento, consentendo, nel contempo, al processore di operare in parallelo. La maggiore efficienza è dovuta al fatto che mentre un processore per eseguire un trasferimento deve eseguire un'istruzione (ad es. un codice di move) attraverso una fase di fetch ed execute, un DMA gestisce il trasferimento utilizzando Hw specializzato appositamente progettato per realizzare tale unica funzione.
Nel nostro caso è stato scelto come CPU master per il trasferimento e come dispositivo per la gestione delle interruzioni il processore con identificativo 0005. La linea di interruzione è stata posta a 0004 e quindi rappresenta la linea 4 di interruzione.
CHIP Name: 1TO4INTGEN
Type: Device. Identif: 0B. BUS: 0004.
Addres 1:
Com1: 0005. Com2: 0000. Com3: 0000. Com4: 0000.
Figura - Configurazione 1TO4Intgen
Il dispositivo 1to4INTGEN è un generatore di interruzioni verso i dispositivi in grado di gestirli (in ASIM processori e PIC). Esso è composto da 5 generatori: un generatore di interruzioni programmabile e quattro timer ed è visto come 20 ($13+1) locazioni consecutive di memoria. Tale dispositivo è impiegato per generare interruzioni ad intervalli di tempo prefissati (mediante la programmazione dei parametri dei timer) o per generare, a programma, i segnali di interruzione verso lo specifico oggetto gestore di interruzioni.
Nel nostro caso è sufficiente un solo timer che ogni secondo generi un'interruzione che attiva il trasferimento del blocco di 256 Byte dal buffer M1 alla memoria M2: tale trasferimento è effettuato tramite l'ausilio del DMA.
CHIP Name: M1
Type: MMU/BUS. Identif: 0D. BUS: 0000.
Addres 1:
Com1: 0004. Com2: 0001. Com3: 0000. Com4: 0000.
M1 rappresenta il buffer di 256 Byte che viene usato dalla cisterna per inserire le informazioni relative al proprio stato. Nel nostro caso abbiamo allocato un solo Kbyte per inserire tutte le informazioni necessarie alla gestione dello stato della cisterna.
Al fine di avere maggiori dettagli circa la disposizione dei vari componenti all'interno del file di configurazione ed esaminare la struttura delle interruzioni, si propone il seguente schema in cui sono indicati anche i vari vettori di interruzione.
Figura - Schema di dettaglio della configurazione
Si analizzano di seguito le varie porzioni di codice motivando di volta in volta le varie scelte che sono state effettuate.
Le istruzioni sono inserite all'interno della memoria a partire dall'indirizzo $8200 della RAM tramite l'istruzione ORG; vengono successivamente definite una serie di valori che verranno successivamente utilizzati.
Innanzitutto si è deciso di configurare il dispositivo PIA come segue: quello che si intendeva realizzare era un sistema che facesse uso della PIA per poter inviare i comandi.
Il dispositivo PIA (Periferal Interface Adapter) è un dispositivo parallelo, a parallelismo 8 bit, facente parte della famiglia dei processori Motorola 68xx. Il dispositivo contiene due sezioni quasi identiche, ciascuna dotata di 8 bit dati configurabili, anche singolarmente, come linee di ingresso o di uscita. Ciascun porto può, quindi, funzionare in ingresso, uscita o in configurazione mista (in-out). L'utilizzo tipico previsto è quello di controllore di una periferica con comunicazione full duplex e con possibilità di controllare le operazioni di I/O mediante interruzioni e schemi di handshaking preconfigurati.
Due coppie di linee di controllo sono
utilizzate per gestire l'handshaking per la sincronizzazione della periferica
connessa al dispositivo. Di queste, CA1 e CB1, in ingresso al dispositivo,
acquisiscono eventi dalle periferiche e controllano la linea di interruzione
IRQA e IRQB verso il processore; le altre due linee, CA2 e CB2, possono essere
programmate per operare come segnali in ingresso (in tal caso si comportano in
modo analogo alla CA1 e CB1) sia in uscita per implementare forme di
handshaking. Il controllo delle operazioni realizzabili con le due linee è
programmato mediante i campi del registro di controllo; si ricorda che nella
configurazione del sistema che si intende realizzare si è connessa
Figura - Configurazione porti PIA
Il dispositivo PIA simulato in ASIM è derivato da quello commerciale MC6821 di cui ne conserva quasi tutte le caratteristiche funzionali e architetturali. In particolare, la struttura dei sei registri interni (3 per la sezione A e 3 per quella B) ad otto bit è la seguente:
. due registri per il trasferimento dei dati da e verso la periferica (PRA e PRB)
. due registri di controllo/stato (CRA e CRB)
. due registri, DRA e DRB, per il controllo della direzione dei dati (in input o in output)
Poiché il dispositivo impiega per la selezione dei registri interni solo quattro indirizzi, per accedere a tali registri è utilizzato il meccanismo di indirizzamento indiretto per tramite di campi del registro controllo che vanno opportunamente settati prima dell'accesso.
Figura - Indirizzamento dei registri interni
Per quanto concerne invece
Uno dei requisiti del progetto consiste nel fare in modo che le due USART funzionino utilizzando una connessione asincrona e che utilizzino il protocollo di handshaking. Il modo di funzionamento asincrono è realizzato ponendo ad 1 l'ultimo bit del registro mode, che rappresenta il registro che per primo si accede dopo che il dispositivo è stato acceso.
Per quanto concerne invece l'handshake dobbiamo intervenire sul registro CNTRL e attivare sia il DTR che lo RTS. La seguente figura mostra una connessione piena tra i due dispositivi utilizzati.
Figura - Schema delle connessioni della USART
Lo schema dei segnali in gioco, invece, è il seguente:
Figura - Segnali scambiati tra le USART
Se la connessione fosse stata parziale avremmo avuto una situazione, come quella riportata nella seguente figura.
Figura - Connessione parziale
Nel nostro caso abbiamo chiaramente utilizzato una connessione completa piuttosto che una connessione parziale, dal momento che dovevamo fare uso dell'handshaking, servendoci quindi degli appositi segnali, e interfacciare due dispositivi gemelli l'uno con l'altro.
Per quanto concerne, infine, il terminale si è deciso di configurare tale dispositivo come segue:
Una volta che tutti i dispositivo sono stati inizializzati, creiamo un ciclo infinito all'interno del quale il processore, in polling, verifica se è stato trasmesso un carattere all'interno della seriale. Questo tipo di tecnica è stato utilizzato in quanto il sistema C, a parte che inviare comandi, deve principalmente occuparsi della visualizzazione dello stato che consiste nell'output a terminale di 256 caratteri. Dal momento che l'invio di un solo carattere di comando impegna una porzione di tempo estremamente più piccola rispetto alla ricezione di 256 caratteri si è pensato di fare uso della tecnica di polling della usart piuttosto che della tecnica che prevedeva l'utilizzo delle interruzioni. Il codice è riportato di seguito.
È stata prevista la
visualizzazione di un carattere speciale (#) nel caso
Una volta che si riscontra la trasmissione di un carattere si provvede a visualizzare a schermo tale carattere.
Si analizzano ora le ISR relative alle uniche due interruzioni previste all'interno del sistema C: la digitazione di un tasto enter per l'invio di un carattere dal sistema C al sistema P e la gestione del riempimento totale del buffer di tastiera.
Dopo aver salvato le variabili che verranno sporcate dalla ISR si passa all'analisi del carattere che si intende trasmettere. Il carattere analizzato è solamente il primo: tutti gli altri caratteri eventualmente inseriti all'interno del buffer della tastiera verranno ignorati. Se il carattere trasmesso corrisponde ad S verrà inviato alla USART del sistema P che provvederà all'invio dello stato, altrimenti se è un carattere compreso in senso largo tra i numeri 0 e 4, si invierà tale comando alla PIA che provvederà a modificare il livello del liquido della cisterna.
Al termine della ISR, devono essere ripristinati tutti i valori dei registri utilizzati che erano stati precedentemente salvati all'interno dello stack supervisore.
Per quanto concerne, invece, l'ISR relativa al buffer full, è stata prevista semplicemente la pulizia dello schermo, in quanto si suppone un eventuale errore da parte dell'utente: quest'ultimo dovrebbe essere in grado di inviare unicamente un carattere per la visualizzazione dello stato oppure per il controllo del livello del liquido. Il codice è riportato di seguito.
Con il seguente codice si termina il listato del programma.
All'interno del sistema P inseriamo la definizione delle seguenti variabili: contrariamente al caso del sistema C è necessario definire altri valori per il corretto funzionamento del sistema. L'aggiunta di questa informazioni rende maggiormente parametrico il codice scritto.
PIA e USART sono state configurate allo stesso modo del sistema C e, quindi, per brevità non verranno riportate: le considerazioni per entrambi i sistemi sono esattamente identiche.
Piuttosto è necessario analizzare il contatore che ogni secondo scatta e avvia il trasferimento tramite DMA delle informazioni.
Passiamo ora all'analisi del contatore che, come introdotto all'interno delle specifiche, dovrebbe scattare ogni secondo per consentire alla DMA di trasferire le informazioni presenti nel buffer M1 alla memoria M2.
Le frequenze che possono essere settate all'interno di un Motorola 68000 sono 6Mhz, 8MHz, 10MHz, 12.5MHz, 16,67MHz e 25MHz. Dal momento che anche utilizzando la frequenza più bassa possibile, ovvero 6 MHz, dovremmo attendere un tempo estremamente lungo prima che il contatore scatti in fase di simulazione, si è deciso di porlo per brevità a 0x2710 colpi di clock che corrispondono a 10000 colpi di clock: questo tipo di scelta ipotizza una DMA che trasmette ogni secondo avendo, in teoria, un clock con una frequenza di 10KHz. In fase di configurazione il timer scatta per la prima volta dopo 10 colpi di clock per avviare il primo trasferimento del blocco ed inizializzare la memoria M2.
Una volta che tutti i dispositivi sono stati configurati è stato inserito del codice tramite il quale il processore si pone in attesa indefinita, all'interno di un ciclo, di eventuali interruzioni.
Due interruzioni si occupano della gestione del timer. La prima scatta al termine della configurazione del timer, mentre la seconda scatta una volta che il contatore si sia azzerato.
Una volta che il contatore si è azzerato, come di consueto si salvano i registri che verranno sporcati e prima che vengono utilizzati si puliscono tramite le operazioni SUBA: si usa questa istruzione dal momento che non può essere utilizzata l'istruzione CLR.
Al termine di
questa operazione si effettua una pulizia del registro D6: tale registro viene
posto ad 1 se
Una volta
effettuate queste operazioni si inizializza
È importante a
questo punto analizzare il comportamento dell'interruzione che genera
L'interruzione è quella relativa alla linea 4 e verifica innanzitutto se si tratta del primo blocco o del secondo ad essere stato appena trasferito: se D6 è posto a zero vuol dire che è stato trasferito il primo blocco; se invece D6 è posto ad 1 vuol dire che è stato trasferito il secondo blocco e quindi termina. Altrimenti dopo aver resettato il DMA trasla l'indirizzo di partenza del primo blocco e passa al trasferimento del secondo blocco.
È importante analizzare adesso il comportamento della USART: questo dispositivo, presente all'interno del sistema P provvede all'invio dei 256 caratteri inseriti all'interno del blocco dello stato presente nella memoria M2.
Una volta che tutti i registri siano stati opportunamente salvati e ripuliti, si verifica che il carattere ricevuto sia effettivamente uguale ad S: in realtà questo controllo potrebbe anche essere evitato, dal momento che è previsto un controllo già dal lato del sistema P, ma essendo questa solamente una simulazione è comunque opportuno prevedere dei controlli più robusti.
Una volta che sia
stato accertato che il carattere corrisponde effettivamente ad S si attende che
il semaforo, eventualmente impegnato dalla DMA sia libero. Questo è possibile
tramite il codice operativo TAS che non appena verifica che la variabile
risulta libera occupa il semaforo, impossibilitando di fatto
Ovviamente, una volta che sono state trasmessi tutti i 256 caratteri si provvede alla liberazione del semaforo occupato e al ripristino dei valori dei registri che sono stati sporcati dall'utilizzo della ISR.
È importante a questo punto, prima di mostrare come siano stati codificati i comandi, come siano state codificate le informazioni relative a stato pressione e temperatura all'interno del sistema.
I possibili valori dello stato vanno da 0000 (rappresentazione tramite 4 caratteri) a 1000. 1000 indica che la cisterna è piena mentre 0000 indica che la cisterna è vuota; come era intuibile.
Il terminale si occupa della visualizzazione di tutto lo stato come mostrato nella seguente Figura.
Figura - Informazioni sullo stato del sistema
Come è possibile osservare in Figura 20 tutte le informazioni rilevanti sono contenute nella memoria a partire dalla locazione $3000 impegnando 26 caratteri in totale: i restanti caratteri non sono stati utilizzati e per questo è stato posto un carattere convenzionale "*".
Dopo la visualizzazione del carattere %, sono previsti, come già accennato 4 caratteri per contenere l'informazioni circa il livello del liquido, altri 6+2(cifre prima virgola + cifre dopo virgola) caratteri per il controllo della pressione (misurata in Pascal) e altri 1+3+2(segno + cifre prima virgola + cifre dopo virgola) per il controllo della temperatura misurata in Kelvin.
Di default il
valore del livello corrisponde a 0000, la pressione risulta essere pari a 0
Pascal e la temperatura è a 273,15K ovvero
Di seguito, invece,
è riportato il codice che utilizza
Innanzitutto
Il comando zero ed il comando 1 si occupano rispettivamente di aumentare di 1 il livello del liquido e di diminuire di 1 il livello dello stesso.
Partendo dalle posizioni della memoria in cui sono inseriti i 4 caratteri relativi allo stato effettuano l'operazione prescelta. Vengono in particolare effettuate delle chiamate alle subroutineADDLEVEL e REMLEVEL riportate di seguito.
Queste subroutine hanno il compito di verificare il livello del liquido e nel caso che la cisterna sia piena, impedire l'aggiunta di un nuovo livello, mentre nel caso in cui il livello sia pari a 0 impedire il prelevamento di ulteriore liquido. Chiaramente queste subroutine vanno a modificare direttamente la memoria M1: in realtà dovrebbero inviare comandi alla cisterna: attualmente, in fase di simulazione, ci si accontenta della scrittura diretta in memoria.
Il comando 2, invece, riempie la cisterna a metà: se il liquido supera 500 viene riportato a questo livello tramite la rimozione di liquido, se invece è inferiore a 500 viene inserito. Al fine di prendere quanto più velocemente possibile la decisione se inserire o aumentare il liquido, sono stati previsti una serie di controlli circa l'individuazione del livello della cisterna.
Tramite un parsing dei vari caratteri inseriti, che rappresentano appunto il livello del liquido, si cerca di capire quanto più velocemente possibile quale tipo di operazione effettuare.
Per quanto riguarda il parsing dei 4 caratteri si parte da sinistra verso destra per capire in tempi brevi se il livello sia sopra o sotto le 500 unità.
Il comando 3 ed il comando 4, infine, provvedono rispettivamente a svuotare la cisterna e a riempire la cisterna, utilizzando le stesse logiche che sono state introdotte in precedenza per gli altri comandi.
Si riportano infine, per completezza, il ripristino dei registri della ISR della PIA e il comando che chiude il codice del sistema P.
Di seguito sono riportati alcuni esempi di funzionamento dell'applicazione che è stata creata.
Figura - Caricamento della memoria M1
Questo primo screenshot, riportato in Figura 21, rappresenta una delle primissime fasi di configurazione del sistema: quella in cui deve essere inizializzato il contenuto della memoria M1.
Figura - Richiesta di visualizzazione dello stato
Lo screenshot riportato in Figura 22 rappresenta la richiesta di visualizzazione dello stato: siccome sono state caricate le informazioni provenienti dalla memoria M1 alla memoria M2 e siccome sono quelli corrispondenti ai dati inseriti in fase di inizializzazione del sistema, verrà visualizzato un livello del liquido pari a zero.
Figura - Inviato comando 'Riempi cisterna a metà (2)'
In Figura 23, invece, è riportato il caso in cui viene inviato il comando di riempire la cisterna a metà. Come è possibile osservare dalla figura, le informazioni sono modificate solamente all'interno della memoria M1, mentre quelle contenute all'interno della memoria M2 rimangono invariate, in quanto attendono che il DMA aggiorni questo tipo di dato.
Figura - Inviato comando 'Svuota cisterna (3)'
In Figura 24, infine è riportato uno screenshot che rappresenta il
caso in cui venga richiesto alla cisterna di svuotare tutto il liquido. Come è
possibile osservare osservando la figura, ed in particolare lo stato della
memoria M2, la cisterna partiva dal caso in cui aveva raggiungo il livello "
Appunti su: |
|
Appunti Silvicoltura | |
Tesine Automobile | |
Lezioni Aeronautica | |