Hola.
Tengo un proyecto con el PIC32MZ1024EFM100 con comunicación vía Ethernet. Utilizo un bootloader UDP para actualizar el firmware de la aplicación de usuario, todo esto funciona muy bien.
Ahora deseo reservar una región de la memoria de programa en el proyecto bootloader, para que dicho proyecto no la borre cuando actualice el firmware.
Para preservar la región en la memoria de programa, hago lo siguiente en el proyecto bootloader:
#define FLASH_START (0x9d000000UL)
#define FLASH_LENGTH (0x100000UL)
#define PAGE_SIZE (2048UL)
#define ERASE_BLOCK_SIZE (16384UL)
#define PAGES_IN_ERASE_BLOCK (ERASE_BLOCK_SIZE / PAGE_SIZE)
#define FLASH_END_ADDRESS (FLASH_START + FLASH_LENGTH) - 0x1040 //4k con 64 bytes es el espacio preservado
En el proyecto bootloader, yo creo una arreglo constante de tipo char:
const char __attribute__((space(prog), address(FLASH_END_ADDRESS))) nombreObjeto[] = clientcredentialIOT_THING_NAME;
Donde clientcredentialIOT_THING_NAME es una definición en un archivo h:
const unsigned char clientcredentialIOT_THING_NAME [] =
"-----BEGIN CERTIFICATE-----\n\
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n\
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n\
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n\
-----END CERTIFICATE-----\n";
El bootloader se compila sin problemas pero cuando visualizo la región preservada con MPLAB X, el arreglo no está creado, es decir la región preservada está vacía.
Si este mismo proceso hago en la proyecto aplicación de usuario, y visualizo con MPLAB X la región preservada, el arreglo está ahí.Sospecho que el bootloader no tiene acceso a dicha región de programa, a pesar que la región preservada ha sido definida en el archivo de vinculación ld:
protected_reg : ORIGIN = 0x9FC14000, LENGTH = 0x20000-0x14000
kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x480
kseg1_boot_mem_4B0 : ORIGIN = 0xBFC004B0, LENGTH = 0x1000 - 0x4B0
espacio_preservado (rw) : ORIGIN = 0x9D0FEFC0, LENGTH = 0x1040
¿Alguna idea, sugerencia o comentario?