dsPIC33: el cargador de arranque está parpadeando pero se reinicia cuando el firmware GOTO

0

Así que estoy trabajando en un cargador de arranque para un dsPIC33EP32MC504 con un bus CAN y el cargador de arranque muestra el firmware correctamente. Lo verifiqué leyendo la memoria del programa en la ubicación donde lo coloqué y lo comparé con el aspecto del firmware cuando se emite a través de una herramienta de programación.

El problema ahora es que el microcontrolador no me deja saltar a la dirección del firmware. Cuando se ejecuta el comando, el microcontrolador simplemente se reinicia y comienza a 0x000000 nuevamente, lo que salta a 0x000200 donde está el gestor de arranque.

Probé dos tipos diferentes de saltos a saltos:

1 .: Código asm en línea

asm("goto 0x1C00");

2 .: puntero a función

//first defining the pointer
firmware_ptr = (void (*)(void))0x1C00;
//...
//later using the function
firmware_ptr();

Desafortunadamente, ambas formas llevan al mismo resultado como se describe anteriormente

Otra cosa que intenté es dar un código de base al firmware mediante la manipulación del script del enlazador y solo programar el firmware al microcontrolador a través del PICkit3 y sin el cargador de arranque. Manipulé las dos líneas mencionando el inicio del programa en el script del vinculador:

/*
** Memory Regions
*/
MEMORY
{
  data  (a!xr)   : ORIGIN = 0x1000,        LENGTH = 0x1000
  reset          : ORIGIN = 0x0,           LENGTH = 0x4
  ivt            : ORIGIN = 0x4,           LENGTH = 0x1FC
  program (xr)   : ORIGIN = 0x1C00,         LENGTH = 0x55EC  /*here*/
  FICD           : ORIGIN = 0x57F0,        LENGTH = 0x2
  FPOR           : ORIGIN = 0x57F2,        LENGTH = 0x2
  FWDT           : ORIGIN = 0x57F4,        LENGTH = 0x2
  FOSC           : ORIGIN = 0x57F6,        LENGTH = 0x2
  FOSCSEL        : ORIGIN = 0x57F8,        LENGTH = 0x2
  FGS            : ORIGIN = 0x57FA,        LENGTH = 0x2
  FUID0          : ORIGIN = 0x800FF8,      LENGTH = 0x2
  FUID1          : ORIGIN = 0x800FFA,      LENGTH = 0x2
  FUID2          : ORIGIN = 0x800FFC,      LENGTH = 0x2
  FUID3          : ORIGIN = 0x800FFE,      LENGTH = 0x2
}

__FICD = 0x57F0;
__FPOR = 0x57F2;
__FWDT = 0x57F4;
__FOSC = 0x57F6;
__FOSCSEL = 0x57F8;
__FGS = 0x57FA;
__FUID0 = 0x800FF8;
__FUID1 = 0x800FFA;
__FUID2 = 0x800FFC;
__FUID3 = 0x800FFE;
__NO_HANDLES = 1;          
__CODE_BASE = 0x1C00;      /*And here*/
__CODE_LENGTH = 0x55EC;
__IVT_BASE  = 0x4;

__DATA_BASE = 0x1000;
__DATA_LENGTH = 0x1000;
__YDATA_BASE = 0x1800;

Desafortunadamente, ocurre lo mismo: siempre se restablece y nunca se ejecuta

Más información sobre el cargador de arranque y el firmware: ni el cargador de arranque ni el firmware utilizan interrupciones, por lo que el IVT está vacío. El cargador de arranque se programa a través de un PICkit3 al comienzo de la memoria del programa (en 0x0200) y el firmware debe comenzar en 0x1C00. El firmware es solo un pequeño firmware de prueba que consta de 203 palabras y funciona bien cuando se programa normalmente a través del PICkit3 en 0x0200. En la secuencia de comandos de python que utilizo para calcular las direcciones y las palabras del archivo .hex, solo transmito las palabras y direcciones relacionadas con el firmware al cargador de arranque, no a la IVT o al vector de reinicio. Los bits de configuración del firmware y del cargador de arranque son los mismos. Uso el compilador XC16 versión 1.35 para firmware y cargador de arranque

Dado que me estoy quedando sin ideas, ¿cuál podría ser el problema? Creo que me he perdido algo con respecto a la organización de la memoria del programa en la serie dsPIC33E o con respecto a la conexión interna entre el puntero del programa, la memoria del programa y la IVT

    
pregunta Erik Zan

1 respuesta

1

Esto es lo que funciona para mí:

void PIC_LongJump( uint32_t Addr )
{
    __asm__ ("push.d %0" : : "r"(Addr));
    __asm__ ("return" : : );
}
    
respondido por el Dan1138

Lea otras preguntas en las etiquetas