Forum: Mikrocontroller und Digitale Elektronik Frage zu Flash Schreibzyklen und malloc in AVR


von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

Guten Tag liebe Community,

Ich habe mal ein paar Fragen bzgl. der Schreibzyklen des Flash des AVRs. 
In meinem Fall geht es um den ATMega2560.

Im Datenblatt des ATMega2560 auf der ersten Seite steht drin das der 
Flash 10.000 Schreibzyklen besitzt. Bzw. es steht dort ja "Write/Erase 
Cycles". Wie ist das jetzt anzusehen?

Wird der Programmspeicher bevor er mit dem eigentlichen Programm 
beschrieben wird komplett gelöscht und dann beschrieben? Dann wären 
diese 10.000 Zyklen ja durch 2 anzusehen also insgesamt 5.000 "nur".

Ich frage mich das deshalb weil ich gerade dabei bin mein Steuergerät 
weiter auszubauen, da dieses auf der einen Seite ein Ewigkeitsprojekt 
ist was immer weiter entwickelt wird. Und auf der anderen Seite 
funktioniert nicht jedoch Implementierung von etwas neuem direkt und 
fehlerfrei. zB. wie die letzten beiden Tage wo ich ein TCP-Server 
implementiert habe für eine Art Fernzugriff, da habe ich den Flash mit 
Sicherheit 30, 40 oder vllt. auch 50 mal neu beschreiben.

Was passiert denn wenn man diese 10.000 Zyklen überschreibt? Lässt er 
sich dann nicht mehr programmieren? Oder fehlen evtl. dann Daten? Bzw. 
lässt er sich dann nicht mehr Verifizieren?

Wobei das mit dem Verifizieren jetzt auch schon so ne Sache ist mit 
diesem FTDI Breakout welches ich als Programmieradapter zur 
Programmierung via UART einsetze, damit man die Kiste nicht immer 
aufschrauben muss zur Programmierung. Da kommt gerne mal "programmer out 
of sync" oder "not responding". Wobei ich nicht mal weiß ob der FTDI 
Chip wirklich ein echter Chip ist oder nicht. Eventuell liegts daran 
oder die Kabellänge. Mit dem Arduino direkt als Programmieradapter 
klappt es immer.

Oder ist das so Atmel garantiert mir sicher 10.000 Zyklen aber es können 
theoretisch bei mir auch 15.000 Zyklen problemlos möglich sein? Bzw. ist 
es überhaupt möglich mit normaler Programmierung diese 10.000 Zyklen 
voll zu bekommen/hat es jemand schonmal geschafft?

Wie sieht das eigentlich mit malloc/realloc bei den AVRs aus? Die 
Funktionen an sich sind ja vorhanden, wahrscheinlich weil sie einfach zu 
C dazugehören. Ich habe an meinem ATMega2560 via XMEM Interface ein 
externes 56kB SRAM angeschlossen. In den Linker Einstellungen ist 
eingestellt das sich der Stack im Internen Speicher befindet und Heap, 
BSS, DATA im externen RAM liegen.

Ich habe eine Art Arraylist für arme in C geschrieben, wobei es nicht 
wirklich eine Arraylist. Ich benötigte diese für den TCP-Server, denn 
ich oben erwähnt hatte. Weil man ja bei TCP immer auf das ACK des 
letzten Paket warten muss bevor man das neue Paket mit PSH/ACK senden 
kann. Geschrieben habe ich die beiden Funktionen in Visual Studio 
Community mit C-Compiler dort habe ich die Funktionen malloc und realloc 
verwendet um den Speicher zu bekommen. Am PC funktionierte das auch ganz 
wunderbar. Auf dem AVR nur teilweise. Da stand dann bei längeren String 
auch gerne mal was drin was ich nicht reingeschrieben hatte.

Habe das ganze dann auf statische Puffer umgeschrieben damit 
funktionierte es dann so wie es sollte. Ich habe die "Originale" 
Dynamische Funktion sowie die statische Funktion als Dateien angehängt. 
Die Strings welche mit tcpSendToClient() gesendet werden sollen werden 
aneinander gehängt. Der erste String wird direkt rausgeschickt die 
anderen beiden werden an einem Puffer aneinander gehängt zB. so Hallo, 
123 und Test. Hallo wird direkt weg geschickt und 123 und Test werden in 
zsm. gehängt -> 123Test und die entsprechenden Längen sowie Positionen 
gemerkt. handleTCPSend() pflückt das ganze dann wieder auseinander 
nachdem ein passender ACK kommt und sendet den nächsten String. Wenn nix 
mehr im Puffer drin ist wird alles zurücksetzt für den nächsten 
durchlauf.

