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.