routine programming funcion example operating-system embedded computer-architecture function-calls isr

operating-system - funcion - isr programming



¿Diferencia entre ISR y Function Call? (5)

Entonces, habiendo afirmado que son lo mismo, vas a enumerar las formas en que son diferentes, lo que tal vez mejor responda a tu pregunta.

Sus primeros cuatro puntos sobre ISR son amplios y generalmente ciertos. Los puntos sobre habilitar interrupciones no son necesariamente el caso y es una decisión de implementación del programador, y pueden ser determinados por la arquitectura, y ser pequeño es una guía no un requisito, y "pequeño" es totalmente subjetivo ".

Las diferencias no son tanto con respecto a cómo se codifican (aunque los ISR suelen imponer una serie de restricciones y también pueden tener privilegios que las funciones normales no), sino más bien en la forma en que se invocan y el comportamiento del procesador.

Una función (o procedimiento o sub-rutina en general) debe ser llamada explícitamente y es parte del mismo contexto y subproceso de ejecución que su llamador. Un ISR de hardware no se llama explícitamente, sino que lo invoca un evento externo (externo al núcleo del procesador que es: los periféricos en el chip pueden generar interrupciones). Cuando se invoca una interrupción, el contexto del hilo actual se preserva automáticamente antes de cambiar el contexto al ISR. A su regreso, el cambio de contexto inverso ocurre restableciendo el estado del procesador antes de la interrupción, de modo que la ejecución continúa desde el punto de interrupción.

El mecanismo puede complicarse por la presencia de un sistema operativo o programador de subprocesos múltiples por el cual el propio ISR puede provocar un cambio de contexto de subprocesos de manera que al regresar de un ISR se conecta un subproceso de ejecución o contexto diferente. Dichos mecanismos se gestionan por el sistema operativo en este caso.

Hay otro tipo de ISR compatible con algunos procesadores: el de una interrupción de software . Una interrupción de software se utiliza como una llamada de función en el sentido de que es invocada explícitamente por una instrucción en lugar de un solo evento, pero ofrece un mecanismo de indirección por el cual la persona que llama no necesita conocer la dirección del ISR y, de hecho, esa dirección puede cambiar . En ese sentido, es poco diferente a llamar a una función a través de un puntero, pero debido a que es un ISR, se ejecuta en el contexto de interrupción, no en el contexto de la persona que llama, por lo que puede tener restricciones y privilegios que una función normal no tiene.

Fundamentalmente, una interrupción puede responder de manera directa y determinista a eventos en los que, de lo contrario, podría sondear o evaluar un evento y luego manejarlo, pero solo podría manejarlo en el momento en que elija realizar la prueba en lugar de su ocurrencia real, que puede ser variable e inaceptablemente larga.

Quiero entender la diferencia entre ISR (Rutina de servicio de interrupción) y Llamada de función.

Creo que tanto la llamada a la función como el ISR son los mismos desde la perspectiva del hardware. Por favor, corríjame si estoy equivocado. Todo lo que pude encontrar sobre ISR y la llamada a la función es la siguiente:

ISR:

  • Evento asincrónico que puede ocurrir en cualquier momento durante la ejecución del programa

  • Guarda la PC, los indicadores y los registros en la pila e inhabilita todas las interrupciones y carga la dirección del ISR

  • ISR no puede tener argumentos que puedan pasarse a él

  • No puede devolver valores
  • Habilita las interrupciones
  • En general son pequeños ya que están tomando el tiempo de algún otro proceso
  • Algunos de ISR tienen su propia pila

Función:

  • Ocurre cuando alguna vez hay una llamada de función

  • Guarda la PC y se registra en la pila

  • Puede tener argumentos

  • Puede devolver valores

  • Sin restricciones sobre el tamaño y la duración de la ejecución

¿Hay alguna diferencia más que esto? Por favor hagamelo saber. También he leído acerca de tener una llamada a función de ISR, ¿cómo ocurre eso? Por favor resaltarlo.


La principal diferencia es que los manejadores de interrupción son (normalmente) invocados por el hardware periférico: el periférico y el hardware en el procesador transfieren el control al controlador apropiado sin ninguna acción del código que se estaba ejecutando antes de la interrupción. . A diferencia de las funciones, no hay llamadas: el hardware del procesador arranca la ejecución del código interrumpido.

En sistemas operativos que admiten procesos / subprocesos múltiples, las llamadas a funciones tienen lugar en el mismo contexto de proceso / subproceso que la persona que llama. Una interrupción, OTOH, no tiene subproceso o contexto de proceso: una interrupción de red resultante de una descarga de fondo de BitTorrent puede ocurrir mientras está editando un documento de Word, por lo que el controlador es muy restringido en lo que puede hacer. Puede cargar datos en / desde búferes preasignados que pertenecen al proceso / hilo al que está vinculado, puede señalar un semáforo, puede ser capaz de establecer indicadores de eventos del sistema operativo. Eso es todo.

