Ok, die Frage ist also:
Wie bekomme ich es hin, daß die (Hoch-)Spracheninterne Variablen-Adress-Verwaltung einen bestimmten Bereich nicht antastet, aber sonst normal verwendet werden kann. Insbesondere bezogen auf den Eeprom.
Nun, was ist eine Variable eigentlich?
Ein "Griff", den Du an eine Speicherzelle schraubst. Du, oder eben die Sprache, der Compiler. Und wenn ich eine größere Variable (word, qword, String,...) nehme?
Dann wird der Griff an die erste Zelle geschraubt.
Die Variablenverwaltung sollte sich insbesondere darum kümmern, daß es dabei zu keinen Kollisionen kommt.
Die AVR besitzen (bis zu) drei interne Speicherbereiche: Den Programmspeicher (Program Flash), den volatilen Arbeitspeicher (SRAM), und den nonvolatilen Eeprom.
Sinnigerweise sollte eine Sprache (ein Compiler) also für jeden dieser Berteiche getrennt die verwendeten Adressen (Griffe an Variablen) verwalten.
Zu C kann ich nichts sagen...
Unter
Assembler wählt man den entsprechenden Bereich mit einer Direktive aus:
Alles was hinter
.cseg
steht, landet im Flash.
Für alles, was hinter
.dseg
steht werden Adressen im SRAM erzeugt.
Alles was hinter
.eseg
steht, landet im Eeprom.
Für jeden dieser drei Bereiche hat der Compiler 'nen eigenen … Zeiger auf die nächste frei Stelle.
Legst Du im SRAM also eine Word-Variable an (.dw) verpaßt Du der derzeitigen freien SRAM-Adresse 'nen Griff (mittels Label) - der SRAM-Zeiger auf die nächste freie Stelle wandert automatisch zwei Zellen weiter.
Legst Du im Eeprom ein Byte ab (.db) und verpaßt der Zelle 'nen Griff, wandert der Eeprom-Zeiger eins weiter.
Diese Zeiger kannst Du aber in jedem Speicherbereich beliebig umplatzieren (.org) - setzt Du also den Eeprom-Zeiger auf 0x10, werden die ersten sechzehn Adressen (Bytes) nicht verwendet, es sei denn Du setzt den Zeiger manuell wieder in diesen Bereich.
Kommt es durch das Umplatzieren zu einer Kollision, wirft das Studio 'ne entsprechende Fehlermeldung.
In Anlehnung an Thomas Beitrag #4 reservieren wir einfach mal sechzehn Bytes. Dazu reicht es, vor allen(!) anderen "Eeprom-Variablendeklarationen"
CodeBox Assembler
.eseg
.org 0x10
.cseg
zu schreiben.
Flexibler wird es, wenn man das Ende des reservierten Bereiches als Konstante hinterlegt:
.equ reservedEepromSpaceEnd=0x10
Sollen an irgendwelche dieser Zellen bereits "Griffe" geschraubt werden, kann man das auch schon machen:
CodeBox Assembler
.equ reservedEepromSpaceEnd=0x10
.eseg
.org 0x00
HardwareVersion:
.org 0x01
KaliByte:
.org 0x02
GreenInteger:
.org 0x04
Status:
.org 0x5
OrangeInteger:
.org reservedEepromSpaceEnd
.cseg
Das ganze erzeugt noch keinen Code.
Es kann in Form einer externen Datei inkludiert werden.
Lese- und Schreibzugriffe aus dem Code heraus sind über die "Griffe" (Label) möglich.
Soll jetzt bereits beim Compilieren zB die Hardwareversion auf... "7" gesetzt werden, kannst Du das auch danach tun:
CodeBox Assembler
.eseg
.org HardwareVersion
.db 7
.org reservedEepromSpaceEnd
.cseg
Das würde keinen Code im Flash erzeugen, aber ein Eeprom-File (wo eben genau die erste Adresse mit "7" beschrieben wird).
Auch das muß natürlich vor allen anderen Eeprom-Variablen stehen.