Wie kann ich inkrementelle Updates mit einem Flash durchführen, der nur blockweise gelöscht werden kann?

11

Szenario

Ich möchte ein kostengünstiges IoT-Gerät drahtlos mit einer neuen Firmware aktualisieren, die die Mikrocontroller des Geräts aktualisiert. Der Mikrocontrollerspeicher ist ein Flash-Speicher im Bereich von 32.000 bis 128.000 (jeder Cent zählt). Dieser billige Speicher hat eine wesentliche Einschränkung: Er kann nur blockweise gelöscht werden.

Frage

Bedeutet das, dass ich keine differenziellen ( Delta ) Aktualisierungen vornehmen kann ? Muss ich immer den gesamten Controller-Speicher (oder zumindest wesentliche Teile) aktualisieren?

Ich möchte die Notwendigkeit reduzieren, alles zu flashen, und riskieren, das Gerät so weit wie möglich vollständig zu blockieren. Gibt es Strategien, wenn Mikrocontroller über Funk geblitzt werden?

Helmar
quelle
Was ist für Sie wichtiger oder die niedrigste Risikorate?
Bence Kaulics
@BenceKaulics, denke ich, das richtige Gleichgewicht zwischen den beiden zu finden. Schließlich ist ein Ziegelrisiko auch ein (gewichteter) Kostenfaktor.
Helmar

Antworten:

8

Die einfache Antwort lautet: Ja, Sie benötigen genügend Flash-Blöcke, um Bootloader- und A / B-Code-Images zu unterstützen, wenn Sie eine hohe Zuverlässigkeit wünschen. Bevor Sie das neue Bild aktivieren, können Sie das Ganze schreiben, überprüfen und möglicherweise erneut versuchen.

Dies ist jedoch eine teure / zuverlässige Strategie, und Sie können den Overhead reduzieren. Low-Level-Unterstützung für OTA-Updates kann auch Teil der Gerätefirmware oder des Betriebssystems sein, sodass Sie vermeiden können, Ihre eigenen zu aktualisieren, es sei denn, Sie möchten etwas lernen. Diese Funktion kann als beschrieben werden FOTA.

Das Partitionieren Ihrer Codebasis ermöglicht inkrementelle Updates. Im besten Fall kann der Bootloader die Netzwerkverbindung herstellen, Code herunterladen und überprüfen, ohne dass ein Fallback-Benutzercode erforderlich ist. Mit einem lokalen Gateway kann die Verwaltung dieser Aufgabe von den kostengünstigen Endpunkten delegiert werden.

Viele Geräte haben eine kleine Menge von Wort-Lösch - Blitz, und falls dies nicht selbst kann man in der Regel eingestellt Bits ohne einen ganzen Block löschen zu müssen. Diese Funktionen können verwendet werden, um Sprungtabellen zu manipulieren und Code zusammenzufügen, der in Blockgrößenblöcken aktualisiert wird. Selbst wenn Sie ursprünglich einen vollständigen A / B-Codebereich geplant hatten, müssen Sie möglicherweise auf ein komplexeres Schema zurückgreifen, wenn die Codebasis zu stark wächst.

Um die Funktionalität zu verdeutlichen, die mit einer ausgeklügelten Firmware-Over-the-Air-Lösung erreicht werden kann, können der Bootloader und möglicherweise ein primärer Kommunikationsstapel resident bleiben, während der gesamte verbleibende Benutzeranwendungsbereich erneut geflasht wird. Dies erfordert keinen Overhead (insbesondere wenn die Blockpartitionierung weich ist). In dem Szenario, in dem der Kommunikationsstapel aktualisiert werden muss, kann die Region, die im Allgemeinen für den Anwendungscode verwendet wird, vorübergehend während des Herunterladens und der Überprüfung verwendet werden. Um dies zu erreichen, ist eine gewisse Unterstützung im SoC erforderlich, es gibt jedoch bereits Geräte der 2. und 3. Generation, die für diesen Zweck entwickelt wurden.

Sean Houlihane
quelle
6

Ich möchte die Notwendigkeit reduzieren, alles zu flashen, und riskieren, das Gerät so weit wie möglich vollständig zu blockieren. Gibt es Strategien, wenn Mikrocontroller über Funk geblitzt werden?

Abgesehen von Ihrem Code, der die Aktualisierung vornimmt, die relativ statisch wäre, müssen Sie zwei Images in Ihrem Speicher behalten: ein aktives Image und ein Backup-Image. Wann immer Sie aktualisieren müssen, führen Sie dies in der Sicherung durch und schalten Sie diese dann auf aktiv. Sobald es stabil ist, aktualisieren Sie das alte aktive Image, das jetzt Ihr Backup sein soll.

