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!