Estoy trabajando en el cargador de arranque pic24EP. Mi gestor de arranque tiene su propio formato de paquete para comunicarse con un script de python para actualizar el firmware del microcontrolador. El bootloader reside en la primera página libre después de la tabla de vectores de interrupción (0x000800). Para hacer espacio para la aplicación, he editado el linker script de mi aplicación firmware para que el archivo hexadecimal de la aplicación no utilice ningún espacio entre 0x200 y 0x005BF0. El linker script del proyecto de aplicación se da a continuación:
/*
** Memory Regions
*/
MEMORY
{
data (a!xr) : ORIGIN = 0x1000, LENGTH = 0x8000
reset : ORIGIN = 0x0, LENGTH = 0x4
ivt : ORIGIN = 0x4, LENGTH = 0x1FC
program (xr) : ORIGIN = 0x6000, LENGTH = 0x23FFE
FICD : ORIGIN = 0x2AFF0, LENGTH = 0x2
FPOR : ORIGIN = 0x2AFF2, LENGTH = 0x2
FWDT : ORIGIN = 0x2AFF4, LENGTH = 0x2
FOSC : ORIGIN = 0x2AFF6, LENGTH = 0x2
FOSCSEL : ORIGIN = 0x2AFF8, LENGTH = 0x2
FGS : ORIGIN = 0x2AFFA, LENGTH = 0x2
FUID0 : ORIGIN = 0x800FF8, LENGTH = 0x2
FUID1 : ORIGIN = 0x800FFA, LENGTH = 0x2
FUID2 : ORIGIN = 0x800FFC, LENGTH = 0x2
FUID3 : ORIGIN = 0x800FFE, LENGTH = 0x2
}
__FICD = 0x2AFF0;
__FPOR = 0x2AFF2;
__FWDT = 0x2AFF4;
__FOSC = 0x2AFF6;
__FOSCSEL = 0x2AFF8;
__FGS = 0x2AFFA;
__FUID0 = 0x800FF8;
__FUID1 = 0x800FFA;
__FUID2 = 0x800FFC;
__FUID3 = 0x800FFE;
__CODE_BASE = 0x6000;
__CODE_LENGTH = 0x23FFE;
__IVT_BASE = 0x4;
__DATA_BASE = 0x1000;
__DATA_LENGTH = 0x8000;
Parece que mi gestor de arranque rechaza el firmware (archivo hexadecimal) en algún momento, ya que tiene la dirección en entre 0x200 y 0x005BF0 pero he editado la aplicación linker script para utilizar sólo las direcciones por encima de 0x6000 mediante la modificación de las variables: __CODE_LENGTH y programa.
El mapa de memoria de mi micro-controlador es el siguiente:
El tamaño de flash es de 256kB y el tamaño de página es de 1024 instrucciones (1024*4 Bytes). El archivo hexadecimal es de más de ici . Y la secuencia de comandos del enlazador ha terminado ici .
EDITAR: He resuelto mi problema. Parece que PIC utiliza un ligeramente diferente HEX File Format
que INTEL
. Las direcciones en el archivo HEX son 2 veces la dirección real en PIC
. Por lo tanto, tengo que dividir la dirección en el archivo hexadecimal por 2 para obtener la dirección flash del microcontrolador PIC.
Sin embargo, he identificado un nuevo problema con mi sistema. No puedo publicar una nueva pregunta. Por lo tanto, estoy añadiendo aquí. Ahora, mi aplicación (bien probado) cargado a través de bootloader funciona hasta que cualquier interrupción se dispara. Si cualquier interrupción se dispara, se cuelga. Todo lo que puedo comprobar es que no termina en ninguna trampa. ¿Puede alguien indicarme la dirección correcta?