In diesem Sinne können Sie beim Aktualisieren beider Bilder Abnutzungsalgorithmen verwenden. Der Code für solche Algorithmen nimmt möglicherweise etwa 10 bis 15% des gesamten Speichers ein, aber es lohnt sich, die Lebensdauer des Geräts zu verlängern.

Die Verschleißnivellierung wird normalerweise vom Flash-Controller verwaltet, der mithilfe eines Verschleißnivellierungsalgorithmus bestimmt, welcher physische Block bei jeder Programmierung der Daten verwendet werden soll. Es gibt zwei Arten von SSD-Verschleißnivellierungen (Solid State Drive): dynamische und statische. Dynamic Wear Leveling Pools löschten Blöcke und wählten den Block mit der niedrigsten Löschanzahl für den nächsten Schreibvorgang aus.

Die statische Verschleißnivellierung wählt andererseits den Zielblock mit der niedrigsten Gesamtlöschzahl aus, löscht den Block bei Bedarf, schreibt neue Daten in den Block und stellt sicher, dass statische Datenblöcke verschoben werden, wenn ihre Blocklöschzahl unter a liegt bestimmte Schwelle. Dieser zusätzliche Schritt zum Verschieben von Daten kann die Schreibleistung aufgrund des Overheads auf dem Flash-Controller verlangsamen. Die statische Verschleißnivellierung ist jedoch erheblich effektiver als die dynamische Verschleißnivellierung, um die Lebensdauer von Festkörpergeräten zu verlängern.

( Techtarget.com: Verschleißnivellierung )

Leon Carlo Valencia
quelle
6

Freescale Semiconductor beschreibt eine robuste Methode zur drahtlosen Firmware-Aktualisierung für seine Kinetis-Mikrocontroller .

Es heißt: Program Flash Memory Swap .

Systeme mit Flash-Speicher-Swap

Bei Geräten mit zwei oder mehr internen Flash-Blöcken, die Swap unterstützen, kann die Speicherbasisadresse jedes Flash-Blocks ausgetauscht werden. Der Adressort jedes Flash-Blocks wird somit in der logischen Speicherkarte des Geräts vertauscht. Nach einem Reset wählt das eingebaute Flash-Swap-System im Wesentlichen anhand der Position des Flash-Blocks in der logischen Speicherzuordnung aus, welche Software ausgeführt wird. Dies ermöglicht ein Code-Backup-System mit der zusätzlichen Einfachheit der Programmierung. Sie können aus einem Block heraus ausführen, während Sie den anderen Block löschen / programmieren. Auf Kinetis-Geräten überwacht / steuert das Flash-Swap-System alle Schritte des Wechsels von der alten zur neuen Anwendung. Es gibt eine zusätzliche Garantie für einen zuverlässigen Betrieb im Falle eines Stromausfalls während eines dieser Schritte.

Vorteile

  • Einfache Programmierung. Die Anwendung wird immer außerhalb des unteren Blocks in der Speicherzuordnung ausgeführt.
  • Verlusttolerant.
  • Kein Bootloader erforderlich. Keine Verzögerung bis zum Start der Hauptanwendung.
  • Gut geeignet für ein Multitasking-Betriebssystem. Minimale Ausfallzeit der Anwendung. In einem Multitasking-System ist es möglich, die Hauptanwendungsaufgaben weiterhin auszuführen, während Hintergrundaufgaben ausgeführt werden, um die neue Kopie der Anwendung zu aktualisieren.
  • Sicherungskopie des Codes. Es ist möglich, zur bekannten Arbeitsanwendung zurückzukehren.

Nachteile

  • Zusätzlicher Flash-Speicherplatz zum Speichern der Sicherungskopie erforderlich.

Sie können Blöcke aktualisieren und dann austauschen.

Speicherwechsel während des Updates visualisiert

Das verknüpfte Dokument enthält eine detaillierte Beschreibung.

Es sorgt für sicherere Firmware-Upgrades, kostet aber sicherlich mehr , da es mehr Flash-Speicher erfordert . Gilt auch nicht für Mikrocontrollertypen, sondern nur für solche, die den Austausch interner Blitzblöcke unterstützen.

Bence Kaulics
quelle
2
Das sieht gut aus und sieht aus wie eine Lösung, die sicherlich in Betracht gezogen werden muss, wenn sie mit den Kostenanforderungen in Einklang gebracht werden kann. + 1
Helmar