Sollte man Dynamische Speicherverwaltung bei AVR besser gar nicht nutzen 
oder nur eingeschränkt? Theoretisch habe ich ja mit dem Heap im externen 
SRAM mit 56kB genug Platz für malloc oder nicht? Belege gerade 4,9kB an 
RAM. Also wären mind. 50kB für malloc da.

Mfg

von Andre (Gast)


Lesenswert?

Felix N. schrieb:
> Oder ist das so Atmel garantiert mir sicher 10.000 Zyklen aber es können
> theoretisch bei mir auch 15.000 Zyklen problemlos möglich sein?

Genau so ist es. Da ist kein Counter drin, aber irgendwann ist so eine 
Flash Zelle einfach kaputt. Leider gehen die nicht definiert kaputt, 
sondern können die lustigsten Fehler verursachen inkl. "funktioniert nur 
vorm Mittag oder im Schatten".
Deswegen habe ich gerne zwei Controller, einen zum "kaputt schreiben" 
beim entwickeln und einen im mehr oder weniger endgültigen Testgerät. 
Auf den guten Chip kommt dann nur die Version vom Feierabend oder ein 
guter Zwischenstand drauf. Dann weiß ich immerhin, dass mein Testgerät 
nicht abschmiert weil im Flash die Bits umkippen.

von Felix N. (felix_n888)


Lesenswert?

Andre schrieb:
> Deswegen habe ich gerne zwei Controller, einen zum "kaputt schreiben"
> beim entwickeln und einen im mehr oder weniger endgültigen Testgerät.

Ja nur doof das der jetzt halt im 100 pin SMD Package ist. Bei alten 
Prozessor im alten Steuergerät war es ein ATMega1284P im DIL Package da 
wäre das kein Ding gewesen. Nur auf der Platine sind halt noch ein 
Haufen andere Chips wie ADS1115, 24C16WP, MCP7940M, externes ram, relays 
...

Das halt alles für die Funktion benötigt wird. Im schlimmsten Fall 
müsste ich ihn dann wieder auslöten und ein neuen einlöten. Nix 
destotrotz bleibt es ja immer noch ein Ewigkeitsprojekt das sich ständig 
weiter entwickelt von daher gibt es nie wirklich ein "Release" ehr 
Programmierpausen :)

Mfg

von Olaf (Gast)


Lesenswert?

> Was passiert denn wenn man diese 10.000 Zyklen überschreibt? Lässt er
> sich dann nicht mehr programmieren? Oder fehlen evtl. dann Daten? Bzw.
> lässt er sich dann nicht mehr Verifizieren?

Dann gibt es lesefehler. Ich glaub aber nicht das du die erleben wirst. 
Der Hersteller gibt die Zyklen anhand seiner Umgebungsbedingungen an. 
Also sowohl ueber den gesamten Betriebsspannungsbereich der MCU wie auch 
dessen Temperaturbereich. Und dann auch noch fuer eine angebene 
(10Jahre?) Lebensdauer. Du wirst da sich das mehrfache des 
Herstellerwertes erreichen.

> Wobei das mit dem Verifizieren jetzt auch schon so ne Sache ist mit
> diesem FTDI Breakout welches ich als Programmieradapter zur

Bilde eine Pruefsumme welche dein Programm beim starten selbst einmal 
ueberprueft.

Olaf

von Stefan F. (Gast)


Lesenswert?

Ein Flash Zyklus besteht aus dem Löschen und neu beschreiben. Aber die 
10.000 Zyklen sind ohnehin nicht in Stein gemeißelt.

Lego meinte auf meine Anfrage (bzgl. dem NXT Baustein) dass die Speicher 
erfahrungsgemäß sehr viel länger halten, so dass das in der Praxis kein 
Problem sei. Sie würden die Geräte ggf. auch lange nach der Garantie 
austauschen, falls es doch mal passiert.

Dynamische Speicherverwaltung ist auf diesen kleinen Mikrocontrollern 
mit erheblichen Fallstricken verbunden, weil sie zur Fragmentierung des 
HEAP führen kann und es keine automatische Defragmentierung gibt (die du 
womöglich von deinem PC gewohnt bist, aber da war das nicht immer so).

Das Thema ist dort gut erklärt: 
https://www.mikrocontroller.net/articles/Heap-Fragmentierung
https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/

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.