Reubicación de la tabla de vectores en la aplicación del cargador de arranque

4

He escrito una aplicación de cargador de arranque para el microcontrolador Kinetis NXP. Las siguientes son las cosas que hice para hacer lo mismo: 1. Creé una aplicación de cargador de arranque en las direcciones CFlash 0x0000 a 0x8000 2. Creé mi código de aplicación principal de las direcciones 0x8000 a 0x1FFFF

Este código funciona bien. Ahora mi duda es que tengo ISRs tanto en el gestor de arranque como en el código principal de la aplicación y no usé ninguna reubicación de vector ISR. ¿Es necesario reubicar las tablas vectoriales en la aplicación principal?

PD: Es posible que no enfrente el problema solo porque los ISR en ambas aplicaciones son iguales.

    
pregunta Arun Kumar

3 respuestas

1

Sí: tienes que reubicar tu tabla vectorial, de lo contrario, las interrupciones dispararán a los manejadores del gestor de arranque, lo que casi con certeza provocará un bloqueo.

Primero, modifica la secuencia de comandos del vinculador para "mover el flash" un poco más alto (por ejemplo, 0x8000 en su caso), esto también significará que la nueva tabla de vectores comienza en 0x8000, a menos que lo elimine todo junto y lo coloque en la RAM, pero ese es un tema ligeramente diferente (recuerde el requisito de alineación de 256 bytes para el NVIC en ese caso).

Normalmente utilizo un código como este para saltar a la aplicación:

#define APPLICATION_BASE 0x8000
__attribute__((noreturn)) static void start_application(void){

    SCB->VTOR = APPLICATION_BASE; //move interrupt vector base
    typedef void (*function_void_t)(void);
    #define avuint32(avar) (*((volatile uint32_t *) (avar)))

    function_void_t application;
    application = (function_void_t)(avuint32(APPLICATION_BASE+4));

    __DSB();
    application();
    __builtin_unreachable();
}

El "salto" se desplaza en 4 porque la primera palabra en el blob es el puntero de pila inicial, la segunda palabra es el vector de restablecimiento de la aplicación. Este código hará que la aplicación use la pila del gestor de arranque, por lo que es posible que tenga que modificarla un poco (algunos bytes de la pila se perderán porque fueron utilizados por el gestor de arranque).

    
respondido por el filo
0

El último paso que debe realizar su gestor de arranque antes de pasar el control a la dirección de inicio de su aplicación es inicializar el registro LR y luego apuntar la tabla de vectores de la MCU a la tabla de vectores de la aplicación.

    
respondido por el akohlsmith
0

No es necesario reubicar la tabla de vectores: la cadena de herramientas debería ubicar correctamente su tabla de vectores en su binario, pero sí debe indicar a la MCU dónde se ubica la tabla de vectores correcta, así como el lugar donde debería comenzar el puntero de pila, cuando salta del cargador de arranque a la aplicación. De forma predeterminada, en los núcleos ARM, la tabla de vectores se encuentra al principio de su aplicación binaria. La primera entrada será el puntero de pila inicial, y la segunda será el vector de restablecimiento (el punto de entrada de la aplicación). El resto de las entradas están definidas por la arquitectura específica de ARM y la implementación específica.

Al iniciarse o reiniciarse el hardware, el hardware inicializará el Registro de compensación de la tabla de vectores en 0x00000000, establecerá el puntero de pila en el primer valor de la tabla de vectores y luego saltará a la ubicación indicada en la segunda entrada de la tabla. Pero cuando saltas de un gestor de arranque a la aplicación, debes hacer cada una de esas cosas por ti mismo.

    
respondido por el ajb

Lea otras preguntas en las etiquetas