Controlar un protocolo UART con FreeRTOS o Interrupciones [cerrado]

1

Estoy intentando desarrollar un protocolo UART para permitir la comunicación entre dos tableros Master_Board y Slave_Board. Master_Board enviará comandos sobre UART a Slave_Board y este último responderá. La cosa es que los comandos tienen diferentes prioridades y algunos comandos deben ejecutarse a tiempo. Por ejemplo, si el Master_board envía "GET_VALUE" a Analysis_Board, este último enviará los valores a Master_board durante 20 segundos. Si algo malo sucede mientras se reciben datos, Master_board enviará "ABORT" a la tabla de análisis. Este último deberá dejar de enviar valores incluso si no se alcanzan los 20 segundos. Creo que hay 2 formas de hacerlo. implementar el protocolo UART para ser administrado por interrupciones o RTOS. ¿Qué camino es mejor en mi caso? ¿De qué manera es más fácil de manejar y garantiza el mejor rendimiento?

    
pregunta Pryda

2 respuestas

1

No especificó sus tolerancias de tiempo (por ejemplo, fluctuación de fase: tiene que ser 1s o 1ms). Si es 1s, entonces se puede hacer fácilmente "sin importar qué" (a menos que algo esté muy mal codificado ...) tanto en metal desnudo como con un RTOS. ¿Es realmente necesario el RTOS? No usa RTOS solo para hacer algo "más rápido", sino para facilitar la gestión de muchas tareas paralelas e interdependientes.

Algunas ideas:

  1. Dentro de la tarea RTOS: cargue el registro de datos UART, el indicador de transmisión de sondeo completo, si no se hace, llame a vTaskDelay (u otra función de retardo en su RTOS). Primitivo y no garantiza tiempos.

  2. La tarea RTOS carga el búfer de TX, inicia la interrupción de UART TX, hay una interrupción para cada byte, la tarea espera una marca o variable condicional que se establecerá con la última interrupción de transmisión completa. Hay una interrupción para cada byte. Las interrupciones con prioridades más altas pueden afectar los tiempos.

  3. La tarea RTOS carga el búfer de TX, configura DMA para transmitir todos los datos, la tarea espera una marca o variable condicional que se configurará mediante la interrupción de la transferencia completa de DMA. Hay una única interrupción para toda la transferencia. Muy pocos factores pueden afectar los tiempos (básicamente, solo otras transferencias DMA, esto puede tratarse con las prioridades DMA o la programación DMA de round robin).

  4. Diseñe todo como un sistema desencadenado por el tiempo. Esto le brinda tiempos 100% confiables (bueno ... 99.99% de algo) a costa de un rendimiento máximo más bajo (es decir, su ayuno). La CPU hará muy poco la mayor parte del tiempo para tener reservas para el peor tiempo de ejecución). Hay un gran libro gratuito Patrones para sistemas integrados disparados por el tiempo sobre este tema. Este método le dará el menor jitter posible.

respondido por el filo
0

Depende de las otras especificaciones de su sistema. Puedes hacer lo que necesites usando interrupciones; El uso de un RTOS agregará cierta sobrecarga que no creo que se justifique solo por la interfaz de comunicación del sistema.

    
respondido por el Gaspar Santamarina

Lea otras preguntas en las etiquetas