Führen Sie die Desktop-Software auf dem Mikrocontroller aus


Embox nahm am TechTrain IT Festival teil. Wie beim ersten Mal haben wir die Eisenstücke mitgebracht und unsere Erfolge live gezeigt. Wir haben bereits über einige auf dem Habré geschrieben, aber man weiß nie wer :). VoIP-Telefon , Qt und OpenCV wurden gezeigt, alle basierend auf STM32F7-Discovery. Zusätzlich zum Stand haben wir drei Berichte erstellt. Ich habe bereits Ideen des ersten über das offene Projekt auf einem Habr beschrieben In diesem Artikel möchte ich die Ideen eines anderen Berichts erläutern, der als "Starten der Desktop-Software auf Mikrocontrollern" bezeichnet wurde . Wenn ich diese Gelegenheit nutze, erzähle ich Ihnen ein wenig über meine Gefühle bezüglich des Festivals.

TechTrain


Lassen Sie mich zunächst ein wenig über das Festival selbst erzählen. Wer nicht interessiert ist, kann sofort zum Abschnitt „Starten der Desktop-Software auf dem Mikrocontroller“ zurückspulen.

Das erste, was mir beim Festival aufgefallen ist, waren viele Leute. Wir sind es leid, am Stand zu stehen, zu sprechen, eine Suche durchzuführen und zu kommunizieren. Auf der anderen Seite war es sehr lustig und interessant, und vor allem haben wir viele positive Emotionen bekommen, zum Beispiel haben uns mehrere Leute gesagt, dass wir einen guten Blog im Hub haben :). Die Festivalteilnehmer kamen aus verschiedenen Tätigkeitsbereichen und nicht einmal aus der IT, da der Slogan des Festivals "ein großartiges Festival für Entwickler, Ingenieure und Sympathisanten" lautet. Es gab viele Kinder, ein Junge am Ende des Festivals zog eine Robotermaschine vom Stand und spielte damit. Weder der Junge noch der Roboter wurden verletzt.

Um die Breite des Publikums verständlicher zu machen, werde ich es anders veranschaulichen. Auf dem Festival wurden viele Aktivitäten durchgeführt, eine davon war eine Suche. Die Teilnehmer der Quest mussten zu den Ständen gehen, die erfundenen Aufgaben erledigen und einen Ausdruck erhalten. Dafür hat jemand sogar einen ganzen Quadrocopter bekommen. Aber jetzt geht es nicht darum. Wir waren auch einer der Orte, an denen man ein Siegel bekommen konnte. Wir hatten Aufgaben vorbereitet, einschließlich Fragen. Die Fragen zu Open Source-Software und eingebetteten Systemen waren einfach. Aber das Kontingent war so unterschiedlich, dass einige die Einfachheit der Frage ablehnten, während andere in eine Betäubung gerieten. Das letzte Mal haben wir natürlich geholfen, erzählt (oder Google vorgeschlagen) über Dinge wie: "Wer sind die Schöpfer der C-Sprache", "Was ist berühmt für Linus Torvalds", "Was ist der Unterschied zwischen einem Mikroprozessor und einem Mikrocontroller" oder "Was ist ein Cross-Compiler". Infolgedessen blieb niemand ohne Druck. Übrigens war es ein wenig seltsam, aber verdächtig viele leicht zu entschlüsseln "GNU - GNU ist nicht Unix". Wahrscheinlich für Stallman vorbereitet. :) :)

Der zweite folgt aus dem ersten. Es gab Unterhaltung für ein sehr breites Publikum. Zum Beispiel brachte Habr einen Sandkasten mit. Es war zwar keine lokale Sandbox, in der man eine Einladung für einen Artikel erhalten konnte, aber es war möglich, sich darin zu suhlen. Über Einladungen im Sandkasten habe ich nicht nachgedacht zu fragen, vielleicht haben sie wie in einem echten Sandkasten gegeben. Es gab einen Club alter Computer , auf denen man spielen konnte, was viele taten. Es gab Spielautomaten aus dem Museum der sowjetischen Spielautomaten . Die Sberbank bot einen Entspannungsbereich, in dem man auch schon in der Spielstation spielen konnte. Es gab traditionelle Ja-IT-Kicker und viele andere Unterhaltungen. Leider mussten wir arbeiten, daher spreche ich nur über das, was von unserem Stand aus sichtbar war.

Die dritte und wahrscheinlich wichtigste Sache war, dass es den Organisatoren gelang, Vertreter praktisch aller Bereiche zu sammeln, von der Webentwicklung über verteilte Systeme bis hin zu Embedded-Systemen. Von Entwicklern und anderen Technikern bis hin zu Mitarbeitern, die sich nur dafür interessieren, zum Beispiel Gamer (schließlich war es möglich, sich in Romero selbst zu hacken) oder DIY-Enthusiasten. Es gab QS von COMAQA, es gab Teamleiter von Burning Lead . Es gab Gemeinden verschiedener Städte (Rostow, Twer, Krasnodar). Infolgedessen waren die Berichte und Stände thematisch sehr unterschiedlich. Unser Stand befand sich beispielsweise zwischen der Community der Teamleiter Burning Lead und dem Stand des St. Petersburg Club of IT Directors .

Infolgedessen näherten sich Menschen mit sehr unterschiedlichen Hintergründen unserem Stand, es gab Webentwickler und Dotnet-Wangen, es gab JS und Pluspunkte. Jemand erinnerte sich, dass er noch an der Universität etwas am AVR gemacht hatte, jemand sagte, dass er Spaß mit RaPi oder Arduino hatte. Es gab viele DotNet-Küken, viele fragten sich, ob wir ein .NET Micro Framework hatten . Wir haben uns sogar überlegt, ihn nicht zu uns zu ziehen. Erwartungsgemäß gab es viele Fragen zu Rust. Kurz gesagt, meiner Meinung nach ist es den Organisatoren gelungen, die Idee des Festivals „Finde heraus, was andere leben!“ Ganz gut umzusetzen. Wie bei jedem Festival geht es auch hier darum, andere zu sehen und sich zu zeigen :).

Ja, Fotos werden hier nicht gegeben. Einige Bilder , darunter mit einem lebenden Jungen Volodya, können in unserer Gruppe angesehen werden. Natürlich versprachen sie in der Techtrain-Gruppe, eine Reihe hochwertiger Fotos, mehr zu posten.

Starten Sie die Desktop-Software auf einem Mikrocontroller


Mein Bericht war eine Art Zusammenfassung der Ergebnisse einiger unserer Arbeiten zum Starten von Desktop-Software ( Qt , OpenCV , pjsip ). Der Bericht richtet sich an die breite Öffentlichkeit. Für einen Habr werde ich versuchen, viele Details zu reduzieren, und für notwendige Dinge werde ich den Link oder die Schlüsselwörter für die Suche geben.

Zunächst werde ich eine Art Agenda geben. In der Tat wird es 3 Teile geben. Zunächst werde ich die Schwierigkeiten beim Übertragen von Desktop-Software auf Mikrocontroller erläutern und dabei den Unterschied zwischen dem Mikrocontroller und dem Mikroprozessor erläutern. Ich beantworte auch eine wichtige Frage, z. B. Ziegenbajan , warum Desktop-Software auf einem Mikrocontroller ausgeführt wird, und schließlich erkläre ich Ihnen, wie wir die Kosten für die Übertragung dieser "Desktop" -Software auf Mikrocontroller erheblich senken konnten.

Was ist der Unterschied zwischen Mikrocontrollern und Mikroprozessoren?


Eine unserer Fragen zur Suche klang also und vielleicht erschien unter dem Einfluss dieser ein Artikel über einen typischen Programmierer, der erklärte, wie sie sich unterscheiden. Ich bin mit allem in dem Artikel einverstanden, aber wir werden versuchen, es in unseren eigenen Worten zu erklären und einige andere Akzente zu setzen.

Was ist eine Micro Controller Unit (MCU)? Wenn Sie sich Wikipedia ansehen, können Sie verstehen, dass ein Mikrocontroller ein System auf einem Chip ist, dh ein Prozessor und Peripheriegeräte befinden sich in einem Chip.

Der Begriff System-on-a-Chip (System-on-a-Chip, SoC) ist ein umfassenderes Konzept als ein Mikrocontroller. Dies ist eine solche elektronische Schaltung, die in einen einzelnen Chip integriert ist, der einen Mikroprozessor (CPU) und Peripheriegeräte enthält. In jedem Mobiltelefon befindet sich ein Chip, in dem sich neben mehreren Prozessorkernen eine Reihe von Peripheriegeräten befinden. Sogar x86-Prozessoren enthalten jetzt Bridges und sogar GPU. Ich möchte mich aber nicht auf eine klare Klassifizierung konzentrieren, sondern auf die Merkmale. Jeder kennt diese Systeme auf einem Chip:
  • Verbrauchen Sie weniger
  • Sind billiger
  • Weniger produktiv

Nicht jeder weiß, dass sie durch die Reduzierung der Anzahl der Kontakte noch zuverlässiger sind und möglicherweise einen größeren Temperaturbereich haben.

Der Mikrocontroller ist noch stärker integriert und enthält auch Speicher (RAM und ROM), der auch als Peripherie bezeichnet wird. Dementsprechend bleiben die Eigenschaften erhalten, verbrauchen noch weniger, kosten noch weniger, noch weniger produktiv, noch zuverlässiger.

Ich möchte ausführlicher über „noch weniger produktiv“ sprechen. Tatsache ist, dass es einerseits richtig ist, eine moderne Allzweck-CPU oder einen SoC zu verwenden und eine deutlich höhere Leistung im sogenannten DMIPS zu erzielen. Aber wenn Sie darüber nachdenken, warum so eine Leistung? Als Beispiel gebe ich die Quake and Doom-Spiele (deren Schöpfer John Romero beim Festival war), sie haben auf dem Pentium MMX großartig funktioniert. Die Leistung von Systemen, die auf dieser CPU basieren, wird jedoch bereits von Top-End-Mikrocontrollern blockiert. Ich meine STM32F7 oder sogar STM32H7 . Das heißt, basierend auf diesen MCUs ist es durchaus möglich, Anwendungen auf Doom- und Quake-Ebene auszuführen, was Ihrer Meinung nach überhaupt nicht schlecht ist.

Lassen Sie uns über eine weitere Funktion der MCU sprechen - den internen Speicher. Sie befindet sich, wie gesagt, direkt auf dem Chip und ist dementsprechend sehr schnell. Aber sie ist natürlich nicht genug. Aber wie wenig? Der Mikrocontroller STM32F769 enthält 2 MB Flash (ROM) und 512 + 16 + 4 kB SRAM (RAM). Darüber hinaus verfügt die STM32F769i-Disco-Karte beispielsweise auch über einen externen Speicher (128-Mbit-SDRAM und 512-Mbit-Quad-SPI-Flash-Speicher), der direkt angesprochen wird. Ich spreche nicht einmal über die Möglichkeit, eine SD-Karte oder einen USB-Anschluss anzuschließen. Wenn Sie sich an den berühmten Satz erinnern, dass 640 KB für alle ausreichen sollten, stellt sich die vernünftige Frage: Warum ist moderne Desktop-Software so gefräßig? Beispielsweise verbraucht ein Taschenrechner in Windows 10 im Standby-Betrieb bis zu 16 MB Speicher.

Fahren wir mit der nächsten Funktion der MCU fort, dem Vorhandensein eines ROM. Tatsächlich enthalten Systeme mit einer CPU auch ein ROM, die Ausführung beginnt damit, und das BIOS startet, aber der Rest der Software wird in den RAM geladen und von dort ausgeführt. In eingebetteten Systemen ist es üblich, Code direkt auszuführen, der als eXecute-In-Place (XIP) bezeichnet wird. Linux unterstützt diesen Modus übrigens auch, aber die Hauptsache ist, alles in den Hauptspeicher zu laden und ihn sogar dann auszuführen. Die Möglichkeit, direkt vom ROM aus auszuführen, ist aus zwei Gründen wichtig: Die erste ist die Harvard-Architektur. Durch die Trennung von Befehlsbus und Datenbus können Sie die Geschwindigkeit der Programmausführung erhöhen. das zweite - natürlich wird weniger Speicher verschwendet, da zumindest ein Codesegment nirgendwo anders kopiert werden muss.

Ein weiteres wichtiges Merkmal der MCU ist das Fehlen eines Moduls wie der MMU , dh Mikrocontroller bieten keine Hardwareunterstützung für die Verwaltung des virtuellen Speichers . In der MCU haben nicht alle MPUs , und der Code wird im selben Adressraum ausgeführt. Daher ist es schwierig, eine vollständige Fork () zu organisieren. Aber fork () selbst, wie wir im Artikel „fork () vs. vfork () ”ist ein ziemlich schwerer Systemaufruf und kann aufgrund seiner Funktionalität in vielen Fällen durch vfork () oder posix_spawn () ersetzt werden.

Zusammenfassend lässt sich sagen, wie sich Mikrocontroller von Mikroprozessoren unterscheiden:
In Bezug auf Hardware:
  • Mikrocontroller verfügen über alle erforderlichen Peripheriegeräte einschließlich Speicher
  • Mikrocontroller haben deutlich weniger Speicher
  • Mikrocontroller haben keine Hardware-MMU
  • Mikrocontroller haben eine niedrigere Taktrate und möglicherweise eine andere Prozessorarchitektur (Geschenkarchitektur)


In Bezug auf Verbrauchereigenschaften:
  • Mikrocontroller verbrauchen weniger Energie, können mit Batterie arbeiten
  • Mikrocontroller sind billiger
  • Mikrocontroller sind zuverlässiger
  • Mikrocontroller sind weniger produktiv


Warum Desktop-Software auf einem Mikrocontroller ausführen?


Daher sind MCUs weniger produktiv und ursprünglich für Steuerungsaufgaben vorgesehen (und vorgesehen). Warum also Software ausführen, die für eine andere Klasse von Systemen entwickelt wurde? Nun, auch wenn ihre Leistung für solche Aufgaben bereits ausreicht, können diese Aufgaben jedoch auf herkömmliche Weise für Mikrocontroller gelöst werden. Das heißt, verschiedene kleine RTOS zu verwenden oder Code von Grund auf neu zu schreiben, was als Bare-Metal bezeichnet wird. Es gibt eine offensichtliche Antwort: Anfangs waren die Verwaltungsaufgaben sehr einfach, jetzt steigen die Anforderungen an die Funktionalität rasant. Selbst von einer schäbigen Glühbirne, die sie über das Internet kontrollieren wollen, spreche ich nicht über den Wasserkocher. Sie werden wahrscheinlich bald die Zusammensetzung des Tees entsprechend der Stimmung des Besitzers auswählen und die optimale Menge Wasser auf die optimale Temperatur erwärmen, um die Umweltsituation zu verbessern. :) :)

Daher ist es nicht verwunderlich, dass ständig versucht wird, die bereits entwickelte Software in Mikrocontrollern zu verwenden. Einer der ersten und weithin bekannten Versuche, Linux auf kleinen Plattformen auszuführen, ist beispielsweise ucLinux, jetzt ist es der NOMMU-Modus, hauptsächlich Linux. Die Idee war, Linux auf Hardwareplattformen ohne MMU auszuführen, aber wir haben herausgefunden, dass dies einer der Hauptunterschiede zwischen der CPU und der MCU ist.

Kurz gesagt, die Vorteile der Verwendung von vorgefertigter Software:
  • Entwicklungskosten reduzieren
  • Kürzere Markteinführungszeit
  • Fehler im Code reduzieren. Vorgefertigte Software ist zuverlässiger.


Wie wir es bei Embox machen


