Tabla de vectores de reasignación en STM32F0 (sin registro de desplazamiento de vector)

1

He escrito un bootloader antes para un STM32 que tenía soporte para el vector offset y es fácil de usar.

Para STM32F0xx usando HAL, leo que necesito mover la tabla de vectores para grabar y copiar desde flash. He hecho hasta donde sé todos los pasos descritos aquí:

enlace

Puedo saltar del cargador de arranque a la aplicación, pero en el momento en que se produce una interrupción, se bloquea.

Sin embargo, lo ÚNICO que no he hecho es usar el script del vinculador. He cambiado como sigue la configuración:

Yheseleccionado"Diseño de memoria de usuario desde dialgo de destino" en Vinculador en la configuración del proyecto. Si trato de usar el script del enlazador simplemente escribiendo):

MEMORY
{
VTRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192
RAM (xrw) : ORIGIN = 0x200000C0, LENGTH = 32K-192
FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 256K-32K
}

Me sale el error:

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
linking...
.\Objects\DimmerBackend.axf: Warning: L6914W: option ropi ignored when using --scatter.
.\Objects\DimmerBackend.axf: Warning: L6914W: option rwpi ignored when using --scatter.
.\App2.sct(2): error: L6226E: Missing base address for region MEMORY.
.\App2.sct: Error: L6630E: Invalid token start expected number or ( but found x at position 8 on line 3
.\App2.sct: Error: L6629E: Unmatched parentheses expecting ) but found x at position 8 on line 3
.\App2.sct: Error: L6226E: Missing base address for region VTRAM.
.\App2.sct(3): error: L6292E: Ignoring unknown attribute 'xrw' specified for region VTRAM.
.\App2.sct(3): error: L6228E: Expected '{', found ')...'.
.\App2.sct(3): error: L6228E: Expected '}', found 'EOF'.
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 2 warning and 7 error messages.
".\Objects\DimmerBackend.axf" - 7 Error(s), 2 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

Sin el script del enlazador puedo ir a la aplicación pero fallar en las interrupciones. Por lo tanto, asumo que de alguna manera se necesita este mágico VTRAM misterioso.

Mis preguntas son entonces:

  • ¿Qué es este VTRAM?
  • ¿Por qué no puedo usar ese script de vinculador?
  • ¿Cómo se genera automáticamente un script de vinculador? No creo que la gente las escriba por sí mismas.
pregunta Carlos

1 respuesta

2

En ese script de vinculador, VTRAM es solo un área arbitraria en la RAM (las direcciones que comienzan en 0x20000000 están en la RAM), donde almacena los punteros a sus ISR.

Como lo menciona el tutorial, usted usa la entrada en el archivo del vinculador para decirle al enlazador que esos 192 bytes están fuera de los límites para su uso como RAM normal. Si no usa un archivo de vinculador personalizado, el vinculador usa el valor predeterminado: puede usar toda la memoria para cualquier propósito. Esto significaría que esos punteros se sobrescriben con datos. Cuando se produce un ISR, intenta saltar a la dirección en la tabla de vectores, que se ha sobrescrito y ahora es basura.

El archivo enlazador en el tutorial es para GCC. Su captura de pantalla indica que usa el IDE de Keil, que usa armcc, y no acepta la sintaxis. Usted debe:

a. Comience a usar GCC (*)

b. "Traducir" el archivo de vinculación GCC a un "archivo de dispersión" (lo que usa armcc).

c. Intente declarar un área de solo lectura IROM2 en la GUI (comience en 0x20000000, tamaño 192), luego en el código declare algo así como

volatile uint32_t VectorTable[] __attribute__((at(0x20000000))) = {
     FIRMWARE_START_ADDR,
     FIRMWARE_START_ADDR + 4,
     FIRMWARE_START_ADDR + 8,
     .....
};

El "en" pragma le dice al compilador / vinculador que coloque la matriz de punteros en la ubicación deseada.

Ambos tienen razón y están equivocados de que "las personas no escriben [los archivos del enlazador] ellos mismos" . Lo hacen, pero normalmente cambiando una plantilla. Si decides traducir a un archivo de dispersión, te sugiero que busques un ejemplo y lo modifiques para que se ajuste a tu caso.

(*) técnicamente solo necesitas llamar al enlazador GNU; es posible que pueda compilar con Keil / armcc y conectarse con el enlazador GNU, pero no puedo imaginar que valga la pena el esfuerzo

    
respondido por el Makotanist

Lea otras preguntas en las etiquetas