1 votos

Poner los datos guardados en la flash de la STM32 al final de todas las demás secciones

Quiero emular la EEPROM sobre la flash del STM32F103. ¿Hay alguna manera de utilizar toda la flash libre en lugar de la única página? ¿Cómo puedo inicializar el punto de inicio de mi emulación de EEPROM para que sea después de todas las secciones? He tratado de añadir la sección después de .text como

.text: ...

.myvars :
{
. = ALIGN(1024);
KEEP(*(.myvars));
KEEP(*(.myvars*));
} > rom

y definir la variable como

__attribute__((section(".myvars"))) static const flash_storage Flash_Storage = {
    .magick = "1234567890absdef0987654321",
    .all_stored = USERCONF_INITIALIZER
};

pero no me ayuda: veo algunos datos más después de esta estructura en el volcado binario.

UPD La solución de este problema es bastante sencilla. La sección .myvars debe estar después de la última sección de la rama, es decir después de .data ¡!

0 votos

Aquí hay un enlace a ST Emulación EEPROM por si no lo has visto. Puede haber ideas en su código fuente.

0 votos

@bitsmack, suena raro, pero no encuentro fuentes de la emulación EEPROM de ST. En el RM no hay nada sobre la estructura de la memoria.

0 votos

Su sitio web es muy extraño :). Aquí está el paquete de software para microcontroladores STM32F103/105.

1voto

Prozaker Puntos 121

La solución más sencilla de este problema es poner la sección .myvars después de la última sección en ram . En mi caso debería ser después de la sección .data . El archivo completo del enlazador:

MEMORY
{
    rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}

ENTRY(reset_handler)

SECTIONS {
  .vector_table 0x08000000 :
  {
    _sisrvectors = .;
    KEEP(*(.vector_table))
    /* ASSERT(. == _isrvectors_tend, "The vector table needs to be 84 elements long!"); */
    _eisrvectors = .;
  } >rom

  .text :
  {
    . = ALIGN(4);
    _stext = .;
    *(.text*)
    *(.rodata*)
    . = ALIGN(4);
    _etext = .;
  } >rom

  .ARM.extab :
  {
    *(.ARM.extab* .gnu.linkonce.armextab.*)
  } >rom

  .ARM : {
    *(.ARM.exidx*)
  } >rom

  .data :
  {
    . = ALIGN(4);
    _sdata = .;
    *(.data*)
    . = ALIGN(4);
    _edata = .;
  } >ram AT >rom

  .myvars :
  {
    . = ALIGN(1024);
    KEEP(*(.myvars))
  } > rom

  _ldata = LOADADDR(.data);

  .bss :
  {
    . = ALIGN(4);
    _sbss = .;
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    _ebss = .;
  } >ram
}

PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram));

Aquí está el código .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X