Recepción UART + DMA

Cuando aprendí sobre DMA, me di cuenta de que también se puede implementar en las operaciones periféricas de UART. Hasta ahora, he usado periféricos UART para operaciones de comunicación simples. A veces lo uso para proyectos basados ​​en el protocolo Modbus. Dejando de lado los proyectos simples, en los proyectos de protocolo Modbus, proceso constantemente cada byte recibido a través de la interrupción de recepción de UART para realizar más procesos rápidamente o con un retraso mínimo.

Pero DMA explica que puede activar la interrupción de la CPU después de que todo su búfer/la mitad de los búferes se llenen solamente. Además, existe una situación en la que no sé cuántos datos llegan a través de la recepción UART. Si recibo solo 4 bytes, entonces necesito procesarlo. Si se supone que debo recibir 120 bytes para procesar, debo esperar. Entonces aquí la longitud no es constante, al menos en mis requisitos. Pero usar DMA con UART necesita un conteo constante de bytes, que yo sepa. Entonces, dejé caer la idea de usar DMA en proyectos de comunicación basados ​​en Modbus. ¿Es correcto?

Pero el uso de CPU libre de DMA carga más que un método de interrupción regular. Pero, ¿en qué aplicaciones puedo usarlo? ¿En qué aplicaciones el concepto UART + DMA es más adecuado que el método de interrupción UART normal? Si hay algún enlace de aplicación o ejemplos disponibles, será útil.

Verifique si su módulo UART tiene una interrupción de LÍNEA INACTIVA. Esa interrupción se puede usar para detectar el caso extremo en el que hay menos transferencias de DMA que el número requerido para una interrupción de DMA COMPLETA o MEDIO COMPLETA.
Protocolos basados ​​en paquetes donde puede recibir los primeros bytes usando interrupciones hasta que obtenga una longitud que pueda programar en el controlador DMA para obtener el resto. Pero ahorrar carga de CPU solo es realmente útil si necesita usarlo para otra cosa.
@Finbarr Genial "pero" :) La complicación de la implementación por el simple hecho de hacerlo suele ser la fuente principal de errores y dolores de cabeza para la depuración.
@Finbarr, gracias por el comentario. ¿A qué te refieres con 'algo más'?
Dime, tú eres el que mencionó liberar la carga de la CPU. Depende de qué más haga su sistema.
@Finbarr, no estoy preguntando sobre un sistema en particular. Estoy preguntando sobre aplicaciones específicas en las que se puede usar la combinación UART Rx + DMA. Solo de esa manera, mencioné su contexto de 'algo más'.
@CNA mientras que su pregunta original mencionaba MODBUS, todo estaba bien. Pero con cada comentario aquí, pasa de los requisitos específicos de la aplicación a la zona "No tengo idea de lo que estoy preguntando".

Respuestas (2)

No especificó el hardware y usó "CPU" en toda la pregunta. Sin embargo, dado que también mencionó interrupciones medias / completas, supondré que en realidad está hablando de MCU.

el uso de DMA con UART necesita un recuento de bytes constante

No precisamente. La combinación del modo DMA cíclico + interrupciones parciales/completas/inactivas le permite procesar tramas de cualquier longitud. Para el hardware que no admite interrupciones inactivas, existen implementaciones alternativas, como usar un temporizador inactivo con una línea Rx conectada a la entrada de reinicio del temporizador.

Este tutorial tiene un gran resumen de varios métodos DMA. También puede encontrar útil el AN3109 de ST.

¿En qué aplicaciones el concepto UART + DMA es más adecuado que el método de interrupción UART normal?

Prácticamente cualquier comunicación basada en paquetes (incluido Modbus) puede beneficiarse de DMA. Las excepciones son:

  • Si su comunicación consta de unos pocos bytes enviados con largos períodos de inactividad en el medio, configurar y procesar DMA complicará innecesariamente el software;
  • En aplicaciones en las que el tiempo es crítico, si la recepción de ciertos bytes (p. ej., EOF) requiere una reacción inmediata, el uso de DMA puede introducir una latencia inaceptable;
  • Finalmente, si su aplicación no tiene nada más que hacer cuando no hay datos para procesar Y la MCU es lo suficientemente rápida para procesar un flujo continuo de bytes en el ancho de banda máximo uno por uno, el uso de DMI introducirá una complejidad innecesaria.

Básicamente, al tomar la decisión de usar o no DMA, considere esto: el procesamiento de datos tomará exactamente la misma cantidad de ciclos de todos modos. El uso de interrupciones UART agregará una sobrecarga de entrada/salida de IRQ por cada byte . El uso de DMA agregará la misma sobrecarga pero solo a interrupciones de búfer medio/completas/inactivas. Por lo tanto, cualquier búfer de más de dos bytes teóricamente le ahorrará algunos ciclos (en realidad necesitaría un búfer algo más largo para ver los beneficios).

Gracias por la respuesta. Estoy usando controladores pic. ¿Puede ser más específico acerca de las comunicaciones basadas en paquetes en las que se utiliza el concepto UART+DMA?
No sé cuán más específico puedo ser. Enumeré las excepciones cuando el uso de DMA no es beneficioso y expliqué cómo el tamaño del búfer afecta la sobrecarga de comunicación. También mencioné específicamente MODBUS que parece estar usando.
El enlace del tutorial está roto. Vuelve a apuntar a esta pregunta.
@Harvey Arreglé el enlace, gracias.

Si hay caracteres de terminación, puede buscarlos, ya que algunas MCU tienen una interrupción de coincidencia de caracteres.

Muchos protocolos también tienen un byte que indica la longitud del mensaje que se encuentra en un punto predecible en relación con el comienzo del mensaje. Puede usar eso para saber cuándo se completa un mensaje completo y cuántos bytes analizar para ese mensaje antes de ejecutar el siguiente mensaje en el búfer.

De lo contrario, supongo que podría tener un temporizador que escanee ocasionalmente los últimos n bytes no verificados recibidos en busca de algo que signifique un mensaje completo. O comenzar a procesar cuando no se reciben bytes durante un cierto período de tiempo, lo que también podría implicar el final de una transmisión.

Pero si realmente tiene que inspeccionar cada byte a medida que ingresa, entonces no tiene sentido un DMA.