|
 |
Procedure Seriali |
TxD_RD - Trasmettitore vuoto 1/2
[205 di 403] |
- Gestione della
Trasmissione Dati con la Tecnica dell'Interruzione |
|
6.1
Procedura ServInt0C:
sottoservizio
TxD_RD
per
Trasmettitore vuoto [1 di
2] |
 |
Bisogna aver ben presente che il sottoservizio
TxD_RD di
ServInt0C
verrà eseguito dal processore in
risposta alla richiesta d'Interruzione generata dall'UART quando è
pronto ad
accettare nuovi caratteri da spedire sulla linea seriale, cioè non
appena si accorge di avere vuoto il suo
Registro
di Trasmissione [port_8] (con UART
8250/16450 o con UART
16550A, se il
FIFO
è disabilitato) oppure
vuoto il suo
FIFO in Trasmissione. |
 |
La gestione
TxD_RD
della
Trasmissione dati
via seriale con tecnica di interruzione è piuttosto
impegnativa
e sostanzialmente non
necessaria: la tecnica di
polling, che interroga il
bit5
del
Registro
di Stato della Linea
[port_D]
per stabilire il momento giusto per
trasmettere, è semplice
e altrettanto affidabile. |
 |
La tecnica d'interruzione
evita al processore la perdita di tempo
in attesa che il bit5 passi a
1 logico, proprio la situazione che si manifesta nelle
condizioni,
appena descritte, di buffer UART vuoti. |
 | Tuttavia, poichè è il processore stesso che si occupa di
prelevare i dati dai registri di trasmissione, essi
saranno di nuovo vuoti in pochi istanti e il tempo
consumato in attesa è sempre molto limitato,
rendendo la tecnica in polling comunque
competitiva (per la sua semplicità). |
 |
Un vantaggio della tecnica d'interruzione è quello di rendere
possibile la disponibilità un
ulteriore
Buffer di Trasmissione esterno, in aggiunta al
FIFO e al Registro di
Trasmissione
[port_8] garantiti dall'UART,
meno necessario rispetto all'analoga struttura in Ricezione,
ma certamente utile,
sebbene complichi non poco il sottoservizio
TxD_RD in risposta all'IRQ. |
 | Per la sua gestione sono previsti 2 puntatori,
il cui
valore corrente è
relativo alla
prima
locazione del Buffer stesso,
identificata dall'etichetta TxD_Buf; all'inizio
vale 0000H per entrambi ed è comunque
compreso tra 0 e
255, conservato in altrettante variabili word:
 |
[TxDBufRD]: puntatore al
primo carattere da rimuovere dal
Buffer; dopo ogni lettura (operata
dal sottoservizio
TxD_RD di
ServInt0C) viene
incrementato di una
posizione |
 |
[TxDBufWR]: puntatore alla
prima posizione libera del Buffer, cioè a quella
in cui verrà collocato il dato
da trasmettere; dopo che il dato è stato
collocato nel
Buffer (scrittura operata dalla
procedura TxD_Int,
descritta nel paragrafo seguente) viene incrementato di una posizione |
|
 |
Ricavato direttamente in RAM esso può avere
dimensione grande a piacere; il
nostro progetto
riserva a questo scopo
258
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 [TxDBufWR] supera [TxDBufRD]
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
|