Fernwartung und Fernaktualisierung funktionieren. Allerdings stellt speziell die Fernaktualisierung von eingebetteten Systemen selbst Experten immer wieder vor Herausforderungen. Daher stehen und fallen diese Systeme mit der grundlegenden Codequalität und Robustheit der Geräte.
Damit die Fernwartung nicht zu oft eingreifen muss, stellen IT-Fachleute bereits bei der Codeerstellung sorgfältig sicher, dass die interne Qualitätssicherung klappt. Wie das genau funktioniert, wie effektive Codes entwickelt werden und wie man diese an dynamisch wechselnde Ziele und Märkte anpasst, lesen Sie im Folgenden.
Diese Werkzeuge sichern die Codequalität
Hardwarelösungen für das automatische Flashen und Testen von Produkten gewinnen mit jedem Tag mehr an Bedeutung. Mit Continuous Delivery (CD)-Tools wie GitHub, GitLab, Jenkins und Azure DevOps ist es möglich, in diesem Kontext ausführbare Dateien oder Binärdateien automatisch zu generieren. Diese können jederzeit direkt auf Geräte geflasht werden. Um hier das Maximum aus einem Code herauszuholen, erstellen, testen, ändern und rationalisieren unsere Expertenteams die Software bis zu deren Maximum.
Mehr über:
Nach jeder Codeänderung testen wir aufs Neue. Damit verifizieren wir die Qualität des Codes und stellen sicher, dass dieser den Standards der statistischen Analyse entspricht. So finden wir Bugs und Fehler frühzeitig und merzen sie aus. Träten diese im Regelbetrieb auf, stünde eine Maschine womöglich Stunden oder Tage still. Der Aufwand lohnt sich also. Tools wie GitHub Actions, GitLab Pipelines, Jenkins und Azure DevOps sind uns eine wertvolle Hilfe. Sie bürgen dafür, dass jede Codezusammenführung direkt auf das Gerät übertragen wird und überprüfen automatisch die Grundfunktionen.
Gleichzeitige Änderungen auf allen Maschinen
Eine der effektivsten Methoden, um Konsistenz zu erreichen, ist die Implementierung von containerisierten Arbeitsumgebungen, die es neuen Entwicklern erleichtern, mit einem Produkt zu arbeiten. Der größte Vorteil containerisierter Umgebungen besteht darin, dass alle auf derselben Maschine arbeiten, sodass es keine Probleme gibt, bei denen etwas auf einem Gerät funktioniert, aber nicht auf allen. Darüber hinaus ist die Einarbeitung neuer Mitarbeiter einfach und unkompliziert. Änderungen an einer Maschine werden gleichzeitig für alle Mitarbeiter übernommen. Auf diese Weise können voneinander getrennte Teams mühelos mit Änderungen Schritt halten, sodass keine Zeit und Ressourcen für ältere Versionen verschwendet wird.
Zugriff für alle auf alles – die Vorteile eines Containers sind klar. Aber was sollte in einen Container integriert werden? Unsere Experten sprechen aus Erfahrung. Unabhängig von Projekten, sollten Teams im Allgemeinen einen Container erstellen, der alles für die Entwicklung eines Produkts inklusive Fehlerbehebung enthält. Essentielle Bestandteile wären ein Kompilierungs-Toolchain, Werkzeuge zur statistischen Analyse, Debugging-Tools sowie alle notwendigen Bibliotheken.
Unternehmen profitieren also von Containern. Dennoch, die Lizenzen für jeden Container können kostspielig und zeitaufwendig sein. Und hier kommen wir ins Spiel. Software Mind navigiert Sie durch diesen Lizenzdschungel und lichtet die Kosten durch Open-Source-Alternativen. Die Entwicklung von Containerverwaltungen kann zeitaufwendig sein. Wir beschleunigen diesen Prozess als externes Entwicklerteam und stellen sicher, dass Sie sich auf Ihr Kerngeschäft konzentrieren können.
Sie sehen die Vorteile und Herausforderungen der Container-Arbeit. Was immer für Sie überwiegt – wir zeigen Ihnen auch eine Alternative. Virtuelle Maschinen sind separate Geräte, welche die gleichen Vorteile wie Container bieten. Eine solche „virtual machine“ ist einfacher einzurichten. Ein Nachteil ist, dass ein solcher virtueller Computer erhebliche Rechenleistungen benötigt.
Automatisierte Testes bieten Entwicklern eingebetteter Software wichtige Unterstützung
Automatisierte Tests zeigen schnell, ob ein Produkt den Anforderungen des Kunden entspricht. Diese Tests sind flexibel einsetzbar. Sprich: Es können bei Bedarf weitere Testebenen hinzugefügt oder überholte Schritte übersprungen werden.
Nützliche Tests
Smoke Testing: Diese Tests stellen sicher, dass die kritischen Aspekte eines Gerätes wie gewünscht und beabsichtigt funktionieren. Der Name Smoke Testing wird davon abgeleitet, dass alle kritischen Aspekte auf dem nötigsten Stand funktionieren, ohne dabei in Flammen aufzugehen.
Integrationstests: Hier wird überprüft, ob eine Codebasis als Ganzes nach der Implementierung verschiedener Änderungen funktioniert. Die Tests gelten als gründlicher als Smoke Tests.
Unit-Tests: Diese automatisierten Tests teilen den Code in die kleinstmöglichen Einheiten auf. Diese Überprüfungen sind bei der Implementierung von Test Driven Development (TDD) nützlich. Beispiele für Unit-Tests sind Gtest von Google und Catch2. Damit sich alle hier erforderlichen Zugriffe rein auf die Hardware beschränken, nutzen wir ein Mocking-Framework. Beispiele dafür sind Gmock, FakeIT und Cmock.
Jeder der genannten Tests kann basierend auf den Anforderungen eines bestimmten Geräts angepasst und ausgebaut werden. Dies geschieht mittel Fuzz-Tests, Hardware-Verifizierungstools oder Kalibrierungswerkzeugen von Drittanbietern.
Wiederverwendbare Codes behalten
Wiederverwendbare Codes sparen Zeit, reduzieren Wiederholungen und verbessern die Wartbarkeit. Sie können und sollten auch für andere Produkte eingesetzt werden. Dabei fokussieren wir uns aber nicht auf ein Code-Programm. Im Sinne der Kosteneffizienz und der besseren Organisation sollte man sich stets auf mehrere Systeme verlassen.
Es gilt zu beachten: Je nach Anwendungsfall kann die Aufteilung der Firmware in logische Code-Einheiten sehr schwierig sein. Insbesondere dann, wenn es um direkten Zugriff auf die Hardware geht. Daher kümmert sich ein gutes Build-System wie CMake, Meson oder Bazel mit einer Skriptsprache um die Kompilierungskomplexitäten. Zudem überprüfen Unit-Tests, ob Ihr Modul an mehrere Architekturen und Produkte angepasst werden kann.
Kontaktieren Sie einen unserer Experten und erfahren Sie mehr über unser Angebot für Embedded-Dienstleistungen.
Über den AutorRafal Jasiński
Senior Embedded Software Engineer
Sie suchen einen Mann mit reichlich Erfahrung darin, globale Unternehmen als Senior Embedded Software Engineer zu unterstützen? Dann ist Rafal Jasiński Ihr Mann. Er verfolgt mit geübtem Blick Trends im Embedded-Bereich und integriert jene, die sinnvoll sind, in seine Arbeit mit unseren Kunden. Seine Leidenschaft für Innovationen ergänzt er durch sein Engagement für Qualität und Detailgenauigkeit. Genau diese Einstellung macht Rafal zu einem zuverlässigen Partner für seine Kollegen und unsere Kunden.