Uso del código compensado con dispositivos PIC®

Es una práctica común cuando se escriben cargadores de arranque y aplicaciones descargables para usar la función de compensación de código del compilador MPLAB® XC8 para asegurar que el código asociado con los vectores de reinicio e interrupción esté colocado correctamente. Sin embargo, al usar dispositivos PIC18 con el controlador de interrupción vectorial (VIC), debe tomar medidas adicionales para asegurarse de que los vectores de interrupción se coloquen como se espera. En este artículo, veremos cómo controlar el restablecimiento de su código y los puntos de entrada de interrupción para cualquier dispositivo PIC® de 8 bits que use interrupciones.

La figura (1a) muestra una representación simplificada de la memoria de programa de un PIC para un dispositivo PIC18 ordinario, con la dirección 0 en la parte superior. La dirección a la que se enviará el dispositivo al reiniciarse y las direcciones a las que se enviará el dispositivo en una interrupción de prioridad baja o alta se representan mediante las flechas a la izquierda. Estas direcciones están fijadas por hardware y nunca se pueden cambiar. Los dispositivos PIC de rango medio solo tienen una interrupción, sin embargo, funcionan de manera similar.


En cada dirección vectorial se encuentra una instrucción a la que se transfiere la ejecución cuando se produce el restablecimiento o la interrupción. A menudo, se trata de instrucciones de salto o goto que transfieren la ejecución del programa al código ubicado en otro lugar, como lo indican las flechas discontinuas y los bloques de colores más grandes en el diagrama. Sin embargo, en algunos casos, esta instrucción podría ser la primera de un bloque de código. El compilador rellena automáticamente la memoria del programa en estas direcciones vectoriales a partir de la información en el código fuente de su proyecto.

La Figura (1b) muestra lo que sucede cuando usa la opción de desplazamiento de código (-mcodeoffset en XC8 v2.x, o --codeoffset en v1.x compiladores). Observe que las direcciones de vectores no se mueven, ya que están fijadas por el hardware. Sin embargo, las instrucciones que estaban ubicadas en estas direcciones sí lo hacen. Es importante apreciar que en este punto, este programa no se ejecutará porque no hay un código válido en las direcciones de vectores. Es el trabajo de un cargador de arranque u otro código para transferir la ejecución a las instrucciones de compensación. Tenga en cuenta también que la mayor parte de las funciones ordinarias del programa no se ven afectadas directamente por esta opción. Sin embargo, el compilador garantiza que no estén vinculados en ningún lugar desde la dirección 0 a la dirección de desplazamiento de código.

La figura (2a) muestra un dispositivo PIC18 con el VIC. El restablecimiento del dispositivo se implementa según cualquier otro dispositivo PIC18, y nuevamente, la dirección del vector de restablecimiento está fijada por hardware. Sin embargo, estos dispositivos utilizan una gran tabla de direcciones de vectores de interrupción, en lugar de las interrupciones de prioridad alta y baja dual utilizadas por otros dispositivos. El compilador automáticamente llena la tabla con las direcciones (no las instrucciones) a las que el dispositivo debe llegar para la interrupción correspondiente a esa ubicación en la tabla. A diferencia de la dirección de vector de restablecimiento, la dirección base de la tabla de vectores que se utilizará en el tiempo de ejecución se especifica mediante el contenido combinado de los registros de IVTBASE, que se pueden escribir durante la ejecución del programa.


La figura (2b) muestra el efecto que la opción de compensación de código tiene en el programa. La opción mueve la instrucción de reinicio por el desplazamiento especificado, como con otros dispositivos, pero no tiene efecto en la tabla vectorial.

La Figura (2c) muestra un proyecto que ha movido la tabla vectorial, pero que NO ha usado la opción de compensación de código. Las funciones de interrupción en este proyecto se definieron utilizando un argumento base (dirección), y luego el registro IVTBASE se ajustó a este valor base. Un proyecto implementado de esta manera se ejecutará correctamente sin requerir ningún código adicional.
Si desea mover tanto la instrucción de restablecimiento como la tabla de interrupciones, como se muestra en la Figura (2d), entonces debe usar la opción de compensación de código, así como ajustar el registro IVTBASE y usar una dirección base modificada para las funciones de interrupción.

Los dispositivos con el VIC se pueden ejecutar en un modo heredado al deshabilitar el bit de configuración MVECEN. En este modo, funciona de manera similar a un dispositivo PIC18 sin interrupciones vectoriales. Puede ver en la Figura (3a) que no hay una tabla vectorial. Las instrucciones (en lugar de las direcciones) se encuentran en las direcciones de vector de interrupción de prioridad baja y alta, como ocurre con los dispositivos PIC18 ordinarios; sin embargo, en el modo heredado, las dos direcciones de vector de interrupción aún están controladas por el registro IVTBASE y no están fijadas por hardware. Esto significa que cuando se usa la opción de desplazamiento de código, como se muestra en la Figura (3b), solo se desplaza la instrucción asociada con el vector de reinicio. Si es necesario, las direcciones del vector de interrupción se pueden ajustar, como se muestra en la Figura (3c), usando un argumento base () al definir las funciones de interrupción, y ajustando el registro IVTBASE a este valor base y, una vez más, estos cambios en el las interrupciones y el uso de la opción de compensación de código son necesarios si desea mover el código asociado con los tres vectores, como se muestra en la Figura (3d).


Consulte la guía del usuario de su compilador para obtener información sobre cómo escribir funciones de interrupción y cambiar la ubicación de la tabla vectorial.

Fuente: Using Code offset with PIC® Devices

Comentarios

Entradas más populares de este blog

Resistencias

Guía de introducción de XC8

Prefijos del sistema internacional de medidas