10 votos

Interrupción por software frente a la función

Después de unos 3 años de trabajar con MCUs todavía no sé para qué sirven las interrupciones por software. He hecho varios trabajos con STM32 y nunca he utilizado las interrupciones por software. De hecho, esta es una gran pregunta para mí:

¿Por qué cuando podemos usar una función simple para hacer una tarea, debemos 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 has escrito para tu trabajo). Debería haber algunas ventajas en el uso de una interrupción de software en lugar de una simple función. No estoy seguro pero creo que hay un beneficio para las interrupciones de software: puedes asignar una prioridad para una interrupción de software, entonces puedes dar una prioridad más alta a la interrupción de software para evitar que la interrupción de hardware rompa tu tarea.

1 votos

Creo que el propósito principal de usar interrupciones es que puedes seguir haciendo otras tareas importantes mientras eso está esperando a que ocurra algo más, y cuando los tiempos no van a ser siempre constantes. También creo que es un poco más rápido que el sondeo en la mayoría de los casos.

1 votos

@MrPhooky Eso que dices son interrupciones de Hardware. El OP está hablando de las interrupciones de software.

20voto

user4245 Puntos 324

La principal diferencia entre una función y una interrupción de software es lo que se conoce como contexto .

  • Una función se ejecuta dentro del contexto de su programa principal.
  • Una interrupción se ejecuta dentro del contexto del manejador de la interrupción.

En un sistema simple esto puede no ser una diferencia real, y las interrupciones de software pueden ser utilizadas simplemente como una forma conveniente de proporcionar rutinas de biblioteca codificadas en la ROM - usted no necesita saber la dirección de cada rutina, sólo el código de identificación y el punto de entrada principal. Esto hace que tu código sea más portable.

Sin embargo, en sistemas más complejos, la interrupción del software puede ejecutarse en un entorno completamente diferente, conocido como contexto del núcleo . Normalmente su aplicación se ejecutaría en un contexto de usuario que tiene acceso limitado a los recursos. Sólo cuando se ejecuta en el contexto del núcleo puede realizar las tareas más complicadas -de hecho, algunos sistemas incluso limitan las instrucciones que se pueden ejecutar, por lo que se necesita un mecanismo para activar el código en el contexto del núcleo- y para ello se utiliza una interrupción.

1 votos

Además, las interrupciones pueden detener arbitrariamente el progreso de un programa para que el sistema pueda hacer otra cosa (por ejemplo, interrupciones de hardware). Tus programas no necesitan tener esto en cuenta, porque, desde el punto de vista de tu programa, el estado de la función no ha cambiado desde que se produjo la interrupción. En sistemas más antiguos, así es como los programas TSR (Terminate/Stay Resident) simulaban la multitarea, enganchando la interrupción del temporizador/reloj. Incluso sin los niveles de la IOPL, había un beneficio para, por ejemplo, mantener el reloj del sistema actualizado.

4 votos

Tal vez también hay que tener en cuenta que esas "interrupciones de software" también se denominan "interrupciones síncronas", porque el código de la aplicación sabe exactamente cuándo y por qué se produce esa interrupción, a diferencia de las "interrupciones asíncronas" que, desde el punto de vista de la aplicación, pueden ocurrir básicamente en cualquier momento de forma no solicitada.

0 votos

@HannoBinder: Creo que el OP está hablando de enviar solicitudes de interrupción al controlador de interrupción vectorial Cortex-M3; si el código para una interrupción de alta prioridad envía una de menor prioridad, la solicitud se aplazará hasta algún momento posterior cuando todas las interrupciones de mayor prioridad hayan terminado.

12voto

Andreas Puntos 741

Las interrupciones de software pueden utilizarse para terminar una tarea de interrupción con una prioridad menor. El código crítico para la sincronización suele tener una alta prioridad de interrupción para evitar una latencia excesiva. Una vez que la parte crítica para la sincronización está terminada, puede haber tareas adicionales que pueden ser demasiado críticas para la sincronización del bucle principal, pero no son tan críticas como para detener otras interrupciones de alta prioridad. El disparo de una interrupción de software de baja 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 alta prioridad para minimizar el jitter de los pasos. La tarea más crítica para la temporización puede ser tan simple como establecer o borrar un pulso de paso o avanzar las salidas de fase. Puede haber funcionalidad adicional requerida como el cálculo de las rampas de aceleración, el procesamiento de los sensores, etc. Ya que esto necesita ser procesado en cada paso, puede no ser apropiado procesar esto desde main() ya que el tiempo del bucle principal puede ser demasiado largo. Estas tareas adicionales pueden ser procesadas por una interrupción de software de baja prioridad para no aumentar la latencia de los otros canales de 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 la 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 su prioridad suba. Si una llamada a una función se insertara al final de una interrupción de alta prioridad, la función estaría contenida dentro de esa alta prioridad. Al disparar la interrupción de software de menor prioridad y luego regresar de la interrupción de alta prioridad, la función es llamada con la nueva (menor) prioridad.

2 votos

Otro patrón común puede ser tener una interrupción de 100KHz para manejar cosas críticas de tiempo, y también necesitar un tick de temporizador de 1kHz, pero no tener dos temporizadores separados disponibles. No hace falta mucha sobrecarga para que una rutina de interrupción de 100kHz diga if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; La otra interrupción puede entonces hacer lo suyo y con las interrupciones brevemente deshabilitadas añadir 100 a timer_count; incluso si la rutina de 1kHz tarda más de 10us en ejecutarse no interferirá con la de 100kHz.

0 votos

De manera similar, he utilizado las interrupciones de software en sistemas simples (sin un RTOS completo) como un pseudoprogramador, donde los requisitos de hardware son manejados por los ISR, pero las funciones de devolución de llamadas y otras tareas largas que se realizan en respuesta a los cambios en el estado del hardware se delegan a la interrupción de software.

0 votos

Básicamente has descrito una variante de la "mitad inferior". ¿Tiene alguna referencia de que esto también se denomina "interrupción de software"? Es un significado bastante diferente de la respuesta de Majenko, y la pregunta está etiquetada como ARM - la arquitectura realmente tiene la instrucción SWI (interrupción de software).

7voto

Al pacino Puntos 415

Para ampliar un poco la respuesta de Majenko, las interrupciones de software se utilizan para implementar sistemas operativos, en particular la interfaz de llamada al sistema. Esto significa que las aplicaciones no necesitan estar enlazadas con el sistema operativo para hacer llamadas a funciones, y el cambio de contexto permite al SO limitar el acceso al hardware y aprovechar cosas como la memoria protegida.

Si no estás usando un SO y controlas todo el código en el MCU, probablemente no necesites usar interrupciones de software. (Aunque como mencionó Tut, pueden tener otros usos).

El Linux y MS-DOS Las interfaces de llamada al sistema en x86 utilizan interrupciones de software, así que las enlazaré como ejemplo.

1 votos

Y en muchos casos en los que el sistema operativo utiliza interrupciones suaves, éstas están envueltas en funciones para hacer la vida más sencilla.

1 votos

Todavía programo cosas (nuevas también) para DOS, y estoy muy familiarizado con los manejadores int 21. Casi todo lo que necesito en cuanto a E/S se maneja con el ISR del DOS.

0 votos

Tenga en cuenta que la página citada para Linux es de 1993-1996.

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