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.
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:
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).
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.
pgvoorhees
finbarr
Arce
CNA
finbarr
CNA
Arce