Domanda:
A cosa serve l'interrupt TX UART?
user129900
2016-11-22 03:29:16 UTC
view on stackexchange narkive permalink

So che l'interrupt RX è ovviamente usato per salvare il polling, ma perché anche quello TX?

Stessa ragione.Spesso invii un lungo messaggio a un personaggio alla volta.
Il codice che deve fare ben poco altro può bloccare la trasmissione effettiva.Un codice più efficiente può svuotare un buffer software nell'interrupt.Un codice ancora più sofisticato sull'hardware che lo supporta può configurare un motore DMA per pompare il trasferimento senza distrarre la CPU da un lavoro più importante, sebbene le velocità di trasmissione seriali siano spesso piuttosto lente in termini di MCU, ciò potrebbe non essere sempre importante.
Se stai chiedendo un interrupt TX UART su un particolare tipo di dispositivo, inserisci un collegamento alla sua scheda tecnica.
L'interrupt che altri hanno menzionato segnala che c'è spazio buffer disponibile nell'uart per più dati di trasmissione.Il buffer può essere uno o più byte di lunghezza a seconda dell'hardware uart.C'è spesso un diverso interrupt "trasferimento completo" che segnala che tutti i bit sono stati spostati fuori dall'uart.Questo può essere utilizzato per altri scopi come la commutazione di un ricetrasmettitore dalla trasmissione alla ricezione.
Cinque risposte:
DPF
2016-11-22 03:38:34 UTC
view on stackexchange narkive permalink

L'interrupt TX è principalmente per datagrammi più lunghi.È possibile avviare il trasferimento per un buffer di lunghezza nota (bytecount).Ora puoi spingere il puntatore del buffer tutte le volte che ci sono byte da inviare, quando si verifica l'interrupt TX.Ciò garantisce il trasferimento "il più veloce possibile" del buffer, senza la necessità di eseguire il polling di alcun "TransferComplete" -Flag / Statusbit.

Dirceu Rodrigues Jr
2016-11-22 03:50:28 UTC
view on stackexchange narkive permalink

L'obiettivo principale dell'interrupt TX (in realtà un END OF TX) è inviare automaticamente il contenuto di un buffer (più byte).Se implementato in modo corretto:

  1. Abilita l'interruzione TX.
  2. Il codice utente inizia la trasmissione inviando solo il primo byte nel buffer.
  3. Alla fine di TX (del primo byte), verrà generato un interrupt.
  4. In TX ISR (Interrupt Service Routine), il codice deve inviare il byte successivo nel buffer e aggiornare l'indice del buffer.
  5. Alla fine di questa trasmissione, si verifica una nuova interruzione, e così via, finché l'intero contenuto del buffer non viene inviato "automaticamente".
  6. Disabilita l'interruzione TX.

Il comportamento esatto dipende dal microcontrollore.Questa è una descrizione generale.

Una facile semplificazione su molte piattaforme è che il codice utente sia semplicemente responsabile di mettere i dati nel buffer e abilitare l'interrupt;l'ISR disabilita l'interrupt se si attiva quando il buffer è asciutto.
Surt
2016-11-22 05:11:50 UTC
view on stackexchange narkive permalink

Alcuni UART hanno un buffer interno più grande di uno, la serie 16xxx per uno.

La procedura qui era

  1. Imposta una maschera della finestra di trasmissione, ad esempio su 4 rimanenti.
  2. riempire le posizioni del buffer fino a quando l'UART non ha detto che è necessario inviare dati completi o non più
  3. fare altre cose
  4. quando solo 4 posizioni del buffer rimangono inviate, imposta l'interruzione TX
  5. attendere che l'interrupt venga servito
  6. se è necessario inviare più dati, passare a 2.

Ciò riduce il carico della CPU scaricando alcune elaborazioni sull'UART, consentendo così alle CPU più lente di tenere il passo e di eseguire altre attività invece di essere interrotte tutto il tempo.

Simon Richter
2016-11-22 05:29:37 UTC
view on stackexchange narkive permalink

L'interrupt TX si attiva quando c'è spazio nel buffer di trasmissione.

Per i dispositivi che non hanno un buffer di trasmissione (cioè dove scrivi un byte, che viene trasferito immediatamente), l'interrupt viene affermato quando il registro di trasmissione può essere scritto con il byte successivo.

Per i dispositivi con un buffer, l'interrupt viene affermato in un momento definito dall'implementazione.Per alcuni è quando il buffer è mezzo vuoto, per altri è quando è iniziata la trasmissione dell'ultimo byte e il buffer è completamente vuoto.

Rev1.0
2016-11-22 04:20:15 UTC
view on stackexchange narkive permalink

Un altro caso d'uso è quando si collega l'UART a un'altra interfaccia di comunicazione come RS485.Il controller deve rilasciare il driver del bus non appena l'ultimo bit è stato spostato fuori dal buffer TX.Questo è facile da gestire nell'interrupt TX, ma sarebbe complicato da implementare senza, poiché dovresti aspettare un tempo esatto dopo aver scritto l'ultimo byte nel buffer di output che varierebbe anche con la velocità di trasmissione.

L'utilizzo di RS485 funziona meglio se è disponibile un interrupt di trasmissione completa anziché solo buffer di trasmissione disponibile.Soprattutto su dispositivi con grandi buffer, l'unico modo per ottenere un interrupt dopo che l'ultimo byte utile è stato inviato è alimentare i byte aggiuntivi indesiderati dell'UART e sperare che si possa disabilitare la trasmissione prima che si spengano.
@supercat: Hai davvero ragione a sottolineare che ciò richiederebbe un'interruzione Tx ** completa **.Ma penso che questo si riferisca ancora alla domanda.
Spesso è possibile cavarsela solo con un interrupt disponibile nel buffer, ma l'interrupt tx complete è spesso migliore;Stavo pensando che potrebbe essere utile amplificare il motivo per cui alcuni UART hanno interrupt separati per il buffer-ready e la trasmissione completa.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...