Forum: Platinen Externes EEPROM und linearer Speicher


von Felix H. (masterq)


Lesenswert?

Hallo zusammen,
ich habe ein EEPROM über i2c/twi an meinen xmega angeschlossen.
Nun frage ich mich ob es möglich ist einen virtuellen linearen 
Speicherbereich dafür bereit zu stellen, so das mit Hilfe von GCC 
Bereiche reservieren kann und einfach Pointer benutzen kann.
Halt so ähnlich wie fürs richtige EEPROM
1
unsigned int Bla EEMEM = 12345;

Für ein paar Tipps bin ich dankbar

Grüße

Felix

von Falk B. (falk)


Lesenswert?

@  Felix H. (masterq)

>ich habe ein EEPROM über i2c/twi an meinen xmega angeschlossen.
>Nun frage ich mich ob es möglich ist einen virtuellen linearen
>Speicherbereich dafür bereit zu stellen, so das mit Hilfe von GCC
>Bereiche reservieren kann und einfach Pointer benutzen kann.

Nein, das geht nicht. Du musst Routinen zum Lesen und Schreiben nutzen.

MFG
Falk

von Felix H. (masterq)


Lesenswert?

Klar klar, die habe ich ja auch, und die will ich auch benutzen.
Ich sehe gerade ich habe einen Fehler gemacht, es ist klar das ich die 
Variable nicht mit einem Wert initialisieren kann, da der Programmer 
nicht auf das externe EEPROM zugreifen kann. Und es ist ebenfalls klar 
das ich die read und write routinen benötige um ein Wert ins EEP zu 
schreiben oder einen Wert zu lesen.
Es geht mir um die Reservierung des Speichers. Normaler weiße müsste ich 
das ja selber managen.
Deshalb möchte das der Compiler sich merkt welche Bereiche schon 
reserviert sind.
Also das geht auf jeden Fall, ich hoffe nur das es nicht so aufwendig 
ist :-)

also zb.:
1
int bla EXT_EEMEM;
2
int bla2 EXT_EEMEM;

So möchte ich das &bla = 0, und &bla2 = 4, also aus Compiler Sicht ein 
virtueller speicher der reserviert wird. reserviert wird unabhängig von 
RAM. Wobei die Addressen der Variablen natürlich weiterhin im RAM 
liegen.
wenn ich jetzt die Variablen beschreiben möchte reicht mir:
1
ext_eep_write($bla, 23);
oder halt zum lesen:
1
int temp = ext_eep_read_int($bla);

Grüße

Felix

von Falk B. (falk)


Lesenswert?

@  Felix H. (masterq)

>Klar klar, die habe ich ja auch, und die will ich auch benutzen.

Was soll dann die Diskussion?

>Es geht mir um die Reservierung des Speichers. Normaler weiße müsste ich
>das ja selber managen.

Deoin Compoler weiß reich GAR NICHTS von einem externen EEPROM. Das weiß 
KEIN Compiler. Darum geht der Zugriff NUR über Funktionen.

>Deshalb möchte das der Compiler sich merkt welche Bereiche schon
>reserviert sind.
>Also das geht auf jeden Fall, ich hoffe nur das es nicht so aufwendig
>ist :-)

Im RAM! Oder im INTERNEN EEPROM, der Zugriff ist ggf. im Compiler mit 
eingebaut. Im AVR-GCC ist selbst das nur halb, er kann sie zwar im 
EEPROM anlegen, der Zugriff geht aber nur über Funktionen, nicht 
"normal" wie C-Variablen.

>So möchte ich das &bla = 0, und &bla2 = 4, also aus Compiler Sicht ein
>virtueller speicher der reserviert wird. reserviert wird unabhängig von
>RAM.

Geht nicht, siehe oben. Es sein denn du bist so fit, das in den AVR GCC 
einzubinden. Viel Spass.

MFG
Falk

von Stephan W. (sir_wedeck)


Lesenswert?

Hi Felix,
ich glaube das was du suchst ist eine eigene Section.
Schau dir die Implementierung von EEPROM mal genauer an, dann solltest 
du schnell fündig werden.

Stephan

von Felix H. (masterq)


Lesenswert?

Danke Stephan,
auch für das richtige Wort :-)
Schaue gleich rein,
kannst du den Aufwand abschätzen?

Kann mir eigentlich nicht vorstellen das es soo schlimm ist, ist ja 
alles schon für andere Sectionen implementiert.

Grüße

Felix

von Stephan W. (sir_wedeck)


Lesenswert?

Hi Felix
also so ein großer Aufwand ist das nicht.
Ich hatte dies für ein Projekt bei meiner letzten Firma so gemacht, 
leider aber keine Unterlagen mehr davon hier.

Das erstellen und die Flags bekommst du aus dem Umgang mit EEPROM.
Die Lese und Schreibe-Funktionen hast du schon, das was etwas Zeit 
kostet ist, wie man den Speicher (Section) dann mit Init-Werten füllt!?!

Ich hatte es damals mit dem Bootloader den wir genutzt hatten, 
realisiert.

Wenn du alles fertig hast, könntest du uns die Sachen dann hier zur 
Verfügung stellen? Dann braucht man das Rad nicht jedes mal neu 
erfinden. :-)

Stephan

von Reinhard Kern (Gast)


Lesenswert?

Felix H. schrieb:
> Kann mir eigentlich nicht vorstellen das es soo schlimm ist, ist ja
> alles schon für andere Sectionen implementiert.

Selbst wenn nicht, irgendwas geht immer: notfalls würde ich einen 
Prozessor definieren mit einem real nicht existierenden RAM-Bereich. Du 
musst dann nur selbst aufpassen, dass du keine direkten 
Lese/Schreibbefehle benutzen darfst.

Gruss Reinhard

von Felix H. (masterq)


Lesenswert?

Klar wenn ich es schaffe stelle ich es sofort zu Verfügung, gestern 
musste ich aber leider erst mal feststellen, das ich noch ein bisschen 
was zu lernen habe :-(
Die xmega i2c/twi routinen für ein externes eeprom habe ich auch 
nirgendwo gefunden, und musste sie selber implementieren, wenn ich sie 
perfektioniert habe kann ich diese auch zu Verfügung stellen.

@Reinhard
Was du da sagst klingt gar nicht so dumm, wie gehe ich so etwas an?

Vielen dank für die konstruktive Hilfe

Felix

von Reinhard Kern (Gast)


Lesenswert?

Felix H. schrieb:
> Was du da sagst klingt gar nicht so dumm, wie gehe ich so etwas an?

Hallo,

ich bin da aktuell nicht in Übung, aber mal so ins Blaue und 
Intel-ähnlich formuliert:

Ich lege ein RAM-Segment (oder section...) an, das mit keinem anderen 
kollidiert und das an der Adresse EEProm_Basis beginnt. Entweder einfach 
so oder die Prozessorspezifikation ändern.

Darin lege ich meine Variablen an, z.B. mit DEFB, DEFW oder auch in C. 
eine Variable X hat also die Adresse EEProm_Basis + Offset(X).

Zugriffe erfolgen über EEProm-Routinen, die für X die (EEProm-)Adresse 
bilden aus Adresse(X) - EEProm_Basis. Das ist schon alles.

Gruss Reinhard

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.