Martin schrieb:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 126K
FLASH_CONFIG (rw) : ORIGIN = 0x0801F800, LENGTH = 2K
Das muss aber auch (r) oder (rx) sein, denn für Linker und Compiler
sind das erstmal konstante Daten. Das Löschen und Beschreiben geht am
Linker/Compiler vorbei.
}
.config_section :
{
. = ALIGN(4);
KEEP(*(.config_section))
. = ALIGN(4);
} > FLASH_CONFIG
Das zeigt mir zumindest schonmal beim kompilieren die Flash Sektion
FLASH_CONFIG in der Belegungsübersicht.
Dann habe ich gerade mal versucht eine Variable dorthin zu setzen:
static uint8_t flashvariable attribute((section(".config_section")))
= 45;
Das fehlt das 'const'.
beliebig ist. Bei einem alignment von 4 bytes werden für ein uint8_t
auch 4 bytes benutzt. Kann ich das auf 1 setzen?
Statt darüber nachzudenken, wäre es sinnvoller, alle Konfigurationsvariablen in eine struct zu packen, dann kann man ggf. über 'packed' Platz sparen.
Und dann diese struct vom EEPROM ins RAM kopieren, und bei Änderungen die Flash-Page löschen und die struct vom RAM ins EEPROM schreiben. Da kann man natürlich noch über inkrementelle Änderungen nachdenken, aber wenn die Konfiguration selten und wenn dann gleich an mehreren Stellen geändert werden soll, reicht auch diese einfache Variante als erster Wurf.