Mutex en interrupciones

7

Para un microcontrolador pequeño sin sistema operativo, ¿cuál es la forma correcta de compartir datos entre diferentes interrupciones y el bucle principal?

Con un sistema operativo, solo se puede crear un mutex para cada parte crítica y continuar, y el programador cambiará entre tareas, por ejemplo.

Si se usa un mutex en una interrupción, simplemente se bloqueará para siempre, así que obviamente esto no puede funcionar.

Un enfoque simple en el que puedo pensar puede ser tener copias de las variables en una tabla y cuando se modifiquen, establezca una marca para cada variable modificada. Luego, en el bucle principal, las interrupciones de desactivación copian las copias a las variables principales y viceversa (con un sistema de prioridades en caso de que se hayan cambiado dos o más). Esto llevaría bastante tiempo y, pero debería funcionar.

    
pregunta Carlos

2 respuestas

9

Hay varias maneras:

  1. Haga que cada parte del estado sea lo suficientemente pequeña como para que el hardware la actualice de forma atómica. Por ejemplo, si está en una máquina de 16 bits (como un Microchip dsPIC, por ejemplo), haga que cada parte del estado compartido no supere los 16 bits.

  2. Use FIFOs entre código de interrupción y primer plano. Hay formas de diseñar FIFOs para que no se necesite un mutex, pero el código de primer plano e interrupción aún puede acceder a sus fines en cualquier momento.

  3. Haga que el código de primer plano apague temporalmente las interrupciones alrededor de los accesos a datos compartidos críticos que no se actualicen atómicamente.

respondido por el Olin Lathrop
8

En mis programas de MCU (Atmel, PIC, ARM) uso:

disable interrupts
critical action
enable interrupts

Mis acciones críticas son de muy corta duración. La mayoría de ellos son del tipo: var = var +/- 1;

Tenga en cuenta que puede usar el sistema anterior para crear sus propios mutex-es.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas