¿Cómo permitir que subprocesen e interrumpan la escritura segura de los datos entrantes de USART en FreeRTOS?

2

Tengo un búfer [circular] que se escribe con datos entrantes del USART usando IRQ. También tengo otras tareas de lectura de datos desde el búfer también. ¿Qué debo hacer en un escenario donde una tarea tiene la exclusión mutua para el búfer pero IRQ se ejecuta con los datos entrantes? ¿Debo crear una variable tmp que almacene los datos y establezca una marca en IRQ para que los datos se escriban en el búfer una vez que se proporcione el mutex?

    
pregunta h3y4w

3 respuestas

1

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.

    
respondido por el Jeroen3
3

colas de FreeRTOS pueden manejarlo. Puede haber algunos gastos generales, no sé cuántos datos está recibiendo. Solo asegúrate de usar xQueueSendFromISR u otra función que finalice FromISR cuando hagas algo en la cola desde el contexto de interrupción.

    
respondido por el filo
1

Considere no dejar que la IRQ de UART se ejecute mientras el búfer está siendo manipulado por otra tarea. En otras palabras, deshabilite la interrupción de UART mientras otra tarea está leyendo desde el búfer.

Luego, asegúrese de que la tarea de lectura no deje la interrupción de UART deshabilitada durante tanto tiempo que el UART deje caer un carácter. Lo único que debe hacer la tarea de lectura mientras la interrupción está deshabilitada es copiar el carácter del búfer y ajustar el puntero del búfer. No intentes leer varios caracteres y analizarlos mientras la interrupción está desactivada.

Si solo tiene una tarea que lee del búfer y solo el controlador de interrupciones que escribe en el búfer, considere si realmente necesita el mutex. Si la tarea de lectura desactiva la interrupción, nada más interrumpirá y posiblemente dañará el búfer hasta que la tarea de lectura haya finalizado.  Y el administrador de interrupciones no puede ser interrumpido por la tarea de lectura, por lo que su acceso al búfer no puede interrumpirse / corromperse. Sospecho que el mutex solo es necesario si tiene varios lectores.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas