section (".eeprom") für externes EEPROM nutzen

OP Persönliche Seite #636864
Lesenswert?

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
Gast #636869
Lesenswert?

>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.
OP Persönliche Seite #636903
Lesenswert?

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
Gast #636914
Lesenswert?

>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.
Moderator Persönliche Seite #637042
Lesenswert?

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.
#637534
Lesenswert?

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
#637575
Lesenswert?

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.
OP Persönliche Seite #637645
Lesenswert?

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
Gast #1656921
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren