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