Un FIFO no debería tener un problema de concurrencia.
Obviamente, tendrá cuando se utiliza con varios escritores o lectores. Pero este dispositivo no es adecuado para ese propósito. Use paquetes en lugar de secuencias si eso es lo que está buscando.
Sin embargo, la implementación podría tener. Por lo tanto, la interrupción no se puede ejecutar durante las manipulaciones en el búfer.
En otras palabras, la lectura / modificación / escritura de punteros no puede ser interrumpido por el uart irq.
Otras respuestas sugieren que debería usar las funciones provistas en mi FreeRTOS.
Esto es excelente consejo . La FIFO o las colas en un RTOS se deberían haber hecho para ser atomic en todos los hilos relevantes para evitar problemas.
Si tiene miedo de perder datos, tiene dos opciones:
- Aumentar el tamaño del búfer.
- Reducir la velocidad de datos.
La operación "atómica" de la operación del búfer debe ser inferior al tiempo requerido para recibir un nuevo byte, de lo contrario perderá datos. También puede necesitar sobrevivir a la fluctuación de fase inducida por eventos de mayor prioridad. Sin embargo, esto no debería ser un problema, se supone que las interrupciones de uart son muy cortas y deberían poder adelantarse a todo lo demás.