Gestión de direcciones de rutinas de servicio de interrupción y funciones del programa en cortex M0

2

Estoy trabajando con nordic nRF51422 uC con cortex M0 core y tengo que almacenar datos en la memoria no volátil, pero para hacerlo correctamente necesito información en la que el código del programa se almacena en flash.

La tabla de vectores está fija en la dirección 0x00000000 y me indica el inicio de cada rutina de servicio de interrupción que he implementado, pero me cuesta encontrar información sobre la longitud de cada ISR. También sería útil saber dónde comienza y termina cada función del programa.

Resumiendo, ¿hay alguna manera fácil de ver cómo se mapea el código del programa en flash? ¿Es el compilador dependiente? ¿Puedo establecer mis propios límites para cada función? ¿Hay algún mecanismo que permita verificar dinámicamente la dirección final del código mientras se ejecuta el programa en la unidad uC?

    
pregunta Al Bundy

1 respuesta

2

El enfoque común es hacer una matriz constante que contenga los valores apropiados (SP inicial, PC inicial = dirección del código de inicio, direcciones de las rutinas de servicio de interrupción) y usar algo de magia dependiente del compilador para forzar al vinculador a colocar este matriz en la dirección 0.

Un ejemplo en gcc (de mi enlace ):

void (* const __vectors[ 8 ])(void) 
__attribute__ ((section(".vectors"))) = {
   (void (*)(void)) & __stack_end,  
   __startup,
   // interrupt verctors etc.
};

El __ atributo__ ((sección (". vectores")) marca esta matriz como parte de una sección llamada "vectores". El linkerscript correspondiente asegura que esa sección se coloca primero en la memoria flash:

MEMORY
{
   rom (rx)     : org = ROM_START, len = ROM_SIZE
   ram (rwx)    : org = RAM_START, len = RAM_SIZE
   nul (rwx)    : org = 0x20000000, len = 0k
}
. . . 
SECTIONS
{
   .text :
   {

       . = ALIGN(4);
       KEEP(*(.vectors));
       . . .
       # other sections come here  (= the rest of your code)

En situaciones normales, esto es algo que su proveedor / creador / creador de herramientas ha hecho por usted.

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas