3 votos

Diagrama AVR de funciones que llaman, ISR y bucle principal comparten el mismo recurso

He hecho un diagrama simple de llamadas a funciones para ilustrar el posible problema que me está molestando un poco. Como puedes ver, mi task_list (que es una lista enlazada simple) se modifica tanto en ISR como en el ciclo principal del programa.

  • ¿Esta solución puede causar errores en el futuro?
  • ¿Qué tipo de errores?
  • ¿Debería usar algún tipo de solución de sincronización/protección de recursos para prevenir errores?
  • ¿Qué tipo de sincronización?

enter image description here

4voto

GSerg Puntos 33571

Sí, cada vez que una estructura de datos como tu lista de tareas puede ser accedida (modificada o vista) por más de un proceso, es esencial que cualquier cambio en esa estructura de datos sea completo y auto-consistente cuando es vista por cualquier proceso. En general, esto se llama "actualización atómica".

Una lista enlazada es una estructura de datos no trivial, y las actualizaciones a ella requieren más de una instrucción de máquina para lograrse. Si la ISR interrumpe el bucle principal cuando está actualizando la lista, la ISR no verá una estructura consistente. Si la ISR luego intenta actualizar la lista por sí misma, se produce el caos.

Una forma sencilla de proteger el acceso a datos compartidos es a través de la exclusión mutua (o "mutex" para abreviar). En el caso de un conflicto entre el bucle principal y la ISR, es fácil lograrlo mediante la bandera de habilitar la interrupción.

  • Si la ISR quiere actualizar la estructura, tiene acceso exclusivo, porque por definición, ningún otro proceso puede ejecutarse hasta que salga.
  • Si el bucle principal quiere actualizar la estructura, primero debe deshabilitar las interrupciones y luego volver a habilitarlas cuando haya terminado.

Si más de un proceso no interruptor desea acceder a la estructura, puedes agregar una bandera binaria para controlar el acceso a la estructura de datos, y esta bandera solo puede ser establecida por un proceso a la vez. Sin embargo, ten en cuenta que las actualizaciones a esta bandera también deben ser atómicas, lo que significa deshabilitar las interrupciones nuevamente, para que no ocurra un cambio de tarea entre la prueba y el establecimiento de la bandera.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X