Avanti Indietro Indice

15. Cosa sono le UART? In che modo influenzano le prestazioni?

15.1 Introduzione alle UART

(Questa sezione è anche nel Serial-HOWTO)

UART (Universal Asynchronous Receiver Transmitter) - ricevitore/trasmettitore asincrono universale - sono chip seriali sulla scheda madre del vostro PC (o su una scheda modem interna). La funzione della UART può anche essere svolta da un chip che fa anche altre cose. Sui computer più vecchi come la maggior parte dei 486, i chip erano sulla scheda del controller I/O. Alcuni computer più vecchi hanno schede seriali dedicate.

Scopo della UART è convertire i byte dal bus parallelo del PC in un flusso seriale di bit. Il cavo che esce dalla porta seriale è seriale ed ha solo un cavo per ogni direzione di flusso. La porta seriale invia un flusso di bit, un bit alla volta. Al contrario, il flusso di bit che entra dalla porta seriale via cavo esterno viene convertito in byte paralleli che il computer può comprendere. Le UART trattano dati divisi in pezzi della dimensione di un byte, che per convenienza è anche la dimensione dei caratteri ASCII.

Diciamo che avete un terminale collegato al vostro PC. Quando digitate un carattere, il terminale consegna quel carattere al proprio trasmettitore (che è anche una UART). Il trasmettitore invia quel byte alla linea seriale, un bit alla volta ad una velocità specifica. Dalla parte del PC, l'UART ricevente prende tutti i bit e ricostruisce (parallelizza) il byte e lo mette in un buffer.

Oltre alla conversione tra seriale e parallelo, la UART esegue alcune altre cose come derivazione (effetto collaterale) dei suoi compiti primari. Il voltaggio usato per rappresentare i bit viene anch'esso convertito (cambiato). I bit extra (chiamati bit di start e stop) sono aggiunti ad ogni byte prima che venga trasmesso. Vedere la sezione "Voltage Waveshapes" del Serial HOWTO per dettagli. Inoltre, mentre il rapporto di flusso (in byte per secondo) sul bus parallelo all'interno del computer è molto alto, il rapporto di flusso in uscita dalla UART dalla parte della porta seriale è molto più basso. L'UART ha un elenco fisso di rapporti (velocità) che può usare come interfaccia per la sua porta seriale.

15.2 Due tipi di UART

Ci sono due tipi principali di UART: UART "stupide" (dumb) e UART FIFO. Le UART "stupide" sono le 8250, 16450, le prime 16550 e le prime 16650. Esse sono obsolete ma se imparate come lavorano, è poi facile comprendere come funzionano le moderne UART FIFO (le ultime 16550, 16550A, 16c552, le ultime 16650 e 16750 e 16C950).

Esiste un poco di confusione per quanto riguarda le 16550. I primi modelli avevano un bug e lavoravano correttamente solo come 16450 (non FIFO). I modelli più recenti con questo bug corretto, vennero chiamate 16550A, ma la maggior parte dei costruttori non fecero proprio il cambiamento di nome e continuarono a chiamarle 16550.

La maggior parte delle 16550 in uso oggi sono come le 16550A. Linux la rileverà come 16550A anche se il manuale dell'hardware (o l'etichetta) dicono che si tratta di una 16550. Una situazione simile esiste per le 16650 (solo che è peggio visto che il costruttore sembra che non ammetta che c'è qualcosa di sbagliato). Linux rileverà un'ultima 16650 come una 16650V2. Se esso la rileva come una 16650 ci sono cattive notizio e verrà usata come se avesse un buffer da un byte.

15.3 FIFO

Per comprendere la differenza tra "stupide" (dumb) e FIFO (First In, First Out - Il primo che entra è il primo che esce) esaminiamo prima cosa succede quando una UART ha inviato o trasmesso un bute. La UART stessa non può fare nulla con i dati che passano attraverso di essa, semplicemente li riceve e li spedisce. Nella UART "stupide" originali, la CPU riceveva un interrupt dal driver seriale ogniqualvolta un byte veniva ricevuto o trasmesso. La CPU poi spostava il byte ricevuto dal buffer della UART in una qualche parte della memoria, oppure dava alla UART un altro byte da spedire. Le UART 8250 e 16450 hanno un buffer di 1 byte. Ciò significa che ogni volta che 1 byte viene inviato o ricevuto, la CPU riceveva un interrupt. A basse velocità di trasferimento, questo andava bene. Ma ad alte velocità di trasferimento la CPU diventava così impegnata a gestire la UART, che non aveva il tempo per soddisfare adeguatamete gli altri compiti. In alcuni casi, la CPU non era pronta a servire le richieste di interrupt in tempo ed il byte era sovrascritto perché arrivava troppo velocemente. Questo viene chiamato "overrun" o "overflow" (sovraccarico).

Ecco dove le UART FIFO sono utili. I chip delle 16550A (o 16550) hanno un buffer FIFO di 16 byte. Questo significa che può ricevere fino a 14 byte (od inviarne 16) prima che debba inviare un interrupt alla CPU. Non solo essa può attendere ulteriori byte, ma la CPU può poi trasferirli tutti e 14 (o più) in un colpo solo. Questo è un vantaggio significativo rispetto alle altre UART, cha hanno buffer di 1 solo byte. La CPU riceve meno interrupt ed è libera di fare altre cose. I dati non sono sono persi e tutti sono contenti. Notate che la soglia di interrupt dei buffer FIFO (livello di attivazione) può essere impostata a meno di 14. 1, 4 e 8 sono altro possibili scelte.

Mentre la maggior parte dei PC hanno delle 16550 con 16 byte di buffer, le UART migliori hanno buffer ancora più grandi. Notate che l'interrupt viene inviato leggermente prima che il buffer si riempia del tutto (diciamo ad un "trigger level" di 14 byte per un buffer da 16 byte). Questo consente di fare spazio a qualche alto byte da ricevere durante il tempo che trascorre mentre la richiesta di interrupt viene esaudita. Il trigger level può essere impostato a diversi valori consentiti dal software kernel. Il trigger level di 1 sarà quasi come una UART "stupida" (a parte il fatto che comunque ha ancora spazio per altri 15 byte prima che venga inviato l'interrupt).

Se digitate qualcosa mentre state visitando una BBS, i caratteri che digitate escono attraverso la porta seriale. I vostri caratteri digitati che si vedono sullo schermo sono quelli che sono stati riecheggiati dalla linea telefonica attraverso il vostro modem, quindi attraverso la vostra porta seriale verso lo schermo. Se si ha un buffer a 16 byte sulla porta seriale che trattiene i caratteri fino a che ne ha 14, dovrete digitare parecchi caratteri prima di poter vedere quello che avete digitato in precedenza. (prima che essi appaiono sullo schermo). Questo può creare confusione ma esiste un "timeout" per prevenire ciò. Quindi normalmente si vede un carattere sullo schermo non appena lo si digita.

Il "timeout" lavora in questo modo per il buffer della UART che riceve: se i caratteri arrivano uno di seguito all'altro, allora una richiesta di interrupt viene inviata solo quando il 14° carattere raggiunge il buffer. Ma se un carattere arriva ed il successivo non arriva subito dopo, viene richiesto un interrupt. Questo succede anche se non ci sono 14 caratteri nel buffer (potrebbe anche essercene solo uno). Quindi quando quello che si digita passa attraverso questo buffer, esso si comporta come un buffer da 1 byte anche se in realtà è un buffer da 16 byte (a meno che la velocità di battitura non sia centinaia di volte superiore al normale). Vi è un timeout anche per il buffer di trasmissione.

15.4 Numeri di modello di UART

Ecco un elenco di UART. TL è il Trigger Level

Quelle obsolete vanno bene solo per modem non superiori a 14.4.k (DTE con velocità fino a 38400 bps). Per i modem moderni occorre almeno una 16550 (e non una delle prime 16550). I modem V.90 56k potrebbero essere percentualmente di molto piu' veloci con una 16650 (specialmente se si scaricano file non compressi). Il vantaggio principale della 16650 è la maggiore dimensione del suo buffer visto che una velocità extra non è necessaria a meno che il rapporto di compressione del modem sia alto. Alcuni modem interni a 56k potrebbero essere provvisti di una 16550 ??

Schede multiporta intelligenti e senza UART usano chip DSP per il buffering e il controllo addizionale, liberando la CPU ancora di più. Ad esempio, le schede Cyclades Cyclom e Stallion EasyIO usano una Cirrus Logic CD1400 RISC UART, e molte schede usano CPU 80186 od anche CPU RISC speciali per gestire l'IO seriale.

La maggioranza dei PC più nuovi (486, Pentium o superiori) hanno una 16550A (generalmente chiamata solo 16550). Se avete un qualcosa di veramente vecchio il chip può essere scollegato in modo che ci si possa aggiornare acquistando un chip 16550A rimpiazzando la UART 16450 esistente. Se le funzionalità sono state immesse in un altro tipo di chip, allora siete sfortunati. Se la UART è agganciata ad incastro, allora l'aggiornamento è facile (se siete in grado di trovare un rimpiazzo). Le nuove e le vecchie hanno i pin compatibili. Potrebbe essere più praticabile acquistare semplicemente una nuova scheda seriale su Internet (alcuni negozi al dettaglio ne hanno a disposizione oggi).


Avanti Indietro Indice