AVR: por qué cada vector de interrupción ocupa dos palabras de instrucción

3

Durante mi estudio de la hoja de datos de Atmega328, descubrí que cada vector de interrupción ocupa dos direcciones y, después de buscar, no puedo encontrar el motivo.

Esta es una captura de pantalla de la página 82 de la hoja de datos de atmega328p

    
pregunta M Y

1 respuesta

5

El tamaño de la unidad de la tabla de vectores depende del chip que uses. Por ejemplo, los chips ATTiny usan 2 bytes (1 instrucción) para cada vector en la tabla.

El motivo para permitir el uso de instrucciones más grandes en los procesadores más grandes es para permitir el uso de instrucciones más grandes.

Para un AVR, la instrucción RJMP es una instrucción de 2 bytes para el salto relativo; sin embargo, solo puede acceder a un desplazamiento de +/- 4kB desde la tabla vectorial. Esto está bien en los procesadores más pequeños con < 8kB de Flash, ya que permite colocar ISR (Rutinas de servicio de interrupción) en cualquier lugar dentro de la memoria flash. Sin embargo, para AVR más grandes, como el flash ATM322 de 32kB, esto no es suficiente (*).

Para acceder al espacio completo del flash, necesita usar la instrucción JMP . Este es un salto directo que le permite acceder a hasta 4 MB de flash. Sin embargo, la instrucción JMP es en realidad una instrucción de 4 bytes. Para usarlos en la tabla de vectores, debe permitir 2 palabras de instrucción para cada vector. Y esto es justo lo que hacen.

Todavía es perfectamente posible usar RJMP o cualquier otra instrucción de una sola palabra dentro de una tabla de vectores de dos palabras. Todo lo que debe hacer es agregar un NOP adicional después de que rellene la instrucción con dos palabras.

Además, no necesariamente tienes que saltar a ninguna parte. Imagine que su ISR no debía hacer nada más que establecer un poco en un registro IO. En un AVR, si el registro está dentro del rango, puede usar la instrucción SBI o CBI para hacer esto. Debido a que eso no tiene ningún efecto secundario en los indicadores ALU, dentro de una tabla de vectores de dos instrucciones, puede construir su ISR completo (instrucción SBI seguido de la instrucción RETI ) y guardar toda la sobrecarga de saltar a un ISR.

(*) En realidad es posible, aunque más lento, usar lo que se llama "trampolines". Este es básicamente un caso de colocar una sola instrucción JMP en el flash dentro del desplazamiento de +/- 4k de la tabla vectorial. La tabla de vectores contiene una instrucción RJMP que salta a la instrucción JMP cercana que a su vez salta a cualquier parte del flash.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas