2 votos

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

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

La tabla de vectores está fijada 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 de cuál es la longitud de cada ISR. También sería útil saber dónde empieza y termina cada función del programa.

Resumiendo, ¿hay alguna forma fácil de espiar cómo se mapea el código del programa en flash? ¿Depende del compilador? ¿Puedo establecer mis propios límites para cada función? ¿Existe algún mecanismo que permita comprobar dinámicamente la dirección final del código mientras se ejecuta el programa en el uC?

2voto

GetFree Puntos 495

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

Un ejemplo en gcc (de mi http://www.voti.nl/bmptk ):

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

El atributo __ ((section(".vectors")) marca esta matriz como parte de una sección llamada "vectors". El linkerscript coincidente 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/constructor/creador de herramientas ha hecho por usted.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X