ESP8266 y GCC

1

Creo que esto está más relacionado con GCC que con ESP8266. He estado tratando de poner una variable constante en la sección de memoria de solo lectura de ESP. La idea es cambiar el valor directamente en la imagen binaria antes de actualizarlo en un nuevo chip. En la sección de código, he añadido,

const uint32_t device_address __attribute__((section(".device_addr"))) = 0x12345678;

Los cambios en el script del vinculador en program.ld son; creó una nueva región de memoria

device_addr_section :           org = 0x40202100, len = 0x04

En la región SECCIONES, se agregó una nueva sección

.addr_section: ALIGN(4)
{
    KEEP(*(.device_addr))
} >device_addr_section

Cuando compilo el código con el nuevo enlazador, veo los cambios y la asignación en el archivo de mapa, pero no puedo encontrar el valor hexadecimal 0x12345678 en la imagen binaria generada. Cuando elimino el atributo de la variable device_address, veo ese valor hexadecimal en la imagen binaria generada. El desglose de la región de memoria completa:

MEMORY
{
  dport0_0_seg :                        org = 0x3FF00000, len = 0x10
  dram0_0_seg :                         org = 0x3FFE8000, len = 0x14000
  iram1_0_seg :                         org = 0x40100000, len = 0x08000
/* irom0 section, mapped from SPI flash
  - Origin is offset by 0x2010 to create spacer for second stage bootloader image,
    header.

  - Length is max 8Mbit of mappable flash, minus start offset
*/
  irom0_0_seg :                         org = 0x40202010, len = (1M - 0x2020)
  device_addr_seg  (rx):                org = 0x40202100, len = 0x04
}

No he usado GCC en el pasado, se agradecería cualquier idea y ayuda.

Gracias, Nishant

    
pregunta agnishant

1 respuesta

1

Tienes esto en tu memoria:

irom0_0_seg :          org = 0x40202010, len = (1M - 0x2020)
device_addr_seg  (rx): org = 0x40202100, len = 0x04

Eso es un bloque de memoria de 0x40202010 a 0x402FFFFF0. Dentro de eso, entonces tienes otro bloque de 0x40202100 a 0x20202104.

.----------.
|0x40202010|
|          |
|0x40202100| <- Device address lost
\          \
\          \
|0x402FFFEC|
'----------'

Eso no puede suceder. Tienes un área de memoria (irom0_0_seg) que cubre completamente la otra (device_addr_seg) y cualquier cosa en device_addr_seg será sobrescrita por irom0_0_seg.

Tiene que reservar un área específica para la dirección de su dispositivo que no esté dentro de irom0_0_seg. Eso significa reducir el tamaño del segmento irom0_0 para dejar un espacio que pueda rellenar con la dirección del dispositivo.

Ya tienes una pequeña brecha en la parte superior (no sé de antemano por qué?), pero si no se usa para algo, entonces puedes usarlo; de lo contrario, puedes expandirlo hacia abajo y usar el nuevo espacio:

irom0_0_seg :          org = 0x40202010, len = (1M - 0x2030)
device_addr_seg  (rx): org = 0x402FFFE0, len = 0x04

.----------.
|0x40202010|
\          \
\          \
|0x402FFFDC|
+----------+
|0x402FFFE0| <- Device address here
|0x402FFFE4|
|0x402FFFE8|
|0x402FFFEC|
'----------'

El propósito del mapa de memoria es cortar la memoria como un pastel, o mejor aún, una barra de pan. No puede quitar una rebanada del centro de la barra y mantener la barra como un solo elemento: tan pronto como retire la rebanada, obtendrá una rebanada y dos medias barras más pequeñas. Estabas tratando de quitar la porción del medio mientras aún la mantuviste como una sola hogaza grande, eso nunca será posible. Así que haces lo que cualquier persona sensata hace cuando corta el pan y corta una rebanada de un extremo, no del medio.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas