Hallo Tim Thaler, ich glaube jetzt habe ich erst dein Problem verstanden...
Vorab:
"absolute" ist unverrückbar, also immer eine feste Adresse.
Die Adresse einer section steht im Linkerfile, wobei mehrere Variablen Blöcke usw. in einer section angelegt werden können.
Daher ist "absolute" und "section" nicht kombinierbar.
Um auf das EEPROM zuzugreifen, werden ja spezielle Funktionen benötigt.
eeprom_read oder eeprom_write oder ähnliches.
Der Bereich liegt ja nicht, wie der RAM, so im Speicher, dass man direkt darauf zugreifen könnte.
Dazu werden ja die Register EEPROM Address, EEPROM Data, EEPROM Control Register usw. benötigt.
Um den Anwender es zu erleichtern hat man dafür wohl entsprechnede Makros (Bibliotheken) gebaut,
Folgend eine reine Spekulation von mir, ich weis nicht ob das beim AVR-Pascal auch so abläuft.
Korrekturen erbeten
Wenn ich das richtig verstehe, dann wird aus einer Deklaration von
counter : ee_uint16; section '.eeprom'; erstmal NICHTS. Hier wird lediglich eine Adresse festgelegt für die Variable counter, welche später im EEPROM liegen soll.
Wo ? weis man aber nicht. Ich nenne dieAdresse mal symbolisch EE_ADDRESS_COUNTER
erst wenn man nun darauf zugreift
counter:=13;dann wird daraus vom Compiler der Code erzeugt:
eeprom_write_word (&counter,EE_ADDRESS_COUNTER);
beim Lesen dann:
counter:=eeprom_read_word (EE_ADDRESS_COUNTER);Damit unterliegt die Verwaltung der eigentlichen EEPROM Adressen erstmal dem Compiler bzw. Linker.
Damit müste es Dir "theoretisch" egal sein, wo die Adressen liegen.
Ich vermute nun, das Problem was Du meinst ist,
wenn Du deinen Code erweiterst, liegen schon Werte im EEPROM, die sich durch Neucompilierung nun
in der Adresse verschoben haben.
Habe ich das Problem so richtig verstanden ?
somit stünde Dir offen die Adressverwaltung im EEPROM komplett selbst zu übernehmen,
indem Du die entsprechenden Funktionen mit einer von Dir gewünschten Adresse verwendest.
Wie ich grad sehe, hat dazu Mathias schon ein Tutorial erstellt:
http://wiki.freepascal.org/AVR_Embedded ... _EEPROM/dewobei hier noch die Interrupts gesperrt werden sollten.
Der Vollständigkeit halber:
Code: Alles auswählen
procedure EEPROM_write(Address: int16; Data: byte);
begin
// Prüfen, ob bereit zum schreiben.
while (EECR and (1 shl EEPE)) <> 0 do begin
end;
EEAR := Address;
EEDR := Data;
// hier ALLE interrupts sperren CLI
EECR := EECR or (1 shl EEMPE); // Es müssen 2 Zeilen sein !
EECR := EECR or (1 shl EEPE);
// hier Interrupts wieder ermöglichen SEI
end;
Siro