Cuando se regresa el isr

Un isr puede devolver un valor y tomar argumentos

Sí, Clawson te ha dado una respuesta muy correcta. Sin embargo, deberías pensar más en tu pregunta original. Al escribir código basado en interrupciones, considera la forma en que la interrupción es invocada (entre algunas intsrucciones no especificadas) y termina (el contador del programa vuelve al punto en que el flujo de código fue interrumpido).

Teniendo en cuenta esto, la idea de un valor de retorno no tiene sentido ya que no hay una función de llamada que acepte un valor de retorno. Además, una de las principales preocupaciones de un ISR es no cambiar el estado del flujo de código que se interrumpe. Escribiendo en C, el compilador se encarga de mucho de eso por ti. (Como guardar los registros en la pila). En ensamblador, necesitarías tu ISR para asegurarte de que el estado de los registros no se altera.

Pero, incluso con C necesitas asegurarte de que tu código es resistente a los efectos de una interrupción. Considera si estás leyendo y almacenando la cuenta de 16 bits del temporizador1, y entre el almacenamiento de los bytes altos y bajos, ocurre una interrupción. Bien, podrías tener una lectura bastante incorrecta si el temporizador 1 se desborda entre los bytes altos y bajos que se almacenan.

Interrupción isr

Ambas instrucciones en C/C++ se traducirán en múltiples sentencias en ensamblador y en ambos casos dependerá del contexto. El contexto para una ISR(){} es bastante monocorde en este caso, pero lo más probable es que también incluya algunos push y el almacenamiento de la SREG. Pero el número de pushes a la pila dependerá de lo que ocurra en la función.

También lo hará cualquier retorno; se interpretará en el contexto. Al final de una subrutina normal que realmente se construye en una subrutina (muchas subrutinas de uso limitado son «alineadas» por un compilador por razones de eficiencia del código) se convertirá en una instrucción ret (después de manejar cualquier POP necesario y otra limpieza de bajo nivel). Al final de una interrupción significará en realidad «pop todo lo que empujó antes (y también restaurar el SREG) y luego se retira».

Cuando devuelves un tipo que se compilará en la transferencia de ese valor a través del sistema de la plataforma, antes de incluir la instrucción ret. Así que return; es una sentencia muy sensible al contexto que puedes asumir que será interpretada correctamente, a menos que hagas cosas muy raras. Pero esas cosas raras serán cosas que un buen compilador (como AVR-GCC) al menos advertirá.

¿podemos usar printf dentro de isr?

Significa «Rutina de Servicio de Interrupción». Una ISR (también llamada manejador de interrupciones) es un proceso de software invocado por una solicitud de interrupción de un dispositivo de hardware. Maneja la solicitud y la envía a la CPU, interrumpiendo el proceso activo. Cuando el ISR se completa, el proceso se reanuda.

Un ejemplo básico de una ISR es una rutina que maneja los eventos del teclado, como pulsar o soltar una tecla. Cada vez que se pulsa una tecla, el ISR procesa la entrada. Por ejemplo, si se mantiene pulsada la tecla de la flecha derecha en un archivo de texto, el ISR indicará a la CPU que la tecla de la flecha derecha está pulsada. La CPU envía esta información al procesador de textos activo o al programa de edición de textos, que moverá el cursor hacia la derecha. Cuando sueltas la tecla, el ISR maneja el evento «tecla arriba». Esto interrumpe el estado anterior de «tecla abajo», que indica al programa que deje de mover el cursor.

De forma similar a la ley de inercia de Newton (un objeto en movimiento tiende a permanecer en movimiento), los procesos informáticos continúan ejecutándose a menos que sean interrumpidos. Sin una solicitud de interrupción, un ordenador permanecerá en su estado actual. Cada señal de entrada provoca una interrupción, obligando a la CPU a procesar el evento correspondiente.

Pasos de la rutina de servicio de interrupción

La macro ISR() (de interrupt.h) dará a la función de interrupción el atributo de ‘señal’, lo que significa, además de otros detalles, que el compilador pondrá un ‘reti’ al final de la función de interrupción.

Si pones un retorno en cualquier parte de tu código (código C), terminará siendo un ‘ret’, con el bit I sin cambiar. Así que si llamas a una función desde dentro de un ISR, la función llamada no volverá a activar las interrupciones cuando regrese (porque usará ‘ret’).

(Y ahora parece que no debería haber dicho que un ‘return’ en C acabará siendo un ‘ret’, porque no siempre es así. El ‘return’ sólo significa que eso es lo que pretendes hacer, el compilador averiguará qué hacer, y la mejor manera de hacerlo. Ahora sé por qué no escribo manuales de usuario).

Mientras que puedo ver el punto de volver a habilitar las IRQs dentro de un ISR . No puedo ver por qué querrías alterar algo en la palabra de estado. Obviamente puedes deshabilitar interrupciones individuales en sus respectivos registros.

No expuse las reglas básicas muy bien. Tienes que usar la macro ISR sin que se permitan otros atributos. Tienes que salir del isr con el estado en el que estaba el avr antes del isr (habrá que ejecutar el epílogo). No hay spm. No se sabe dónde se encuentra el isr en la flash. No se sabe qué tamaño tendrá el prólogo/epílogo. El reti tendrá que ejecutarse (no hay opción), pero la primera instrucción después del reti tendrá que ser ‘cli’. Puedes hacer asm dentro del isr.