Hi Umgebung: WinAVR Mega128 ist es problemlos möglich Variablen die in der eeprom section angelegt sind in einem externen EEPROM abzulegen? Die entsprechenden Funktionen zum Beschreiben und Lesen aus dem externen EEPROM sind natürlich vorhanden. Mir mach nur der Offset von 0x81000000 ein klein wenig Sorgen. Werden die oberen 16 Bit der Adresse vom Linker verworfen? Hintergrund: Ich hab zwei Hardwareversionen. Auf der neueren befindet sich ein externes EEPROM das anstatt des internen verwendet werden (Schreibzyklen, Schreibgeschwindigkeit) soll wobei die identische Software zum Einsatz kommen soll. Meine Idee war jetzt für die EEPROM-Funktionen Funktionspointer zu verwenden die je nach Hardwareversion auf Funktionen zeigen die entweder das interne oder das externe EEPROM verwenden. Schön wäre eben wenn ich dazu die vom Linker vergebenen EEPROM Adressen weiterverwenden könnte. Alles andere würde eine größere Umstellung nach sich ziehen. Matthias
>ist es problemlos möglich Variablen die in der eeprom section angelegt >sind in einem externen EEPROM abzulegen? Ja klar geht das. Per ISP werden die Daten in das interne EEPROM abgelegt. Das kopierst du komplett mit eigener Software in das externe EEPROM. Dann schreibst du deine Software so um das das externe EEPROM verwendet wird. Ist doch ganz einfach.
Hi per ISP wird garnichts kopiert. Das EEPROM wird von der Software beim ersten Start initialisiert und kann dann über ein Konfigurationsprogramm vom PC aus verändert werden bzw. es werden diverse Zähler hineingeschrieben. Ich wollte nur sicher gehen das der Offset keine Probleme bereitet bzw. ich irgendwelche Aktionen in meinen EEPROM Routinen durchführen muss die von den avrlibc Routinen erledigt werden. Matthias
>Ich wollte nur sicher gehen das der Offset keine >Probleme bereitet bzw. ich irgendwelche Aktionen in meinen EEPROM >Routinen durchführen muss die von den avrlibc Routinen erledigt werden. Die avrlibc Routinen sind nur für das interne EEPROM geschrieben. Die erledigen dir gar nichts für ein externes EEPROM. Woher sollen die auch wissen was du wo angeschlossen hast ? I2C EEPROM am TWI, oder SPI EEPROM an SPI, Dataflash an SPI. Nö, tut avrlibc nicht. Musst du alles selber erledigen.
Ja, du kannst das problemlos austauschen. Alles, was die section .eeprom für dich erledigt ist die Zuweisung des Speichers und das Platzieren der Initialwerte (üblicherweise dann in einer ihex-Datei rausgezogen). Da der Compiler selbst keinerlei Zugriffe auf den EEPROM einbaut, liegt es rein an dir, wie du dann den Datentransport selbst organisierst.
Hi genau das wollte ich wissen. Danke Jörg. @Holger Es geht mir rein um die Organisation der Variablen die ich nicht selber erledigen will sondern das soll doch bitte schön der Linker für mich erledigen. Das ich das externe EEPROM selber ansprechen muss ist mir schon klar. Matthias
Du kannst auch einfach eine neue section mit eigenem Namen für dein externes Flash anlegen: EEMEM aus der <avr/eeprom.h> ist nur ein define für __attribute__((section(".eeprom"))) ebenso kannst du auch eine section(".dataflash") benutzen. Im Linkerscript dafür dann eine eigene Startadresse festlegen, sonst landets im Ram. Ein Hexfile für die Section kann dann avr-objcopy mit "-R .dataflash" erzeugen. /Ernst
Aber er kann natürlich auch gleich .eeprom benutzen, dann hat er's einfacher. ;-) Übrigens, Dataflash != EEPROM. Erstere kann man in der Regel nur seitenweise beschreiben, EEPROMs dagegen einzelbyteweise.
Matthias Weißer wrote: > Hi > > genau das wollte ich wissen. Danke Jörg. > > @Holger > Es geht mir rein um die Organisation der Variablen die ich nicht selber > erledigen will sondern das soll doch bitte schön der Linker für mich > erledigen. Das ich das externe EEPROM selber ansprechen muss ist mir > schon klar. > > Matthias Dein Linker kann aber deine Programmvariablen trotzdem nicht in das externe EEPROM legen. Der kann nur in Speicherbereiche, die sich über den internen Speicherbus ansprechen lassen. Wenn du Variablen aus einem externen, per SPI oder I2C angeschlossenem EEPROM nutzen willst, musst du die Variablen erst mal im RAM deklarieren, und in deinem Programm dann die RAM-Variablen mit den Daten aus dem ext. EEPROM füllen.
Christian Richter wrote: > Dein Linker kann aber deine Programmvariablen trotzdem nicht in das > externe EEPROM legen. Das kann er aber auch für den internen EEPROM nicht machen, für den die section .eeprom normalerweise benutzt wird.
Hi richtig. Ich will doch einfach nur die gleichen Addressen die für das interne EEPROM per section .eeprom bereits vergeben sind auch für das externe EEPROM verwenden da eine Software (HEX-File) zum Einsatz kommen soll die anhand eines Pins feststellt welche HW-Version vorliegt. Abhängig von dieser HW-Version werden dann Funktionspointer entweder auf die avrlibc Funktionen für das interne EEPROM oder aber auf die Funktionen die mein externes EEPROM über I2C ansprechen initialisiert. Mitlerweile funktioniert das Ganze auch genau so wie ich mir das vorgestellt hatte. Intialwerte werden vom Programm selbsständig ins EEPROM geschreiben wenn eine bestimmte Signatur/Prüfsumme nicht mit der vom Programm erwarteten übereinstimmt. Matthias
Hallo, doofe Frage: Wie funktioniert das? Wenn ich eine Variable mit EEMEM für die section .eeprom verwende, entspricht das doch einer Adresse im internen EEPROM. Funktioniert das über einen Offset, d.h. dass die erste für den EEPROM deklarierte Variable z.B. Adresse 0x00 bekommt, und daher das Symbol für die Variable auch mit dem externen EEPROM verwendet werden kann? In meinem Fall habe ich nämlich ein zusätzliches, externes I2C EEPROM, dass unabhängig von dem internen verwendet werden soll und ich weiss nicht, welche Startadresse die neue section erhalten soll/kann.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.