En el microcontrolador (AVR), el vector de interrupción toma la dirección $ 0000 a $ 003A para que el programa se inicie después de esa dirección.

0

Estoy estudiando el microcontrolador utilizando la hoja de datos del microcontrolador Atmel de 8 bits. Según la hoja de datos, hay 3 tipos de memoria interna en el microcontrolador

  • Memoria flash = memoria del programa
  • SRAM: 32 El registro de propósito general y el registro de E / S se encuentran aquí
  • EEPROM

Entonces, cuando el contador del programa (PC) recupera la instrucción, se recuperará de la memoria flash donde está almacenado el programa (las instrucciones), comenzando desde $ 0000, pero luego cuando leo el capítulo de interrupción (ATmega 2560), dice que los vectores de interrupción son almacenado entre $ 0000 y $ 003A en la memoria del programa, ¿significa que cuando se inicie el microcontrolador, la PC pasará primero por la lista de vectores de interrupción y luego las instrucciones?

Además, la interrupción se habilita mediante instrucciones que vienen después de $ 003A, por lo que cuando la PC comienza desde $ 0000 a $ 003A, el microcontrolador no hace nada porque, en ese momento, ¿no se ha habilitado la intterupción?

Actualmente estoy usando dos hojas de datos, Atmel ATmega 2560 y ATmega 16A

    
pregunta aukxn

3 respuestas

7

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.

    
respondido por el Tom Carpenter
0

Cuando se desencadena una interrupción durante la ejecución de un programa (después de que debe haberlo configurado y programado para la interrupción, por supuesto) hay direcciones únicas en las que apuntará el contador de su programa, lo cual es específico para cada interrupción específica de su AVC. Resulta que estas direcciones se designan al comienzo de su memoria flash, como usted dijo desde 0x0000 (reinicio de interrupción) hasta 0x003A. Ahora cuando programa su AVR uC y luego inicia su programa con

.ORG 0  lo que ha hecho es decirle a su ensamblador que comience a colocar su programa desde la dirección 0x0000, hacia abajo ... mientras tanto, realmente ha escrito sus programas sobre esas direcciones de interrupción hacia abajo.

Ahora, ¿qué crees que sucederá si en el transcurso de la ejecución de tu programa has establecido una interrupción? Por diseño, su contador de programa (PC) debe apuntar a la dirección única de esa interrupción en particular que acaba de activarse, la cual generalmente se encuentra entre esas direcciones especificadas al comienzo de su memoria flash. Luego, al apuntar a esa dirección, ve una instrucción y luego comienza a ejecutarse, esa es la lógica. por lo tanto, lo que los programadores hacen es evitar esas direcciones y luego simplemente hacer una llamada a la función interrumpa la dirección si hay alguna interrupción en su programa que haya escrito.  Espero que esto ayude

    
respondido por el Gideon Mmeremnwanne
0

Puede colocar su punto de inicio en cualquier lugar después de la dirección del vector de restablecimiento.

Si usa interrupciones, querrá al menos mantenerse alejado de los vectores de interrupción que utiliza. Las interrupciones no planificadas, si ocurren, entrarán en tu código y probablemente serán malas. (!)

La mejor práctica es comenzar su código después de todo el bloque de vectores de interrupción. Por lo general, comienzo un proyecto con todos los vectores int rellenados con un JMP o RJMP (según el procesador) en una trampa para interrupciones erróneas, donde establezco un punto de interrupción durante el desarrollo. A medida que relleno los ISR, obtienen vectores a las ubicaciones apropiadas. Una vez hecho esto, todas las entradas no utilizadas quedan atrapadas y, a continuación, activan una falla en mi rutina de verificación de validez.

Puede colocar el punto de entrada en cualquier lugar más allá del bloque vectorial int. Es posible que desee colocar tablas entre el bloque de vectores int y el código, pero a menos que tenga una razón específica para hacerlo de otra manera, normalmente asigno las tablas desde el final del código.

    
respondido por el user103218

Lea otras preguntas en las etiquetas