Las interrupciones son una de las formas más eficientes para manejar las solicitudes de servicios de dispositivos periféricos o eventos del sistema.
Antes de continuar definiremos algunos conceptos importantes, comencemos por las IRQ o Interrupt Request, en español solicitud de interrupción. En breves palabras se puede definir una IRQ como una señal de hardware enviada a la CPU para disparar una interrupción. También debemos ver que es una ISR o Interrupt Service Routine, en español Rutina de servicio de Interrupciones. Se trata de un bloque de código específicamente diseñado para trabajar con una condición de interrupción.
Tomando como base la imagen superior, podemos resumir que una interrupción ocurre cuando la CPU se encuentra ejecutando una secuencia de instrucciones con el flujo normal de código, al recibir una IRQ se detendrá y guardará en memoria la última instrucción que se encontraba ejecutando para a continuación comenzar con la ejecución de una ISR específica para la interrupción disparada. Una vez la ISR se finalice, el programa volverá a su flujo de ejecución normal.
¿Qué tipos de interrupciones existen?
Si queremos clasificar las interrupciones de acuerdo a su prioridad. Tendremos las interrupciones Enmascarables y las interrupciones No Enmascarables.
¿Qué ventajas tiene trabajar con interrupciones?
Podemos mencionar algunas de las siguientes:
Las interrupciones de hardware son disparadas por eventos de Hardware. Estos eventos pueden ser el presionar un botón, alcanzar un cierto límite o la expiración de un Timer. La forma en la que un Pin de entrada detecta una solicitud de interrupción puede ser sensible al nivel o sensible al borde. Una interrupción sensible al nivel tiene un nivel lógico de afirmación que indica si la solicitud de interrupción se encuentra activa. Por otro lado, una interrupción disparada por borde responderá a la transición detectada en el pin que solicita la interrupción. Puede darse por el Rising edge como por Falling edge de la señal de entrada.
Se debe mencionar que las interrupciones tambien pueden llamarse por software, a diferencia de las interrupciones llamadas por Hardware estas son completamente predecibles y forman parte de la secuencia del programa.
A modo de dar un ejemplo, podemos tomar el caso de un botón o pulsador de estado normalmente bajo, al presionarlo este cambiara a un estado alto. Si queremos que se genere una interrupción al presionarlo, podríamos configurar una interrupción sensible al borde, más específicamente al Rising Edge que se dará por el cambio de un estado bajo a un estado bajo. Entonces, cuando presionemos el botón se detendrá la ejecución normal del programa y se iniciará la ejecución de la ISR específica para la interrupción.
Es muy posible que a lo largo de tus proyectos IoT, Sistemas Embebidos o Robótica trabajes con eventos que deban ejecutarse con suma urgencia en tu sistema bajo ciertas condiciones. Por ejemplo, si tienes muchos dispositivos periféricos o muchas tareas ejecutándose secuencialmente, es probable que debas utilizar una ISR para ejecutar la tarea importante sin importar las instrucciones que tu programa este ejecutando. Puede ser mediante un botón de parada, un sensor de posición o incluso podría ser una señal disparada por un temporizador para guardar el estado de tu sistema y evitar perder información. También suelen utilizarse para leer información de entrada en un PIN de manera continua a lo largo del programa, por ejemplo cuando queremos conocer la velocidad de un motor para controlarlo, leeremos los estados del sensor de velocidad (Encoder) mediante interrupciones, de esa forma no perderemos información e incrementaremos la eficiencia de nuestro programa.
Espero que el tutorial te haya sido de ayuda para entender un poco más sobre las interrupciones y esto te motive a investigar un poco más.