¿Por qué se prefiere el búfer de anillo para la comunicación asíncrona?

2

Los buffers de anillo son los elegidos por la mayoría de los programadores integrados veteranos para comunicaciones asíncronas. Supongamos que los datos llegan a UART desde una sola fuente y solo cuando se solicita un msg (Master- > Slave, Slave- > Master), ya que los códigos son de naturaleza secuencial, solo podemos implementar una matriz ordinaria (tamaño máximo de datos recibidos) para contener los datos recibidos. Al igual que:

#define MAX_SIZE 8
U8 RxBuff[MAX_SIZE]

Una vez que se hayan procesado y respondido los datos, el maestro y el esclavo pueden restablecer el RxBuff. No hay necesidad de un búfer de anillo.

Pero esto me hizo pensar, ¿los Ring Buffers ofrecen la ventaja de una vida SRAM más larga? He leído que los recuerdos como Flash, Ram tienen ciclos de escritura limitados pero ciclos de lectura infinitos. Al implementar un búfer de anillo que circula alrededor de las ubicaciones de RAM cada vez que llegan los datos, ¿tal implementación, al reducir los ciclos de escritura para las ubicaciones de memoria constante de RxBuff cada vez que se reciben los datos, ofrece una vida útil mejorada de la memoria?

¿O hay otras razones por las que se prefieren los buffers de anillo?

    

2 respuestas

2
La memoria

FLASH y EEPROM tienen problemas de resistencia con varias escrituras en la misma ubicación, pero eso no afecta a la RAM, que es donde normalmente se almacena un búfer de anillo para comunicaciones asíncronas. Las dos razones principales en las que puedo pensar son:

  • Muchos protocolos comunes no siguen la secuencia secuencial de comando / respuesta que describe. Por ejemplo, los receptores GPS envían una transmisión bastante continua, por lo que es importante poder seguir recibiendo datos mientras se procesan los datos anteriores.

  • Debido a que los buffers de anillo a menudo son necesarios para ese tipo de protocolos, es más conveniente usarlos para todas las comunicaciones asíncronas. La única sobrecarga adicional real es la necesidad de una cola de cola y una cabecera, que en muchos casos solo será de un solo byte.

Teniendo en cuenta sus restricciones si escribe en la RAM, simplemente reinicie el búfer al final de un mensaje y comience nuevamente desde el inicio del búfer. Pero los usos son tan limitados y las ventajas tan pequeñas que la mayoría preferiría usar un búfer de anillo en todas las aplicaciones.

    
respondido por el PeterJ
2

Primero que nada, como otros han señalado, cualquier búfer de comunicación estaría en la memoria RAM, no en flash o EEPROM, por lo que no hay problema con el desgaste de la memoria.

La razón principal que veo para usar buffers de anillo para la comunicación, es cuando usa una rutina de servicio de interrupción (ISR) para manejar los caracteres entrantes. El ISR es el productor, y el nivel base (sin interrupción) es el consumidor. Junto con el búfer de anillo hay dos punteros, uno para la ubicación del carácter para almacenar el siguiente carácter entrante y el segundo para mantener un registro del último carácter recuperado del búfer. Cuando los punteros son iguales, el búfer está vacío.

Al usar un búfer de anillo, el sistema puede manejar los caracteres que ingresan a una velocidad alta (por ejemplo, cada 87 µs para 115.2 KBaud), y no preocuparse de que se procesen de inmediato (asumiendo que el búfer es lo suficientemente grande como para manejar el retraso). entre la recepción y la recuperación).

Esto sería importante, por ejemplo, en un RTOS no preventivo donde no se produce un cambio de tarea hasta que la tarea actual cede voluntariamente el control del sistema operativo. Mientras tanto, el ISR recopilará caracteres en segundo plano y, cuando se produzca el cambio de tarea, probablemente la tarea para procesar los caracteres entrantes se ejecutará a continuación.

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas