Qt Embedded Programming – Erste Schritte mit Qt für MCUs
Auf unserem Blog haben wir immer wieder verschiedene „Zweige“ von Qt behandelt, wie z.B. 3D, Android, D-Bus usw. (Das letztere […]
Regelmäßige Leser unseres Blogs wissen, dass wir versuchen, Beiträge zu verschiedenen Themen zu schreiben, die mit Programmierung in Qt und darüber hinaus zu tun haben. Heute gehen wir ein wenig über die Programmierung hinaus und konzentrieren uns auf ein Thema, das stärker mit dem Betriebssystem und der Embedded-Industrie verbunden ist. Willkommen zu einer weiteren spannenden Reise!
Heute beschäftigen wir uns mit Yocto Linux, einem Thema, das der Embedded-Community sehr nahesteht. Wir werden einen Blick darauf werfen, was es im Allgemeinen ist und wie man es nutzt. Lassen Sie mich jedoch zu Beginn sagen, dass dieser Beitrag mehr über das gesamte Yocto Linux-Konzept im Allgemeinen handelt und weniger ein Tutorial darüber ist, wie man sein eigenes Image erstellt. Aber wer weiß, vielleicht gibt es bald einen weiteren Beitrag, der mehr als Tutorial dient 😎. Bleiben Sie dran!
Falls Sie jedoch Probleme mit Ihrem Projekt haben, bei dem Sie Yocto Linux verwenden, zögern Sie nicht, uns zu kontaktieren.
Ohne weiteres, fangen wir an!
Bevor wir uns dem Kern dieses Beitrags zuwenden, dem Yocto Linux, ist es sinnvoll, zu wissen/erinnern, was ein Betriebssystem ist. Ich weiß, dass dieses Thema für viele von Ihnen trivial erscheint, aber es wird uns helfen, eine Grundlage für das weitere Lernen zu schaffen.
Ein Betriebssystem (OS) ist Software, die als Vermittler zwischen dem Benutzer eines Computers (oder eines anderen Geräts wie einem Smartphone oder Embedded-Gerät) und seiner Hardware fungiert. Die Hauptaufgaben eines Betriebssystems bestehen darin, die Hardwarearchitekturressourcen des Computers wie den Prozessor, den Speicher, Festplatten sowie Ein- und Ausgabegeräte zu verwalten und grundlegende Dienste für Anwendungen bereitzustellen.
Wir haben also ein Diagramm wie das unten dargestellte. Der Benutzer verwendet am häufigsten Anwendungen auf dem Gerät, die auf dem Betriebssystem laufen, wodurch er Zugang zu den physischen Ressourcen des Computers hat (ja, ich weiß, eine starke Vereinfachung 😅).
Einfaches Diagramm einer typischen System- und Hardware-Architektur
Lassen Sie uns weiter besprechen, welche Typen von Betriebssystemen es gibt. Bei meiner Recherche im Internet bin ich auf viele Definitionen gestoßen, darunter einige, die ich zum ersten Mal gehört habe! Daher habe ich mich entschieden, nur drei davon zu besprechen, die ich für die bekanntesten halte.
Multitasking-Betriebssysteme: Diese ermöglichen es, mehrere Aufgaben (Programme) gleichzeitig von einem Benutzer oder mehreren Benutzern auszuführen. Beispiele hierfür sind Windows, macOS oder Linux. Sie ermöglichen es, die CPU-Zeit zwischen mehreren Prozessen zu teilen, sodass der Benutzer mit mehreren Anwendungen gleichzeitig arbeiten kann.
Echtzeit-Betriebssysteme (RTOS): Diese Systeme wurden entwickelt, um Anwendungen zu unterstützen, die schnelle Reaktionen auf externe Ereignisse innerhalb einer festgelegten, garantierten Zeit erfordern. Sie werden hauptsächlich in Embedded-Systemen wie Industriecontrollern oder medizinischen Geräten eingesetzt.
Mobile Betriebssysteme: Diese sind speziell für die Unterstützung von mobilen Geräten wie Smartphones und Tablets entwickelt. Sie sind für Touch-Interfaces, drahtlose Kommunikation und die Akkulaufzeit optimiert. Zu den bekanntesten gehören Android und iOS.
Wie Sie sehen können, finden wir dank der Vielfalt der Betriebssystemtypen Anwendungen für viele Bereiche. Es wäre sinnlos, wenn es nur eines für alles gäbe. Wie man so schön sagt: Wenn etwas für alles ist, dann ist es für nichts 🧐
Es gibt viele Linux-Distributionen, die oft als „Distros“ bezeichnet werden und darauf ausgelegt sind, verschiedenen Benutzerbedürfnissen gerecht zu werden. Diese Distributionen unterscheiden sich in ihrer Standard-Desktop-Umgebung, der vorinstallierten Software, dem Paketverwaltungssystem und der Community-Unterstützung. Hier sind einige der bekanntesten Linux-Distributionen:
Ubuntu: Eine der beliebtesten Linux-Distributionen, bekannt für ihre Benutzerfreundlichkeit und umfassende Unterstützung. Ubuntu ist eine gute Wahl sowohl für Anfänger als auch für fortgeschrittene Benutzer.
Debian: Wird als eine der stabilsten Distributionen angesehen und ist auch die Basis für viele andere Distributionen, darunter Ubuntu. Debian ist bekannt für seinen rigorosen Paket-Testprozess.
Fedora: Bekannt dafür, immer auf dem neuesten Stand der Technik zu sein, wird Fedora oft von IT-Profis und Entwicklern verwendet.
CentOS (bis vor kurzem): Dies war eine kostenlose Derivat-Distribution von Red Hat Enterprise Linux (RHEL), die für ihre Stabilität und Sicherheit in Serverumgebungen geschätzt wurde. Das Projekt wurde nun auf Arch Linux umgestellt.
Arch Linux: Eine Distribution für fortgeschrittene Benutzer, die vollständige Kontrolle über das System wünschen. Arch ist bekannt für seine Einfachheit und die KISS-Philosophie („Keep It Simple, Stupid“).
Linux Mint: Eine sehr benutzerfreundliche Distribution, die auf Ubuntu basiert. Bekannt für ihre Benutzerfreundlichkeit und das ästhetisch ansprechende Desktop-Umfeld.
Wie Sie sehen können, gibt es viele Distributionen zur Auswahl. Aber was ist, wenn diese Auswahl nicht ausreicht, was ist, wenn Sie tiefer gehen möchten?
Typische Linux-Distributionen wie Ubuntu, Fedora oder Debian sind für den allgemeinen Gebrauch auf Desktops, Laptops oder Servern ausgelegt. Obwohl sie technisch auch auf Embedded-Geräten verwendet werden können, gibt es mehrere Gründe, warum sie möglicherweise nicht die beste Wahl für Embedded-Linux-Distributionen sind:
Größe: Standard-Distributionen beinhalten viele Pakete und Dienste, die für Embedded-Umgebungen unnötig sind, was zu unnötig großen Systembildern führt. In Embedded-Linux-Systemen, in denen der Speicherplatz knapp ist, ist es unerwünscht, Platz für ungenutzte Funktionen zu verschwenden.
Systemressourcen: Diese Distributionen sind darauf ausgelegt, reiche Benutzerumgebungen und eine breite Funktionalität zu bieten, was zu einem höheren Verbrauch von Systemressourcen wie CPU und RAM führen kann. Embedded-Linux-Systeme haben oft begrenzte Ressourcen, daher ist es entscheidend, den Ressourceneinsatz zu minimieren. Dieser Faktor ist entscheidend für Embedded- und IoT-Geräte.
Hardware-Optimierung: Standard-Distributionen sind in der Regel nicht für die spezifische Hardware von Embedded-Linux-Systemen optimiert. Eine solche Optimierung ist entscheidend, um maximale Leistung und Energieeffizienz zu erreichen. Wiederum ist dies wichtig für Embedded- und IoT-Geräte.
Release-Zyklen: Die Release-Zyklen von Standard-Distributionen stimmen möglicherweise nicht mit den Anforderungen von Embedded-Projekten überein, die oft langfristige Unterstützung und Stabilität benötigen. Embedded-Linux-Systeme müssen viele Jahre lang zuverlässig sein, während Standard-Distributionen schnell auf neue Versionen umsteigen, was die Wartung erschwert.
Sicherheit und Updates: Die Verwaltung von Sicherheitsupdates in Standard-Distributionen kann in Embedded-Umgebungen eine Herausforderung darstellen, insbesondere wenn Netzwerkinstallationen schwierig oder unmöglich sind. Embedded-Linux-Systeme erfordern oft spezifische, kontrollierte Update-Umgebungen.
Anwendungsspezifische Anforderungen: Designer von Embedded-Linux-Systemen benötigen oft die vollständige Kontrolle über die Betriebssystemkomponenten, um sie an die spezifischen Anforderungen ihrer Anwendung anzupassen. Standard-Distributionen bieten möglicherweise nicht immer ausreichend Flexibilität bei der Konfiguration. Manchmal muss sogar der Linux-Kernel bearbeitet werden!
Wie Sie sehen können, gibt es viele Dinge, um die man sich kümmern muss, aber gibt es eine Lösung, die all diese Anforderungen erfüllt…?
Ein Linux, das alle beherrscht?
Das Yocto-Projekt ist eine Open-Source-Initiative, die Werkzeuge und Frameworks für die Erstellung benutzerdefinierter Linux-Distributionen (speziell für Embedded-Linux-Distributionen) bereitstellt. Das Projekt wurde 2010 von der Linux Foundation ins Leben gerufen, um den Prozess der Entwicklung von Embedded-Systemen über verschiedene Hardware-Plattformen hinweg zu standardisieren. Ich denke, ich würde nicht lügen, wenn ich sage, dass es eines der bekannteren Open-Source-Projekte unter der Flagge der Linux Foundation ist!
Yocto Project offizielles Logo
Die Geschichte des Yocto-Projekts beginnt mit der Notwendigkeit, eine kohärente, flexible Umgebung für die Erstellung von Software für Embedded-Geräte zu schaffen, die eine Vielzahl von Hardware-Architekturen und Anwendungsanforderungen unterstützen kann. Im Laufe der Jahre hat das Yocto-Projekt breite Anerkennung und Unterstützung in der Industrie erlangt und sich zum Standard für die Erstellung benutzerdefinierter Betriebssysteme für eine Vielzahl von Geräten entwickelt, von einfachen Gadgets bis hin zu komplexen industriellen und kommerziellen Systemen.
Das Yocto-Projekt ist kein Betriebssystem an sich, sondern ein Set von Werkzeugen, die Entwicklern ermöglichen, ihre eigenen Versionen von Linux zu konfigurieren, zu kompilieren und bereitzustellen, die auf die spezifischen Anforderungen ihrer Projekte zugeschnitten sind. Wie Sie sehen können, ist es die perfekte Lösung für viele Embedded-Entwickler!
Jetzt kommen wir zum Kern dieses Artikels 😉. Lassen Sie uns zunächst die Architektur des gesamten Yocto-Projekts besprechen. Wir werden uns dabei an den Bildern aus der offiziellen Dokumentation orientieren.
Architektur des Yocto-Projekts
Beginnen wir mit der Yocto-Projekt „Schicht“, die bereits zum Teil erklärt wurde. Sie vereinfacht den Prozess der Entwicklung und Pflege einer vollständigen Linux-Distribution für Embedded-Systeme und bietet eine flexible Sammlung von Skripten und Metadaten, um eigene Distributionen zu erstellen, die auf spezifische Bedürfnisse zugeschnitten sind.
Als nächstes haben wir Poky, die Referenz-Distribution des Yocto-Projekts. Sie enthält das OpenEmbedded-Bausystem, das die zentrale Engine für den Bau von Distributionen darstellt, sowie eine Reihe von Metadaten, die die Kernpakete und Rezepte für das Basissystem definieren. Poky dient als Ausgangspunkt für die Entwicklung einer eigenen benutzerdefinierten Linux-Distribution.
Metadaten im Yocto-Projekt umfassen Rezepte, Klassen und Konfigurationsdateien, die definieren, wie Softwarepakete gebaut werden und wie sie in das endgültige Image aufgenommen werden sollen. Diese Metadaten sind in Schichten organisiert, wobei jede Schicht einen spezifischen Zweck erfüllt oder auf bestimmte Embedded-Hardware- oder Softwareanforderungen ausgerichtet ist.
Rezeptdateien sind eines der Kernkomponenten der Metadaten von Yocto. Sie enthalten Anweisungen zum Herunterladen, Konfigurieren, Kompilieren und Installieren von Softwarepaketen in das endgültige Image. Rezepte behandeln auch Patch-Anwendungen und definieren Paketabhängigkeiten.
Schichten sind Sammlungen verwandter Metadaten, die die Konfigurations- und Build-Anweisungen modularisieren und organisieren. Dies ermöglicht eine bessere Verwaltung von Abhängigkeiten und Anpassungen. Schichten können spezifisch für Hardware (BSP-Schichten), Softwarefunktionen oder Anwendungsanforderungen sein.
Open Embedded Core und BitBake – hier passiert die ganze Magie!
Schließlich haben wir eine OpenEmbedded-Schicht, die das OpenEmbedded Core und BitBake umfasst.
OpenEmbedded Core (OE-Core) ist ein Teilprojekt von OpenEmbedded, das eine Schicht von Metadaten bereitstellt, die vom Yocto-Projekt verwendet wird. OE-Core enthält die Basis-Sammlung von Rezepten, Klassen und zugehörigen Dateien für den Aufbau grundlegender Linux-Funktionen und dient als Grundlage, auf der zusätzliche Schichten und Anpassungen aufgebaut werden können.
BitBake ist ein Aufgabenexecutor und Scheduler, der zum Ausführen der Builds verwendet wird. BitBake liest die Metadaten (Rezepte und Konfigurationen) und führt die Aufgaben aus, die erforderlich sind, um das angegebene Ziel zu bauen. BitBake übernimmt die Abhängigkeitsauflösung, das Planen und Ausführen von Aufgaben und ist damit eine zentrale Komponente des Yocto-Projekt-Bausystems.
Board Support Packages (BSPs) im Yocto-Projekt sind entscheidende Komponenten, die es ermöglichen, Linux-Systeme für spezifische Hardware-Plattformen anzupassen. Sie enthalten Treiber, Kernel-Konfigurationen, Bootloader und andere Elemente, die erforderlich sind, damit das Betriebssystem auf einem bestimmten Gerät funktioniert. BSPs ermöglichen es Entwicklern, das Linux-System effizient an unterschiedliche Hardwareanforderungen anzupassen und die Entwicklung von Embedded-Projekten zu erleichtern.
Beispielsweise, wenn Sie ein Linux-basiertes System für ein STMicroelectronics STM32-Mikrocontroller-Board entwickeln, würden Sie ein BSP verwenden, das speziell für die STM32-Familie entwickelt wurde. Dieses BSP würde alle notwendigen Komponenten wie Peripherietreiber (für GPIO, UART, I2C usw.), die STM32-Kernel-Konfiguration und die Bootloader-Einrichtung enthalten, die speziell für STM32-Geräte angepasst sind.
Puh, das klingt kompliziert, oder? Um es etwas einfacher für Sie zu machen, werde ich versuchen, den gesamten Yocto-Linux-Entwicklungsprozess in einfacheren Worten und mit einem einfacheren Diagramm zu beschreiben 😅.
Wenn ich etwas beschreibe, bringe ich gerne kulinarische Vergleiche ins Spiel, also versuche ich es jetzt auch 😎.
Versuchen wir es noch einmal
Setup: Sie beginnen damit, die Zielhardware anzugeben, für die Sie das Betriebssystem erstellen möchten. Dann müssen Sie Ihre Entwicklungsumgebung einrichten. Dies bedeutet, dass Sie das Yocto-Projekt installieren und sicherstellen, dass Sie alle notwendigen Abhängigkeiten auf Ihrem Computer haben. Es ist wie das Einrichten Ihrer Küche, bevor Sie mit dem Kochen beginnen.
Wählen Sie die Basis-Distribution (Poky): Denken Sie an Poky als Ihren Ausgangspunkt oder den Basis-Teig Ihres Projekts. Es ist die Referenz-Distribution des Yocto-Projekts und kommt mit der grundlegenden Software und den Bibliotheken, die Sie benötigen, um Ihr benutzerdefiniertes Betriebssystem zu erstellen.
Schichten hinzufügen: Schichten im Yocto-Projekt ermöglichen es Ihnen, zusätzliche Software und Konfigurationen hinzuzufügen, die spezifisch für Ihr Projekt sind. Sie können vorhandene Schichten verwenden, die von anderen erstellt wurden, oder Ihre eigenen erstellen. Es ist ähnlich wie das Auswählen Ihrer Beläge für eine Pizza, um sie genau nach Ihrem Geschmack zu gestalten 🍕
Rezepte konfigurieren: Rezepte sagen Yocto, wie es Ihre Software bauen soll. Sie definieren Rezepte für die Anwendungen und Systemkomponenten, die Sie in Ihrer Distribution haben möchten. Es ist wie das Befolgen eines Kochrezepts, um sicherzustellen, dass Sie das gewünschte Ergebnis erzielen.
Image bauen: Sie starten den Build-Prozess, bei dem BitBake, das Build-Tool von Yocto, die Rezepte analysiert, Abhängigkeiten auflöst und die Software kompiliert, um ein Betriebssystem-Image zu erstellen. Zeit zum Backen! 😋
Genießen!: Nach dem Build können Sie das Image auf Ihrer Zielhardware oder mit einem Emulator testen, um sicherzustellen, dass alles wie erwartet funktioniert. Wenn Sie Änderungen vornehmen müssen, können Sie die Konfiguration, Rezepte oder Schichten anpassen und den Build-Prozess erneut starten, um ein aktualisiertes System-Image zu erstellen. Sobald Sie mit dem Ergebnis zufrieden sind, kann das Betriebssystem-Image auf den Zielgeräten bereitgestellt und verwendet werden!
OK, ich habe viel Theorie zitiert, aber wie sieht es mit der Praxis aus? Vielleicht ein Beispiel?!
Wie bereits erwähnt, ist der heutige Blogbeitrag eher allgemein im Hinblick auf das Yocto-Projekt. Wenn Sie jedoch testen möchten, wie alles funktioniert, empfehle ich Ihnen, es wie ich zu tun, also ein Beispiel-System-Image zu erstellen, indem Sie den Anweisungen in der offiziellen Yocto-Projekt-Dokumentation folgen.
Der erste Schritt ist, unsere Umgebung vorzubereiten. Lassen Sie mich sagen, dass Linux-Benutzer es einfacher haben, da sie direkt die notwendigen Komponenten herunterladen können. Für Benutzer anderer Systeme können Sie entweder:
CROssPlatformS (CROPS) verwenden – ein Docker-Container für kurze…
…verwenden Sie WSL2, wenn Sie mit Windows arbeiten – ich habe diese Option verwendet 😉 (Ubuntu installiert)
Bevor Sie mit der Arbeit beginnen, machen Sie sich mit den Anforderungen vertraut. Der Bau Ihres benutzerdefinierten System-Images kann viel Speicherplatz verbrauchen!
Okay, gehen wir davon aus, dass Sie die Umgebung bereits haben, jetzt müssen Sie nur noch die Build-Umgebung mit Poky initialisieren:
Ausgabe des Befehls source oe-init-build-env
Jetzt können Sie mit dem Build eines Beispiel-Images fortfahren, indem Sie den Befehl bitbake core-image-sato verwenden:
Seien Sie geduldig, je nach Hardware, auf der Sie bauen, kann dieser Prozess mehrere Stunden dauern!
Nach dem Build können Sie Ihr Ergebnis mit dem Befehl runqemu qemux86-64 testen:
Der langsame Startprozess liegt daran, dass ich Linux in Linux ausführe
Das war es für den heutigen Blogbeitrag. Ich hoffe, er hat Ihnen gefallen, wer weiß, vielleicht ist dies erst der Anfang des weiten Themas Yocto Linux und vielleicht wird es noch mehr Inhalte geben 🧐
Kommen wir zur Sache: Es ist eine Herausforderung, Top-Qt-QML-Entwickler zu finden. Helfen Sie sich selbst und starten Sie die Zusammenarbeit mit Scythe Studio – echten Experten im Qt C++ Framework.
Entdecken Sie unsere Fähigkeiten!Auf unserem Blog haben wir immer wieder verschiedene „Zweige“ von Qt behandelt, wie z.B. 3D, Android, D-Bus usw. (Das letztere […]
Die Entwicklung der Wissenschaft hat viele Bereiche der Menschheit tiefgreifend beeinflusst. Doch welcher Wissenschaftszweig hatte im letzten Jahrhundert den größten […]
Heutzutage ist die Softwareentwicklung ein integraler Bestandteil der Erstellung medizinischer Projekte. Das ist keine Überraschung, da medizinische Softwarelösungen zu den […]