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
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.
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.