Tamaño eficiente del búfer FIFO para UART

0

Estoy diseñando un software para un microcontrolador que transmite y recibe datos de varios UART en un bucle cada 15 ms. Estoy usando interrupciones UART para enviar y recibir datos. UART interrumpe la copia de bytes a / desde los registros UART TX / RX en el búfer FIFO circular (a.k.a. Ring). He leído que el búfer circular de RX y TX debe ser más grande que los bytes de datos y el número tiene el poder de dos como 4,8,16,64,256, etc.

Entonces, mi pregunta es ¿cuál es el tamaño eficiente del búfer circular? ¿Cómo puedo calcularlo?

Estaba leyendo sobre algunos modelos de colas. ¿Podemos usarlos para encontrar el tamaño del búfer? ¿Cuál será su tarifa de llegada y servicio? ¿Estas tasas dependen de la velocidad en baudios o del ciclo periódico del sistema?

    
pregunta Masood Salik

2 respuestas

2

Hay varias cosas en las que debe pensar al usar los buffers FIFO (es decir, las colas circulares) cuando se comunica a través de un canal como un UART. Pensar en estas cosas debería ayudar a guiar su avance.

  1. El uso de colas circulares no es gratis. El acto de poner en cola los datos y luego de eliminarlos consume parte del ancho de banda de su procesamiento.
  2. A menudo puede ser más eficiente, una vez en la rutina de interrupción para procesar un evento de RX, volver a verificar si han llegado más datos y hacer una cola inmediatamente antes de salir de la rutina de interrupción. Esto puede entrar en juego, especialmente cuando también hay un FIFO de hardware habilitado en la ruta de entrada de RX.
  3. A altas velocidades en baudios, a menudo puede ser más eficiente habilitar las FIFO de hardware en la ruta de TX y hacer un bucle en la rutina de interrupción de TX hasta que la FIFO se llene en el caso de que haya más datos esperando para ser enviados.
  4. La opción de hacer que las colas circulares sean un poder parejo de dos en tamaño puede tener sentido dependiendo de cómo se escriban las rutinas del software de colas circulares. Con una potencia uniforme de dos tamaños, los índices utilizados para representar las posiciones de entrada y salida en la cola circular se pueden manejar sin verificar el rango y, en cambio, permiten que los índices se ANDEN con una máscara después de que el índice se haya incrementado. Algunas arquitecturas de procesadores obtendrán pocos beneficios, mientras que para otros esto puede ser una gran ventaja.
  5. Su aplicación debe poder aceptar todos los datos de RX que llegan a la velocidad de datos que se esté utilizando. A largo plazo, si los datos llegan más rápido de lo que pueden procesarse, ningún búfer circular de colas ayudará a resolver el problema.
  6. El tamaño de la cola circular debe ser lo suficientemente grande como para contener toda la información que contiene la interrupción de RX mientras el procesador está apagado haciendo algunos otros eventos que consumen mucho tiempo.
  7. Hacer que el búfer sea más grande de lo necesario no es ningún problema, solo consumirá RAM innecesariamente ... especialmente si es una compensación usar esa RAM para otro propósito.
  8. En los casos de comunicaciones multicanal, se recomienda asignar un conjunto de colas circulares de TX y RX para cada canal en lugar de tratar de usar un conjunto de colas con datos entremezclados con múltiples canales y las etiquetas agregadas para realizar un seguimiento de ¿Qué datos van a dónde?
respondido por el Michael Karas
0

Depende de cuántas instrucciones por segundo pueda ejecutar para leer el búfer y actualizar los punteros. Incluso como ISR consumirá ciclos de instrucción.

Instale el código que necesita para hacer todo lo demás primero, luego use software o hardware para capturar su tiempo 'de repuesto' en el que puede administrar un búfer. Solo necesita crearse una vez, más un byte de estado y punteros de lectura y escritura. A menos que tenga alguna automatización incorporada, tendrá que sondear el búfer a menudo para ver qué tan lleno está, y comparar esto con el tiempo que se tarda en leerlo. Algunos buffers incorporados ofrecen un indicador semilleno para activar un ISR.

Empiezas con 32 bytes y ves cuánto tiempo de 'repuesto' queda. No pasaría de más de 256 bytes / palabras / dwords solo por el tiempo que toma borrarlo y leerlo. Ningún fabricante de CPU o MPU que conozco va más allá de eso, incluso para Ethernet y USB.

    
respondido por el Sparky256

Lea otras preguntas en las etiquetas