|
 |
Procedure Seriali |
RxD_RD - Dato pronto 1/2
[210 di 403] |
- Gestione della
Ricezione Dati con la Tecnica dell'Interruzione |
|
7.1
Procedura ServInt0C:
sottoservizio
RxD_WR per
Dato ricevuto pronto [1 di
2] |
 |
Bisogna aver ben presente che il sottoservizio
RxD_WR di
ServInt0C
verrà eseguito dal processore in
risposta alla richiesta d'Interruzione generata dall'UART
quando ha ricevuto un nuovo
carattere dalla linea seriale, cioè non
appena si accorge di avere
pieno il suo
Registro
di Ricezione [port_8]
(con UART
8250/16450
o con UART
16550A, se il
FIFO in Ricezione
è disabilitato) oppure se il numero di bytes ricevuti ha superato quello
massimo (trigger level) previsto per
il FIFO in Ricezione oppure quando il
FIFO contiene bytes
in misura inferiore al massimo ma il tempo concesso a nuovi arrivi è terminato
(timeout). |
 |
La gestione
RxD_WR
della
Ricezione
dati
via seriale con tecnica di interruzione è piuttosto
impegnativa
ma è sicura: nella descrizione
delle procedure di ricezione affidate alla tecnica di
polling ho
più volte
sottolineato che esse sono non del tutto affidabili,
anche se sufficientemente accettabili, con la
consapevolezza dei loro limiti. |
 |
La tecnica in polling obbliga il processore ad interrogare il bit0
del
Registro
di Stato della Linea
[port_D]
per stabilire l'istante in cui il dato è ricevuto; rispetto alla analoga
situazione in trasmissione non si tratta solo di
una perdita di tempo:
nella migliore delle ipotesi se la ricezione dei dati è veloce, il tempo necessario per la verifica del bit di stato,
tra un polling e il successivo, potrebbe essere sufficiente per provocare la
perdita di qualche dato; in aggiunta c'è il rischio (molto frequente) di
vedersi bloccare il computer se il processore dovesse stare in attesa di dati
seriali che non arrivano... |
 |
Affidando la gestione alla tecnica d'interruzione,
il problema non si pone in nessun caso:
nonostante la sua complessità quindi è sempre consigliabile. |
 |
Un altro vantaggio della tecnica d'interruzione è quello di rendere
possibile la disponibilità un
ulteriore
Buffer di Ricezione esterno, in aggiunta al
FIFO e al Registro
di Ricezione
[port_8] garantiti dall'UART: sebbene complichi non poco il sottoservizio
RxD_WR in risposta all'IRQ
esso è sostanzialmente indispensabile rispetto all'analoga struttura in
Trasmissione. |
 | Per la sua gestione sono previsti 2 puntatori,
il cui
valore corrente è
relativo alla
prima
locazione del Buffer stesso,
identificata dall'etichetta RxD_Buf; all'inizio
vale 0000H per entrambi ed è comunque
compreso tra 0 e
255, conservato in altrettante variabili word:
 |
[RxDBufRD]: puntatore al
primo carattere da rimuovere dal
Buffer; dopo ogni lettura (operata dalla
procedura
RxD_Int, descritta nel paragrafo seguente) viene
incrementato di una
posizione |
 |
[RxDBufWR]: puntatore alla
prima posizione libera del Buffer, cioè a quella
in cui verrà collocato il dato
pronto dopo la sua ricezione;
dopo che il dato è stato collocato nel Buffer (scrittura operata
dal sottoservizio
RxD_WR di
ServInt0C) viene incrementato di una
posizione |
|
 |
Ricavato direttamente in RAM esso può avere
dimensione grande a piacere, ma ho dimostrato sperimentalmente che, se troppo
piccolo, può generare fastidiose perdite di dati; il
nostro progetto
riserva a questo scopo
1024
bytes, nella zona delle variabili,
all'inizio del sorgente ASM:
|
 |
La struttura di quest'area
di memoria è quella classica di un Buffer
circolare:
 |
se i 2 puntatori sono uguali tra loro allora il Buffer
è vuoto |
 |
se [RxDBufWR] supera [RxDBufRD]
di un byte allora è pieno |
 |
se, dopo l'incremento di una posizione, i puntatori superano la dimensione
del Buffer
sono reinizializzati a 0000H, per ritornare a puntare la sua locazione
iniziale, garantendo la circolarità del Buffer |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|