Flash als non volatile memory verwenden

Gast #4063352
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.
#4063372
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.
Gast #4063847
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.)

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