Nie wieder Fehler beim Verwenden von Flashspeichern! Ein Traum, der mit etwas Mühe zum Greifen nahe ist? Ja, zumindest kann man sich das Entwicklerleben sehr erleichtern, wenn Fehler von vornherein vermieden werden oder das System, in dem ein Fehler gesucht werden soll, vereinfacht werden kann. Keine neue Idee, aber wie kann man das umsetzen? In solchen Situationen kann die Simulation bzw. Emulation von einzelnen Hardwarekomponenten ein echter Retter sein.
Im November 2022 haben wir uns im Blogeintrag, „Simulation? Wozu, hab doch ’ne Hardware“, bereits eingehend mit den Vorteilen von Simulationen in der Embedded-Softwareentwicklung befasst und nebst zahlreichen Anwendungsfällen auch die Emulation von Flash- oder EEPROM Speichern erwähnt.
Der folgende Blogeintrag zeigt anhand eines konkreten Beispiels, wie solch eine Emulation von Flashspeicher-Hardware dabei helfen konnte, Fehler schneller zu finden und Software gezielter und besser getestet zu entwickeln.
Houston, we have a problem
Dieser oder vielleicht auch etwas weniger dramatische Sprüche geistern im Kopf herum, wenn aus dem sprichwörtlichen Nichts heraus ein Fehler im System auftaucht, bei dem auf den ersten Blick erstmal alles komisch zu sein scheint. So auch in unserem Beispiel. Es handelte sich um ein Embedded-System mit externem Flashspeicher, auf den regelmäßig geschrieben und wieder gelesen werden soll. Blöd nur, wenn die gelesenen Daten nicht immer den zuvor geschriebenen Daten entsprechen, sondern Abweichungen auftreten. Klar ist, der Fehler liegt im Detail, in den meisten Fällen funktioniert alles wie es soll und es geht nur um wenige Bytes unter den hunderttausenden auf dem Chip.
Von der Theorie zur Praxis: Vorgehen
Um solche oder ähnliche Fehler im Umgang mit Flashspeichern in den Griff zu bekommen, können bestimmte Abschnitte der Logik abstrahiert und durch eine Emulation nachempfunden werden.
Im ersten Schritt gilt es den Fehler einzugrenzen und zu reproduzieren. Dafür kann beispielsweise der Teil des Codes, welcher für das Schreiben und Lesen des Flashspeichers, also für die Kommunikation zuständig ist, aus dem Sourcecode des Projekts herausgelöst und so umgebaut werden, dass er in einer herkömmlichen Entwicklungsumgebung auf dem PC laufen kann. Dazu wird, je nach Komplexität, freilich einiges an zusätzlichem Code benötigt, welcher etwa die benötigten Datenstrukturen, Klassen oder die zu Schreibenden Daten bereitstellt.
Die Kernidee ist jedoch die Isolation des Problems, daher werden im zweiten Schritt die für den Hardwarezugriff auf den Flash zuständigen Methoden durch einen einfachen Dateizugriff ersetzt. Der Inhalt des Flashs wird also in einer Datei abgebildet. Statt tatsächlich auf die Hardware zuzugreifen, werden die gewünschten Speicherzugriffe demnach nun simuliert.
War man auf der Suche nach einem Problem mit dem Speicher, zeigt sich nun, nach Ausschlussprinzip, ob die Fehler in der Hard- oder der Software entstanden sind. Ist dies festgestellt, kann, durch debuggen oder weitere Abkapselung und Vereinfachung der Fehler eingegrenzt und gefunden werden. Für die Fehlerbehebung kann nun, Dank der Emulation deutlich robustere Software entwickelt werden, da sich spezielle Hardwarefehler einfach vortäuschen lassen, oder sich (Unit-)Testen und Debuggen gemütlicher gestalten. Diese und weitere Vorteile, die sich aus präventivem Simulieren ergeben, können demnach auch für eine Folge- oder Neuentwicklung interessant sein.
Durch Simulation zum Erfolg: Vorteile auf einen Blick
Zu den Vorteilen, Simulationen auch schon während der Entwicklung einzusetzen und nicht erst, wenn ein Fehler auftritt, zählen:
- Erleichtertes (Unit-)Testen und Debugging
- Verifikation von Speicherlayouts (Verhalten an Blockgrenzen)
- Überprüfung des Langzeitverhaltens (z.B. bei Speicherüberlauf von Ringspeicherimplementierungen)
- Einfache Simulation von Hardwarefehlern wie kippenden Bits, defekten Speicherblöcken usw.
- Bessere Portierbarkeit durch Layering, Abstraktion und Kapselung
Fazit
Die Simulation von Hardwarekomponenten ist eine äußerst wertvolle Praxis in der Embedded-Softwareentwicklung. Natürlich ist nicht jede Hardwarekomponente so einfach zu simulieren wie in unserem Beispiel durch simple Nachbildung eines Flashspeichers. Jedoch vereinfacht dieses Vorgehen Entwicklern die Arbeit enorm und durch geschickte Abstraktion und Simulation können Projekte schneller vorangebracht und potenzielle Probleme frühzeitig erkannt werden.
In jedem Fall lohnt es sich, bereits zu Projektbeginn über die Möglichkeiten der Simulation nachzudenken und kreative Lösungen zu entwickeln. Wir helfen Ihnen gerne, zögern Sie also nicht, uns mit ihren Fragen anzusprechen.