Forum: Compiler & IDEs Flash als non volatile memory verwenden


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ben (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
danke, werde mal schauen, ob ich was komprimieren kann..

von Eric B. (beric)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.