Wie kann ich ein Code-Snippet nur einmal im Leben eines Programms ausführen lassen? Es kann viele Male aus- und wieder eingeschaltet werden. Die einzige Möglichkeit, das Code-Snippet erneut auszuführen, muss das erneute Flashen der Karte sein.
Der Code ist ein Kalibrierungsabschnitt, den ich nicht erneut ausführen möchte. Wenn ich EEPROM oder Flash verwende, setzen wir ein Flag auf true oder False. Also, wenn wir diesen Speicherort zum ersten Mal lesen, was wäre der Zufallswert in diesem Speicherbereich?
Was ist die beste Methode, um dies in Embedded C zu implementieren?
microcontroller
c
embedded
Ganeshredcobra
quelle
quelle
Antworten:
Ihr Mikrocontroller verfügt möglicherweise über ein EEPROM, einen OTP-Speicher und Benutzersicherungsbits, in denen Sie ein Flag setzen können.
Es gibt keine "beste Methode in eingebettetem C". Das Schreiben von nichtflüchtigem Speicher ist in jedem Mikrocontroller unterschiedlich.
bearbeiten:
BLITZ
Flash-Speicherinhalte werden beim Programmieren des Geräts gelöscht. Nach dem Programmieren enthalten alle nicht geschriebenen Bytes 0xFF. Konsultieren Sie das Datenblatt, um einen Bereich zu finden, der sicher aus der laufenden Firmware heraus programmiert werden kann.
EEPROM
Obwohl dies in den Datenblättern nicht garantiert ist, enthielten alle EEPROMs, die ich bisher gesehen habe, 0xFF: s, wenn sie ab Werk geliefert wurden (mit Ausnahme derjenigen, die mit einer eindeutigen MAC-Adresse vorprogrammiert sind, dies ist jedoch ausdrücklich dokumentiert). Einige Programmiergeräte / Software können auch EEPROM-Inhalte löschen oder programmieren. Einige können dauerhaft oder reversibel schreibgeschützt sein.
OTP
Einmal programmierbarer Speicher enthält immer genau definierte Anfangswerte, die im Datenblatt dokumentiert sind.
Es ist immer eine gute Idee, den geschriebenen Daten eine gute Prüfsumme wie CRC32 beizufügen, um sie vor Datenkorruption zu schützen, die durch fehlerhafte Teile, Übertragungsfehler, kosmische Strahlung usw. verursacht wird.
quelle
Du sagtest:
Andere haben gesagt, dass sie EEPROM verwenden, um ein Flag zu speichern, das angibt, wann die Funktion run_once () ausgeführt wurde. Dies hat jedoch den Nachteil, dass beim erneuten Flashen des Mikrocontrollers das Flag ran_it_once im EEPROM bereits gesetzt wurde und die Funktion run_once () nicht ausgeführt wird. Wenn Ihr Mikrocontroller ein eingebettetes EEPROM hat, kann das Flag ran_it_once möglicherweise gelöscht werden, wenn Sie den Mikrocontroller erneut flashen, sofern der Programmierer dies unterstützt.
Ein besserer Weg ist es, Versionsnummern sowohl im EEPROM als auch im Code zu haben. Wenn der Code beim Einschalten ausgeführt wird, sollte er die Versionsnummer aus dem EEPROM lesen und mit der im Code gespeicherten Versionsnummer vergleichen. Wenn sie nicht übereinstimmen, wird die Funktion run_once () aufgerufen, und der letzte Vorgang des Codes run_once () besteht darin, die Firmware-Versionsnummer in das EEPROM zu schreiben. Jedes Mal, wenn Sie den Quellcode der Firmware ändern, müssen Sie die darin eingebettete Versionsnummer erhöhen.
quelle
Wählen Sie einen Mikrocontroller, der seinen eigenen Programmspeicher schreiben / löschen kann. Lassen Sie nach Ausführung des betreffenden Codes den letzten Teil des Codes den ersten Befehl durch einen Sprung ersetzen, der ihn umgeht. Optional können Sie auch den Rest löschen (möglicherweise durch nop ersetzen), sodass die Wahrscheinlichkeit, dass er jemals wieder ausgeführt wird, absolut gleich Null ist.
Diese Nachricht wird sich in 5..4 selbst zerstören ...
quelle
Da Sie diesen Code für die Kalibrierung verwenden, würde ich vorschlagen, einen Explosionsprozess zu erstellen, bei dem der Kalibrierungscode als erste Stufe ausgeführt wird und nicht einmal auf der fertigen Produktionsversion der Platine vorhanden ist. Dies ähnelt der Antwort von Apalopohapa, unterscheidet sich jedoch in dem Sinne, dass Sie zwei separate Programmlasten haben würden: einen Explosionsprozess, der die erste Programmlast blinkt, die alle Kalibrierungen ausführt und die Daten daraus ausspuckt. Nehmen Sie dann diese Daten und integrieren Sie sie in die Daten des zweiten Programmladens.
Ein Vorteil dieses Ansatzes besteht darin, dass Sie den benötigten Speicherplatz absolut minimieren - Sie müssen nicht Ihren einmaligen Code speichern, sondern nur die Daten, die er generiert. Durch einen Explosionsprozess, bei dem zwei separate Programme geladen werden, isolieren Sie sich auch ein wenig vor Fehlern im Initialisierungscode, die sonst auftreten könnten. Sie haben auch zusätzliche Flexibilität, wenn Sie Ihren Kalibrierungscode erneut ausführen möchten: Anstatt zusätzlichen Code schreiben zu müssen, um das Bit zu löschen, das angibt, dass Ihr Code ausgeführt wurde (was versehentlich bereits gelöscht werden könnte), führen Sie Ihren Code einfach erneut aus Strahlprozess.
quelle