El tamaño de la unidad de la tabla de vectores depende del chip que utilice. Por ejemplo, los chips ATTiny usan 2 bytes (1 instrucción) para cada vector en la tabla.
La razón para permitir el valor de múltiples instrucciones en los procesadores más grandes es permitir el uso de instrucciones más grandes.
Para un AVR, la RJMP
instrucción es una instrucción de 2 bytes para salto relativo; sin embargo, solo puede acceder a un desplazamiento de +/- 4kB desde la tabla de vectores. Esto está bien en los procesadores más pequeños con <8kB de Flash, ya que permite que las ISR (rutinas de servicio de interrupción) se coloquen en cualquier lugar dentro de la memoria flash. Sin embargo, para AVR más grandes, como el flash ATMega328 de 32kB, esto no es suficiente (*).
Para acceder al espacio flash completo, debe usar las JMP
instrucciones. Este es un salto directo que le permite acceder a hasta 4 MB de flash. Sin embargo, la JMP
instrucción 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 tiene que hacer es agregar un adicional NOP
después para completar la instrucción en dos palabras.
Además, no necesariamente tienes que saltar a ningún lado. Imagine que su ISR no tuviera que hacer nada más que configurar un bit 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 las banderas de ALU, puede dentro de una tabla de dos vectores de instrucciones construir su ISR completo ( SBI
instrucción seguida de RETI
instrucción) y ahorrar toda la sobrecarga de saltar a un ISR.
(*) En realidad es posible, aunque más lento, utilizar los llamados "trampolines". Este es básicamente un caso de colocar una sola JMP
instrucción en el flash dentro de un desplazamiento de +/- 4k de la tabla de vectores. La tabla de vectores contiene una RJMP
instrucción que salta a la JMP
instrucción cercana que, a su vez, salta a cualquier parte del flash.
JMP
se usa una instrucción, la dirección del ISR está incrustada dentro de la instrucción, es solo que la instrucción ocupa 4 bytes. Si se usa un trampolín en dispositivos con 2 bytes/vector en la tabla, entonces la RJMP
instrucción está en la tabla de vectores que almacena la dirección relativa de la JMP
instrucción que se coloca en otro lugar de la memoria. La JMP
instrucción todavía tiene la dirección del ISR incrustada dentro de ella.
pete becker