Forum: Compiler & IDEs Flash als non volatile memory verwenden


von ben (Gast)


Lesenswert?

Hi,

auf meinem Mega16, an den ich bei diesem Projekt gebunden bin, ist der 
EEPROM voll, ich bräuchte aber noch Platz für 128 Byte zusätzliche 
Daten.

Nun habe ich mir folgendes überlegt:
Da ich sowieso einen Bootloader habe, könnte ich bin Bootloader Bereich 
eine Funktion installieren, welche einen Pointer auf einen Bereich im 
Ram als Argument nimmt und dann 128 Byte an eine definierte Adresse in 
den Flash schreibt.

Die Vorgensweise wäre also folgende:

Im Hauptprogramm:
-Ram beschreiben mit Daten
-Jump zu funktion im Bootloader mit (((void(*)(void))0x3F00)(&data)); 
//0x3F00 ist Adresse der Funktion im Bootloader

Im Bootloader:
- Löscht Page(s)
- Beschreibt sie aus Ram
- Springt zurück ins Hauptprogramm

Im Hauptprogramm kann man dann auf die Daten zugreifen, da die Adresse 
im Flash bekannt ist..


Bevor ich mich jetzt stundenlang da dran setzte:  Ist das machbar, oder 
habe ich einen Denkfehler? Habt ihr Ideen für konkrete Ansätze?

Danke

PS.: Nein ich kann keinen Prozessor mit größerem EEPROM nehmen, ich bin 
an die Hardware gebunden.

von Peter II (Gast)


Lesenswert?

sollte gehen, aber warum in den bootloader springen? Es sollte doch auch 
so möglich sein, eine Page zu schreiben.

Eventuell kann man auch darüber nachdenken den eeprom zu packen.

von Falk B. (falk)


Lesenswert?

@ ben (Gast)

>auf meinem Mega16, an den ich bei diesem Projekt gebunden bin,

Wirklich? Es gibt genügend pinkompatible AVRs mit mehr EEPROM.

> ist der
>EEPROM voll, ich bräuchte aber noch Platz für 128 Byte zusätzliche
>Daten.

Auch hier kann man überlegen, ob man diese Daten ober bestehende Daten 
komprimieren kann.

>-Ram beschreiben mit Daten
>-Jump zu funktion im Bootloader mit (((void(*)(void))0x3F00)(&data));
>//0x3F00 ist Adresse der Funktion im Bootloader

>Im Bootloader:
>- Löscht Page(s)
>- Beschreibt sie aus Ram
>- Springt zurück ins Hauptprogramm

Kann man machen, würde ich aber erst als allerletzten Ausweg nehmen, 
zumal der Flash offiziell nur 10k Löschzyklen verträgt.

>PS.: Nein ich kann keinen Prozessor mit größerem EEPROM nehmen, ich bin
>an die Hardware gebunden.

Dann Daten sinnvoll komprimieren.

von ben (Gast)


Lesenswert?

danke, werde mal schauen, ob ich was komprimieren kann..

von Eric B. (beric)


Lesenswert?

Vielleicht gibt es bei den schon vorhandenen EEPROM-Daten welche die nur 
einmal geschrieben, aber dann nur noch gelesen werden. Dies könnnte man 
ins Flash verschieben. Produktionsdaten wie HW revision, 
Herstellungsdatum usw sind da Kandidaten.

von Falk B. (falk)


Lesenswert?

Eben. Vor allem die Frage stellen, welche Daten WIRKLICH während der 
Laufzeit neu geschrieben werden müssen. Wertetabellen, Texte etc. meist 
nicht, die packt man besser in den Flash.

von Bronco (Gast)


Lesenswert?

ben schrieb:
> Bevor ich mich jetzt stundenlang da dran setzte:  Ist das machbar, oder
> habe ich einen Denkfehler? Habt ihr Ideen für konkrete Ansätze?

Dies wird in aktuellen Autos so gemacht ;)
Die Hersteller sparen sich die paar Cent für ein EEPROM und schreiben 
stattdessen ins Flash. Es müssen nur ausreichend viele Pages vorgehalten 
werden, um die maximale Schreibzyklenzahl pro Page nicht zu 
überschreiten.
Wenn man bedenkt, daß pro Fahrzyklus einmal geschrieben wird, 
funktioniert das doch ganz gut.

Allerdings mußt Du eine sinnvolle Strategie haben, wie oft Du Daten 
speichern willst. Beim Auto ist das einfach: wenn die Zündung 
ausgeschaltet wird, ist das Steuergerät nicht sofort tot, sondern es 
entscheidet selbst, wann es sich den Strom abstellt. Daher geht es hier 
problemlos, die Daten zum Ende des Fahrzyklus (im sog. "Nachlauf") 
einmalig ins Flash zu speichern.
Wenn bei einer Anwendung aber jederzeit der Strom weg sein kann, muß man 
die Daten natürlich rechtzeitig gespeichert haben. (In diesem Fall muß 
man die Daten korrekterweise redundant und mit Checksumme speichern, 
falls der Strom genau während eines Schreibzugriffes ausgeht.)

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.