UART Polling vs Interrupt

5

Tengo dos puertos UART en un MSP430 que necesitan transmitir datos entre un Controlador Host (Freescale IMX6) y dispositivos potenciales que se pueden conectar al otro lado. El controlador del host comunica (lee / escribe) los datos con MSP430 (incluidos los datos en serie de los dispositivos) a través de un bus I2C.

IMX6 --writes I2C--> MSP430 --writes 'UART'0--> Device 0
IMX6 <---reads I2C-- MSP430 <---reads 'UART'0-- Device 0

IMX6 --writes I2C--> MSP430 --writes 'UART'1--> Device 1
IMX6 <---reads I2C-- MSP430 <---reads 'UART'1-- Device 1

Actualmente, UART recibe está basado en interrupciones en el MSP430 . Cuando entra un byte, interrumpe el MSP y lo lanza en un búfer de anillo.

UART escribe, por otro lado, se basan en encuestas. En mi bucle principal, tengo un proceso UART _ que se ejecuta. En ese proceso, compruebo si el búfer de un solo byte de hardware UART TX está listo para un byte. Si es así, escribo un nuevo byte, el conjunto de la transferencia y salgo de la función. Con esta funcionalidad, podría ser (por ejemplo) 1 milisegundo antes de enviar otro byte al dispositivo UART , aunque el UART de MSP puede haber estado listo para transmitir otro byte mucho antes.

Mi preocupación es que si tengo que administrar 2 UART de los puertos de MSP430 que se ejecutan en 115200 Baud, se escribirá un byte cada 1ms (posiblemente un poco más o menos). suficiente para el dispositivo? La transmisión de la velocidad en baudios todavía estará en 115,200 , obviamente, pero los bytes se transmitirán lentamente. Algunos cálculos rápidos y ásperos:

  • 1 bit @ 115,200 toma aproximadamente 8µs.
  • 1 byte @ 115,200 tomará aproximadamente (8µs * 8bits) = 64µs.

Como puede ver, se puede transmitir un nuevo byte desde el controlador UART , digamos cada 100 µs. Si envío un byte cada 1 ms, no transmitiré al dispositivo muy rápido (alrededor de 1/10) en comparación con la velocidad máxima potencial.

No quiero transmitir UART a través de la interrupción, porque me temo que el 2 UART S con RX y TX basado en la interrupción podría apoderarse de mi CPU. También tengo otras cosas importantes que estoy haciendo en MSP430 . Como aceptar constantemente mensajes I2C a través de interrupciones y manejar un proceso de IR basado en interrupciones de temporizador.

He considerado agregar un planificador de tareas simple. Pero eso no haría mucho para acelerar las cosas porque probablemente ejecutaría el programador de tareas a intervalos de 1 ms. Esto solo garantizaría un UART byte de escritura cada 1 ms (que era lo que estaba proponiendo arriba de todos modos). La otra opción es considerar el uso del DMA con el UART de transmisión. Pero solo quiero explorar estas opciones si tengo que hacerlo.

Según su experiencia, ¿la mayoría de los dispositivos / implementaciones de UART estarán bien con la recepción de bytes a una velocidad lenta en comparación con la velocidad de transmisión? ¿Alguna sugerencia general? Déjame saber si estoy siendo poco claro en algún punto. Gracias!

    
pregunta gtozzi

3 respuestas

2

Sí, la mayoría del software que recibe datos a través de un canal asíncrono es ajeno a la rapidez con la que llegan los datos (hasta el punto en que los tiempos de espera entran en juego). Para el receptor, su situación es comparable a una velocidad en baudios que permite 1char / ms.

    
respondido por el Wouter van Ooijen
3

Las rutinas basadas en interrupciones no tomarán control de la CPU a menos que las dejes.

He escrito muchos controladores de uart MSP430 y la forma de abordar TX es hacer que el ISR envíe los bytes. Active el indicador de interrupción y luego deje que el ISR gestione el envío de los bytes desde un búfer. Necesita un par de variables en la memoria para gestionar esto, pero funciona muy bien.

Recuerde que es usted quien activa el ISR para enviar los datos. Ya sabes cuántos bytes enviar. El ISR es bastante rápido, por lo que no hay ningún control.

Está utilizando el sondeo, que de hecho está consumiendo su tiempo de CPU. No hay razón para esto. Las interrupciones no deben ser temidas, deben dominarse.

No mencionó el MSP430 que está utilizando, pero he estado ejecutando muchos diseños basados en MSP430 con múltiples interfaces y nunca tuve problemas con las interrupciones al cargar la CPU. De hecho, los clientes han estado exentos de los problemas que tenían antes debido a las encuestas y otras cosas que desaparecieron cuando los volví a archivar.

Usted mencionó RTOS. Dependiendo de la MSP430, esto podría no ser práctico, y usted no lo necesita. Un RTOS no resolverá este tipo de problemas.

    
respondido por el Gustavo Litovsky
2

A menudo uso el sondeo para la transmisión y las interrupciones para la recepción; si ese enfoque es adecuado dependerá de qué tipo de búfer tiene el UART y de cómo se compara su tasa de sondeo con la tasa a la que realmente necesita enviar datos.

Algunos chips tienen un UART que requiere que un byte se transmita completamente antes de que el código pueda cargar el siguiente byte. La mayoría de los chips permiten que el procesador cargue al menos un byte además del que está siendo eliminado. Algunos pueden permitir que el procesador cargue 16 bytes o incluso más.

Si su puerto está configurado para 115,200 baudios, su UART puede almacenar un carácter más el que se está transmitiendo, y su intervalo de sondeo es 100us, entonces probablemente podrá transmitir casi pero no completamente, ya que en algunas ocasiones encuestará cuando el UART casi haya terminado de transmitir un byte, cargará un byte y ese byte terminará siendo enviado completamente antes de su próxima operación de sondeo. Si su intervalo de sondeo es mucho más largo que 100us y el chip es como se describe, es probable que pueda enviar dos caracteres por intervalo de sondeo; si eso es adecuado dependerá de su aplicación.

    
respondido por el supercat

Lea otras preguntas en las etiquetas