Autor Tema: ¿Porqué no puedo crear una constante en la memoria de programa con bootloader?  (Leído 5651 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
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:

Código: C
  1. #define FLASH_START (0x9d000000UL)
  2.  #define FLASH_LENGTH (0x100000UL)
  3. #define PAGE_SIZE (2048UL)
  4. #define ERASE_BLOCK_SIZE (16384UL)
  5. #define PAGES_IN_ERASE_BLOCK (ERASE_BLOCK_SIZE / PAGE_SIZE)
  6.  #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:

Código: C
  1. 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:

Código: C
  1. const unsigned char clientcredentialIOT_THING_NAME [] =
  2. "-----BEGIN CERTIFICATE-----\n\
  3. MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n\
  4. ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n\
  5. b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n\
  6. -----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:

Código: [Seleccionar]
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?
« Última modificación: 26 de Noviembre de 2021, 11:09:55 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #1 en: 26 de Noviembre de 2021, 11:45:39 »
¿Puede ser que cuando quemaste el boltloader hayas configurado write protect en regiones que afectan a ese rango vía fuses?

 

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #2 en: 26 de Noviembre de 2021, 11:57:01 »
¿Puede ser que cuando quemaste el boltloader hayas configurado write protect en regiones que afectan a ese rango vía fuses?

Gracias por responder.

Eso de la protección contra escritura es cuando en el código utilizas instrucciones para escribir en la memoria flash, en este caso es una constante que se crea en el hexadecimal.

También, si dicha protección estuviera habilitada, el bootloader no podría actualizar (escribir) la memoria de programa, y eso si lo hace.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #3 en: 27 de Noviembre de 2021, 16:07:04 »
Hola.

Creo que lo he conseguido.

Lo primero que se debe hacer es quitar el visto al checkbox de las caracterizas del archivo ld que permiten quitar regiones no usadas:

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #4 en: 27 de Noviembre de 2021, 16:07:52 »
Luego, se compila el proyecto y la constante está ahí:

« Última modificación: 27 de Noviembre de 2021, 23:19:48 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #5 en: 27 de Noviembre de 2021, 16:08:45 »
El único inconveniente es que el tamaño del bootloader puede incrmeentarse debido a que se agrega código que posiblemente no se utilice.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #6 en: 27 de Noviembre de 2021, 16:52:03 »
Un define... y considerarlo una constante en memoria.... esta lejos de lo que es correcto.
« Última modificación: 27 de Noviembre de 2021, 16:57:38 por KILLERJC »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #7 en: 27 de Noviembre de 2021, 16:53:18 »
Un define... y considerarlo una constante en memoria.... esta lejos de lo que es correcto.
¿Cómo?  :shock:
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #8 en: 27 de Noviembre de 2021, 17:21:50 »
Perdon.. no vi que antes lo definias como:

const char __attribute__((space(prog), address(FLASH_END_ADDRESS))) nombreObjeto[] = clientcredentialIOT_THING_NAME;

Lo dije por que un define es simplemente una directiva de pre-procesamiento, por lo cual se ejecuta antes de cualquier compilación reemplazando lo anterior por lo siguiente:

const char __attribute__((space(prog), address(FLASH_END_ADDRESS))) nombreObjeto[] = "W00001";

Y recién ahí compilarlo. Y ahora si ocupa un espacio físico.

Despues modifique el comentario para decir que seguramente no estes usando esa constante, y por lo tanto el compilador la esta quitando de la memoria, porque no tiene sentido mantenerla.

Probaste agregando el modificador "volatile" a tu variable?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #9 en: 27 de Noviembre de 2021, 17:35:23 »
Perdon.. no vi que antes lo definias como:

const char __attribute__((space(prog), address(FLASH_END_ADDRESS))) nombreObjeto[] = clientcredentialIOT_THING_NAME;

Lo dije por que un define es simplemente una directiva de pre-procesamiento, por lo cual se ejecuta antes de cualquier compilación reemplazando lo anterior por lo siguiente:

const char __attribute__((space(prog), address(FLASH_END_ADDRESS))) nombreObjeto[] = "W00001";

Y recién ahí compilarlo. Y ahora si ocupa un espacio físico.

Despues modifique el comentario para decir que seguramente no estes usando esa constante, y por lo tanto el compilador la esta quitando de la memoria, porque no tiene sentido mantenerla.

Probaste agregando el modificador "volatile" a tu variable?

¿Volatile es para una constante en RAM?

En mi caso yo necesito que esté almacenada en la memoria flash dicha constante ya que es diferente por cada microcontrolador.

Creo que con lo que expliqué anteriormente es suficiente por ahora. Lo ideal es aprovechando que tengo comunicación Ethernet con el hardware, mediante una aplicación debería enviar esas constantes al MCU desde una app de usuario (móvil o PC) para que el MCU escriba en la memoria de programa dichas constantes.

También fue de ayuda el foro de MCHP donde también hice la pregunta:

https://www.microchip.com/forums/m1192541.aspx#1192615

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #10 en: 27 de Noviembre de 2021, 17:46:07 »
En realidad volatile fuerza al compilador a buscar la variable siempre que sea necesario porque puede cambiar...

Entonces volatile const no tiene sentido...
Pero... Tambien logramos con ese volatile evitar el optimizador, que si encuentra una variable que nunca va a ser llamada, la elimina.
La idea del volatile era eso... ver si era el optimizador quien estaba quitando esas variables y no destildar "Remove Unused parts" que es mas general.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Porqué no puedo crear una constante en la memoria de programa con bootloader?
« Respuesta #11 en: 27 de Noviembre de 2021, 19:26:47 »
En realidad volatile fuerza al compilador a buscar la variable siempre que sea necesario porque puede cambiar...

Entonces volatile const no tiene sentido...
Pero... Tambien logramos con ese volatile evitar el optimizador, que si encuentra una variable que nunca va a ser llamada, la elimina.
La idea del volatile era eso... ver si era el optimizador quien estaba quitando esas variables y no destildar "Remove Unused parts" que es mas general.

Hola

He intentado con tu sugerencia, pero creo que el compilador no lo comprende, por lo menos no el XC32 v 3.00.

De todas maneras, gracias por escribir
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything