Después de aproximadamente 3 años de trabajar con MCU, todavía no sé cuál es el uso de las interrupciones de software. He hecho varios trabajos con STM32 y nunca he usado las interrupciones del software. De hecho, esta es una gran pregunta para mí:
¿Por qué cuando podemos usar una función simple para hacer una tarea, deberíamos usar una interrupción de software? ¿Cuáles son las diferencias entre una interrupción de software y una función?
Cada vez que quieras, puedes llamar a una función (que hayas escrito para tu trabajo). Debería haber algunos beneficios al usar una interrupción de software en lugar de una función simple. No estoy seguro, pero creo que hay un beneficio para las interrupciones de software: puede asignar una prioridad para una interrupción de software, luego puede darle una prioridad más alta a la interrupción de software para evitar que la interrupción de hardware interrumpa su tarea.
La principal diferencia entre una función y una interrupción de software es lo que se conoce como contexto .
En un sistema simple, esto puede no ser una diferencia real, y las interrupciones de software pueden usarse simplemente como una forma conveniente de proporcionar rutinas de biblioteca codificadas en ROM; no necesita saber la dirección de cada rutina, solo el código de identificación y el punto de entrada principal. Esto hace que su código sea más portátil.
Sin embargo, en sistemas más complejos, la interrupción del software puede ejecutarse en un entorno completamente diferente, conocido como contexto del kernel . Normalmente, su aplicación se ejecutaría en un contexto de usuario protegido que tiene acceso limitado a los recursos. Solo cuando se ejecuta en el contexto del kernel puede realizar las tareas más complicadas; de hecho, algunos sistemas incluso limitan las instrucciones que se pueden ejecutar, por lo que necesita un mecanismo para activar el código en el contexto del kernel, y para eso se usa una interrupción.
Las interrupciones de software se pueden usar para finalizar una tarea de interrupción con una prioridad más baja. El código crítico de sincronización a menudo recibe una alta prioridad de interrupción para evitar demasiada latencia. Una vez que finaliza la parte crítica del tiempo, puede haber tareas adicionales que pueden ser demasiado críticas para el ciclo principal, pero que no son tan críticas como para retrasar otras interrupciones de alta prioridad. Activar una interrupción de software de menor prioridad puede lograr esto.
Por ejemplo, suponga que tiene varios motores paso a paso, cada uno con su propio temporizador. Las interrupciones del temporizador tienen una prioridad alta para minimizar la fluctuación de pasos. La tarea más crítica de temporización puede ser tan simple como configurar o borrar un pulso de paso o avanzar las salidas de fase. Es posible que se requiera una funcionalidad adicional, como el cálculo de las rampas de aceleración, el procesamiento de sensores, etc. Dado que esto debe procesarse en cada paso, puede que no sea apropiado procesarlo desde main() ya que la sincronización del bucle principal puede ser demasiado larga. Estas tareas adicionales pueden ser procesadas por una interrupción de software de menor prioridad para no aumentar la latencia de los otros canales paso a paso de alta prioridad.
¿Cuál es la diferencia entre una interrupción de software y una función?
Una función se llama inmediatamente desde donde se llama y no cambia el nivel de prioridad de interrupción actual si se llama desde una interrupción. Una interrupción de software es un disparador de interrupción que hará que se llame a esa interrupción cuando surja su prioridad. Si se insertara una llamada de función al final de una interrupción de alta prioridad, la función estaría contenida dentro de esa prioridad alta. Al activar la interrupción de software de menor prioridad y luego regresar de la interrupción de alta prioridad, se llama a la funcionalidad con la nueva prioridad (inferior).
if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1;
la otra interrupción puede hacer lo suyo y con las interrupciones deshabilitadas brevemente agregue 100 a timer_count; incluso si la rutina de 1kHz tarda más de 10us en ejecutarse, no interferirá con la de 100kHz.Para ampliar un poco la respuesta de Majenko, las interrupciones de software se utilizan para implementar sistemas operativos, particularmente la interfaz de llamada al sistema. Esto significa que las aplicaciones no necesitan estar vinculadas con el sistema operativo para realizar llamadas a funciones, y el cambio de contexto permite que el sistema operativo limite el acceso al hardware y aproveche cosas como la memoria protegida.
Si no está usando un sistema operativo y controla todo el código en la MCU, probablemente no necesite usar interrupciones de software. (Aunque como mencionó Tut, pueden tener otros usos).
Las interfaces de llamada al sistema Linux y MS-DOS en x86 usan interrupciones de software, por lo que las vincularé como ejemplo.
Sr.Phooky
brahans