Hier verstehen Sie, dass Sie sehr lange sprechen können, aber ich werde erneut versuchen, die Hauptpunkte in einer Arbeit und auf zugängliche Weise zu skizzieren.

Der erste. Embox verwendet das Mybuild-Build-System mit einer eigenen Sprache zur Beschreibung von Modulen und Systemen. Wir haben darüber im Artikel „Mybuild - ein Build-System für modulare Anwendungen“ geschrieben . Mit diesem Build-System können Sie nichts Überflüssiges in das Image aufnehmen, sondern nur das, was erforderlich ist. Sie können die Systemmerkmale wirklich optimieren, um beispielsweise PJSIP auf STM32F7 auszuführen. Wir haben die Anzahl der Ethernet-Pakete auf 16 begrenzt, indem Sie einfach eine Zeile in die Konfigurationsdatei für das System geschrieben haben
include embox.net.skbuff(amount_skb=16) 

Mybuild analysiert Abhängigkeiten und generiert verschiedene Artefakte, darunter Header-Dateien, Linker-Skripte und Makefiles. All dies ermöglicht es, den Speicherbedarf erheblich zu reduzieren und die Teile, die überhaupt nicht verwendet werden, nicht einzubeziehen.

Der zweite. Offensichtlich muss Embox POSIX unterstützen und es wird unterstützt. Darüber hinaus haben wir unsere eigene Standardbibliothek implementiert, da diese je nach Konfiguration des Systems ebenfalls neu erstellt werden muss.

Der dritte. Statische Verknüpfung. Um Probleme mit einem einzelnen Adressraum zu vermeiden, die Bildgröße zu reduzieren und nur die erforderlichen Teile einzuschließen, verwenden wir einen statischen Link. In verschiedenen Phasen werden verschiedene Teile des Systems zusammengesetzt, aber schließlich wird alles (der Kernel, alle Subsysteme, Bibliotheken und Anwendungen) zu einem einzigen Image verknüpft. Es enthält alle Informationen zu allen Zeichen im Bild. Und obwohl wir auf den ersten Blick viele Anwendungen mit Standardeintrittspunkten für int main (..) haben, sind dies im resultierenden Bild verschiedene Zeichen, die über die Befehlszeile auf dem System verfügbar sind.

Viertens. Wir mussten eine Laufzeit für C ++ implementieren, da viele gängige Anwendungen und Bibliotheken Vorteile nutzen.

Fünftens. Wir haben die Möglichkeit hinzugefügt, das Build-System zu verwenden
  ./configure; make; make install 

Nachdem Sie die Quelle von irgendwoher heruntergeladen und die erforderlichen Patches angewendet haben.

Fazit


Heute sind die funktionalen Anforderungen an Systeme, die zuvor an Mikrocontrollern gestellt wurden, erheblich gestiegen. Es wird erwartet, dass Steuerungssysteme mit universellen Systemen kompatibel sind. Die Eigenschaften von Mikrocontrollern sind ebenfalls erheblich gewachsen, sodass Sie Software mit den entsprechenden Funktionen darauf ausführen können. In der Vergangenheit wurde Software für Mikrocontroller zu Optimierungszwecken für eine bestimmte Aufgabe geschrieben. Mit zunehmenden funktionalen Anforderungen müssen jedoch Ansätze aus der Welt der universellen Systeme angewendet werden, die die Zuverlässigkeit von Software erheblich erhöhen können, nämlich die Wiederverwendung von Modulen und die verteilte Entwicklung. Universelle Software berücksichtigt zwar nicht die Merkmale eingebetteter Systeme, verfügt jedoch über eine wesentlich größere und gut funktionierende Funktionalität. Daher bietet die Verwendung von Desktop-Software auf Mikrocontrollern einen Gewinn. Einerseits können Sie eine billigere, zuverlässigere und kostengünstigere Hardwareplattform verwenden, andererseits werden die Kosten für die Entwicklung solcher Systeme erheblich reduziert.

Source: https://habr.com/ru/post/de466379/


All Articles