A menudo, un controlador de interrupción realiza un retorno de interrupción directamente, lo que permite que la ejecución del código interrumpido continúe sin más interferencia. En controladores más simples, como yopur 8051, que a menudo ejecutan código incrustado sin un sistema operativo compex, este es el único curso disponible. Con un sistema operativo multiproceso preferente, un controlador de interrupción tiene la opción adicional de realizar su retorno de interrupción a través del código del sistema operativo y, por lo tanto, provocar la ejecución de un programador. Esto permite a los manejadores de interrupciones hacer que los hilos que estaban esperando la interrupción estén listos, y posiblemente en ejecución, (y así quizás adelantar el hilo que se interrumpió originalmente). Esto permite que dichos sistemas tengan un buen rendimiento de E / S sin ningún sondeo.

Las fuentes de interrupción de hardware pueden ser periféricos integrados en el chip del procesador: controladores de red, controladores de disco, controladores de pantalla, controladores DMA, controladores USB, controladores de intercore-comms (en procesadores con múltiples núcleos), temporizadores, etc. o pin de solicitud de interrupción. s en el paquete se puede usar para generar una interrupción desde una fuente de hardware externa (tal vez un botón, teclado, teclado o hardware de pantalla táctil).


No son necesariamente los mismos que declara en el primer punto de los ISR: las interrupciones son asincrónicas y, por lo tanto, tienen que ''interrumpir'' de alguna manera el trabajo de los procesadores principales.

Por ejemplo, veamos este código MIPS decorado con direcciones, que no hace nada útil:

4000. add $1, $2, $3 4004. sw $ra, 0($sp) 4008. jal subr # function call, sets $ra to 4012 and jumps to 4024 4012. lw $ra, 0($sp) 4016. jr $ra 4020. 4024. subr: sub $2, $1, $3 4028. jr $ra

Este código puede manejarse desde el procesador principal: las operaciones aritméticas (líneas 1, 7) son hechas por la unidad aritmética, el acceso a la memoria (líneas 2, 4) por el controlador de memoria y los saltos (líneas 3, 5, 8) son hechas por la CPU principal también. (La dirección real de jal se establece durante el enlace del archivo objeto).

Esto es para llamadas a funciones. En cualquier momento se determina dónde está el código ahora y qué código se ejecuta en el siguiente punto en el tiempo (es decir, cuando el contador del programa se incrementa: PC + = 4).

Ahora viene el punto, cuando sus funciones hacen algo complicado, pero aún desea que el software reaccione con un golpe clave. Entonces, un llamado coprocesador entra en juego. Este coprocesador espera hasta que ocurra algún evento (como un golpe de tecla en el teclado) y luego llama al controlador de interrupción. Este es un bloque de código ubicado en cierta dirección en la memoria.

Piensa que el procesador está en el cálculo anterior, pero mientras tanto quieres almacenar el número de pulsaciones de tecla en las keys dirección. Luego, escribe un programa que comienza en la dirección 0x80000180 (esto se define como la dirección del controlador de excepción en MIPS):

lw $at, keys addi $at, $at, 1 sw $at, keys eret

Ahora, ¿qué sucede con una pulsación de tecla?

  1. El coprocesador se da cuenta de la pulsación de tecla
  2. La PC actual del procesador principal se guarda
  3. La PC del procesador principal está configurada en 0x80000180, se ejecuta el código de interrupción
  4. En eret la PC está configurada para la PC del procesador principal antes de que ocurriera la interrupción
  5. La ejecución del progamm principal continúa allí.

Aquí hay un cambio de la ejecución normal a la interrupción del manejo entre los pasos 2 y 3 y viceversa de 4 a 5.

Nota: He simplificado mucho esto, pero debe quedar claro, cómo las interrupciones son diferentes de las llamadas a funciones y cómo el hardware debe tener capacidades adicionales para el manejo de interrupciones.


Las respuestas anteriores son bastante completas ... nota especial sobre las interrupciones de software de Clifford.

La única adición que haría es esto. El contexto de registro almacenado en una llamada de función se define en el Convenio de Llamadas a Procedimiento para la Arquitectura de CPU. Esto generalmente significa que la persona que llama guarda algunas cosas en la pila y el destinatario guarda algunas cosas y es prácticamente un conjunto estático. Excepción: IA64 que tiene una ventana dinámica de guardar / restaurar registros.

En ISR, el único contexto de registro almacenado es lo que se va a utilizar en el ISR. Si se usa un registro, solo ese registro se guarda / restaura.

En la mayoría de las CPU, el conjunto de registros almacenados / restaurados en una llamada a función es mucho más grande que los almacenados / restaurados en un ISR debido a la naturaleza estática de las convenciones de llamada a procedimientos.


Una llamada a función generalmente es generada por programa.

Una interrupción generalmente es generada por hardware.

por ejemplo: si programa en C, llama a la función haciendo la función. Existe la función Principal y las Subfunciones. Las funciones secundarias son programadas por el programador.

Las interrupciones, sin embargo, son específicas del hardware. por ejemplo: en una computadora, la CPU está procesando un programa y ejecutándolo. Si presiona una tecla en su teclado, el teclado establece la interrupción del teclado en la CPU. Ahora la CPU puede actuar sobre la acción pulsada por teclado.

La mejor manera de resumir? 1. las funciones son creadas por programadores. 2. Las interrupciones se diseñan físicamente en el hardware y son utilizadas por otro hardware https://www.youtube.com/SaqibJaved