Es gibt für diese "Wo liegt das Zeug im EEPROM"-Problematik auch eine schönere Lösung. Bestehend aus einem Headerfile in das du deine Konfigurationsdatenstruktur reinschreibst, ein Sourcefile und einem Anwendungsbeispiel.
config.h
PHP-Code:
typedef struct {
int foo; // Eigene Konfigurationsvariablen hier unterbringen
} Config_Data_t;
extern Config_Data_t * const config;
config.c
PHP-Code:
#include <avr/eeprom.h>
#define EEPROM_SIZE (E2END + 1)
typedef struct {
uint8_t firstByteDummy;
Config_Data_t config;
uint8_t aligmentDummy[EEPROM_SIZE - sizeof(Config_Data_t) - 1];
} Config_Data_Container_t;
EEMEM Config_Data_Container_t container = {
.config = {
.foo = 42 // Beispielinitialisierung
}, };
Config_Data_t * const config = &container.config;
Anwendungsbeispiel
PHP-Code:
#include "config.h"
#include <avr/eeprom.h>
eeprom_read_word(&config->foo)
Erklärung: Config_Data_Container_t belegt den ganzen EEPROM. Vollständig. Das erste Byte wird ausgespart (angeblich kann es ungewollt bei Ausfällen der Stromversorgung o.ä. überschrieben werden), den Rest hinter der eigentlichen Nutzdatenstruktur belegt ein Dummy-Array. Dadurch bleibt die Adresse der Daten immer gleich da der Compiler gar keinen Spielraum zum umorganisieren hat, außer man nimmt selbst Änderungen vor. Auf die Daten zugreifen kann man über einen Pointer der direkt auf den Anfang der Nutzdaten zeigt. Müssen die Daten nicht vorinitialisiert werden, kann auf den entsprechenden Abschnitt in config.c verzichtet werden.
@sast: Die Reihenfolge in der die Variablen im Speicher liegen kannst du nicht beeinflussen, das gilt für den RAM genauso wie für den EEPROM. Wenn du ein sicheres Speicherlayout haben möchtest, musst du das ganze als struct ablegen.
mfG
Markus
Lesezeichen