Hallo,
habe mal wieder ein Problemchen...
Ich möchte gerne ein paar größere Daten Arrays ins Flash bekommen. Das
möchte aber nicht so ganz klappen.
Die Routinen die ich bisher habe sehen so aus.
Eines der Arrays:
ins Flash zu schieben... habe noch den Aufruf abgeändert.
Es konnte ohne Fehler Compiliert werden doch wurden falsche Daten
geschickt.
Irgendwie habe ich da ein Denkfehler.
Vielleicht kann mir jemand weiterhelfen und es an einem Beispiel zeigen.
Vielen Dank.
Gruß Tobias
Hallo,
danke erstmal für die schnelle Antwort.
Ja das habe ich schon geändert. Aber es will nicht funktionieren.
Hier ist mal der Code wie ich es aktuell versucht habe:
Das Array:
Karlo schrieb:> Nimm _flash anstatt PROGMEM dann klappt alles out-of-the-box.> Musst auch deinen restlichen Code nicht modifizieren.
Gibt es einen fertigen Beispielcode, wie man Daten ins Flash schreiben
kann, in diesem Thread werden immer nur Andeutungen gemacht.
Karl Heinz schrieb:> Weiter oben hab ich einen Link ins Tutorial gepostet. Da drehen sich> mindestens 5 Bildschirmseiten nur um dieses Thema. In allen Variationen.
Da geht es immer nur darum, wie man Daten aus dem Flash liest, nicht wie
man Daten zur Laufzeit in den Flash schreibt.
Ernie schrieb:> Karl Heinz schrieb:>> Weiter oben hab ich einen Link ins Tutorial gepostet. Da drehen sich>> mindestens 5 Bildschirmseiten nur um dieses Thema. In allen Variationen.>> Da geht es immer nur darum, wie man Daten aus dem Flash liest, nicht wie> man Daten zur Laufzeit in den Flash schreibt.
Äh.
Ausser in einem Bootloader - gar nicht.
Das ist ja der ganze Witz an der Harvard Architektur.
Karl Heinz schrieb:> Äh.> Ausser in einem Bootloader - gar nicht.> Das ist ja der ganze Witz an der Harvard Architektur.
Welchen Teil von "Ein Array vom RAM ins Flash bringen" hab ich dann
nicht verstanden?
traini schrieb:> Karl Heinz schrieb:>> Äh.>> Ausser in einem Bootloader - gar nicht.>> Das ist ja der ganze Witz an der Harvard Architektur.>> Welchen Teil von "Ein Array vom RAM ins Flash bringen" hab ich dann> nicht verstanden?
Dass es darum geht, ein konstantes Array mit konstanten Werten so
anzulegen, dass es nicht im RAM liegt, sondern vom Compiler im Flash
angelegt wird.
Von 'zur Laufzeit den Arrayinhalt ändern' ist da nicht die Rede. Der
Inhalt des Arrays ist zur Laufzeit fix und wird nicht geändert.
Gibt es dann eine Funktion, die im Bootloader-Bereich platziert wird,
und Daten zur Laufzeit in den Flash schreiben kann? Es gibt ja auch
AVRs, die keinen speziellen Bootloader-Bereich haben, da könnte diese
Funktion ja eigentlich überall stehen?
Ich weiß von den stm32f4 Chips, dass der Flash in Blöcken zur Laufzeit
gelöscht und beschrieben werden kann
Ob das die avrs unterstützen musst du im Datenblatt nachlesen
traini schrieb:> Gibt es dann eine Funktion, die im Bootloader-Bereich platziert wird,> und Daten zur Laufzeit in den Flash schreiben kann? Es gibt ja auch> AVRs, die keinen speziellen Bootloader-Bereich haben, da könnte diese> Funktion ja eigentlich überall stehen?
Was genau ist eigentlich das Problem?
AVR sind so ausgelegt, dass
* im Flash das Programms steht (also alles was sich zur Laufzeit nicht
ändert)
* es ein SRAM für Variablen gibt
* alles was eine Stromabschaltung überleben muss, im EEPROM gespeichert
wird
AVR gibt es in verschiedenen Ausbaustufen, mit unterschiedlichen Größen
von Flash, SRAM und EEPROM. Wenn das nicht reicht, kann man für
Massendaten noch eine SD-Karte anschliessen oder bei manchen auch
externen Speicher.
Aber eines macht man normalerweise nicht: den Flash über Umwege zum
Speichern von Werten zu benutzen. Wenn das Speicherangebot nicht reicht,
dann benutzt du ganz einfach den falschen Prozessor. Dafür sind die AVR
nicht ausgelegt.
Ja, man könnte den Bootloader Modus ausnutzen. Allerdings ist das mühsam
und Geschwindigkeitsrekord wirst du damit auch keinen brechen.
Dennis R. schrieb:> Ich weiß von den stm32f4 Chips, dass der Flash in Blöcken zur Laufzeit> gelöscht und beschrieben werden kann>> Ob das die avrs unterstützen musst du im Datenblatt nachlesen
Sollte bei den AVRs eigentlich funktionieren, denn Bootloader ist
ja auch "Laufzeit". Nur - wie du bereits erwähnst - wird das nur
eingeschränkt möglich sein da Flash Speicher immer Page-weise
gelöscht wird. Also müsste ein Array innerhalb einer oder mehrerer
Flash Pages zu liegen kommen und nichts anderes. Nicht sehr
praktikabel .....
Karl Heinz schrieb:> AVR gibt es in verschiedenen Ausbaustufen, mit unterschiedlichen Größen> von Flash, SRAM und EEPROM.
Der EEprom ist im Vergleich zum Flash relativ klein, wenn man mehr Daten
ablegen will muß man ja nicht gleich einen externen EEprom verwenden.
Würde mich wundern, wenn es noch nie jemand versucht hat, Daten im Flash
abzulegen.
Im schlimmsten Fall, muß man einen Bootloader umfunktionieren.
traini schrieb:> Würde mich wundern, wenn es noch nie jemand versucht hat, Daten im Flash> abzulegen.
Da gibt es bestimmt jemanden. Aber da die Idee, das zur Laufzeit zu
machen - von ganz bestimmten Sonderfällen mal abgesehen - schlicht dumm
ist, sind das sicherlich nicht genug.
Die AVRs sind da schlicht das falsche Pferd. Auf dem STM32 gibt es eine
EEPROM-Emulations-Bibliothek, die den Flash benutzt. Nimm einfach das
richtige Werkzeug für dein Problem.
S. R. schrieb:> Da gibt es bestimmt jemanden. Aber da die Idee, das zur Laufzeit zu> machen - von ganz bestimmten Sonderfällen mal abgesehen - schlicht dumm> ist, sind das sicherlich nicht genug.
Der Flash scheint etwas weniger störanfällig als der EEPROM zu sein, man
könnte also z.B. Kalibrierdaten im Flash ablegen.
S. R. schrieb:> Ja, aber das geht nicht zur Laufzeit (was der TO wollte).> Schöne Grüße übrigens. ;-)
Hab ich ja auch nicht behauptet alter Schwede :) Wollten nur auf das
"neue" Feature des arv-gcc aufmerksam machen. Damit kann man sich das
abartige pgm_read*** sparen und der Code wird dadurch überichtilicher.
Gerade bei im flash abgelegten Strukturen und solchen Sachen. Durfte ich
gerade selbst bei nem Projekt feststellen.
Grüße vom Chiemsee
Nagelt mich nicht fest, aber ich meine mich zu erinnern, dass das
Flash-Schreiben bei einigen AVRs direkt aus dem Programm ging, bei dem
Rest muss es im Bootloader passieren.
Mal abgesehen von dem erhöhtem Flash-Verschleiß ist es auch nicht ganz
trivial und es ergeben sich ein paar Probleme:
- Die Adresse der Schreibfunktion im Bootloader muß fest und bekannt
sein, damit man dahin springen kann. Und dann muss man auch noch zurück
;-)
- Die Adresse der Daten im Flash darf nicht mit dem Programm und
Booloader kollidieren. Es ist mindestens eine Flashseite groß.
- Man kann die Bytes nicht einzeln speichern, sondern immer alles -
soviel RAM muss erstmal frei sein.
- const __flash ...{1,2,3..} klappt damit trotzdem nicht
Ich glaube es ist einfacher einen Externen SPI Flash oder EEPROM zu
benutzen.
S. R. schrieb:> Da gibt es bestimmt jemanden. Aber da die Idee, das zur Laufzeit zu> machen - von ganz bestimmten Sonderfällen mal abgesehen - schlicht dumm> ist, sind das sicherlich nicht genug.
Das geht prima und ist überhaupt nicht dumm.
Manchmal muß man eben mehr Daten volatile speichern, als der EEPROM
fassen kann.
In meinem Bootloader ist dazu eine Funktion, die in C aufgerufen werden
kann.