El primer vector en la tabla de vectores de interrupción (ubicado en 0x0000) es el "Vector de reinicio". Esta es la primera dirección de memoria del programa que lee la CPU en el encendido 1 . La ubicación en la memoria generalmente se llena con una instrucción JMP
o RJMP
donde la dirección de salto es el inicio de su programa.
Si el vector de reinicio no está programado correctamente (por ejemplo, con una instrucción RJMP
o lo que sea), la CPU simplemente seguirá contando las instrucciones de ejecución tal como aparecen, por ejemplo. ejecutando otros vectores de interrupción si hay. Si hay otras rutinas de interrupción programadas en la tabla vectorial, todas se ejecutarán por turnos, independientemente de si su fuente de interrupción estaba habilitada o inhabilitada.
Cuando usa algo como avr-gcc
, es consciente de la tabla de vectores de interrupción y su estructura, y se asegurará de que el vector de reinicio apunte al inicio de su programa. En este caso, el inicio del programa no es realmente su función main()
, sino una carga de cosas que el compilador agrega para inicializar variables y otras cosas. Pero después de todas las cosas de inicialización, se llamará a su función main()
.
Como ejemplo, esta es la tabla vectorial desensamblada para uno de mis programas:
0: 0c 94 72 00 jmp 0xe4 ; 0xe4 <__ctors_end>
4: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
8: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
c: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
10: 0c 94 4f 03 jmp 0x69e ; 0x69e <__vector_4>
14: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
18: 0c 94 ef 03 jmp 0x7de ; 0x7de <__vector_6>
1c: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
...
6c: 0c 94 8f 00 jmp 0x11e ; 0x11e <__bad_interrupt>
Observe cómo avr-gcc
agrega un salto en la dirección 0x0000 a lo que llama __ctors_end
, que es básicamente una dirección de memoria después del final de la tabla de vectores donde comienza el proceso de inicialización. Todos los vectores no utilizados saltan a algo llamado __bad_interrupt
, ubicado en el destino de ese salto, es básicamente otra instrucción de salto a 0x0000, por lo que cualquier ocurrencia de una interrupción no controlada restablece el procesador.
1. Algunos AVR tienen un espacio de cargador de arranque y pueden programarse para que la tabla de vectores de interrupción se encuentre en una dirección diferente a 0x0000, pero lo mismo sigue siendo válido.