Forum: Compiler & IDEs section (".eeprom") für externes EEPROM nutzen


von Μαtthias W. (matthias) Benutzerseite


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

von holger (Gast)


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.

von Μαtthias W. (matthias) Benutzerseite


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

von holger (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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

von Εrnst B. (ernst)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Christian R. (supachris)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Μαtthias W. (matthias) Benutzerseite


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

von willy (Gast)


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.

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
Noch kein Account? Hier anmelden.