Mehr Leistung für SBCs
Einplatinencomputer oder Single-Board Computer (SBCs), einst gestartet als One-Hit-Wonder zur intelligenteren Gestaltung von Aufgaben in der Mess-, Steuer- und Regelungstechnik (MSR), taugen heute auch als Mini-Server oder als Basis von Appliances. Mit dem Orange Pi 4 Pro und dem Orange Pi 6 Plus lanciert Shenzhen Xunlong zwei neue Varianten, die sowohl hohe Rechenleistung als auch exzellente Integrierbarkeit offerieren.
Shenzhen Xunlong hat sich im Lauf der letzten zehn Jahre als Paradekonkurrent der Raspberry-Pi-Modelle etabliert: Die in den Anfangsjahren unter Nutzung von Allwinner-SoCs gefertigten Einplatinencomputer sind im Allgemeinen auch heute noch zu vernünftigen Preisen erhältlich.
Mit dem Orange Pi 4 Pro möchte man Nutzern des Raspberry Pi 5 eine schnellere (und robustere) Alternative anbieten, während der Orange Pi 6 Plus für Einsatzszenarien mit extrem hohen Performance-Ansprüchen vorgesehen ist.
Dank der Verfügbarkeit von Debian Linux sind beide Systeme für .NET-Payloads ansprechbar. Daraus ergeben sich für nach Hardware suchende .NET-Entwickler faszinierende Möglichkeiten, die dieser Artikel im Rahmen einer Kurzvorstellung der Hardware anspricht. Außerdem demonstrieren wir, wie die Interaktion mit nativer Hardware aus .NET heraus gelingt.
Das big.LITTLE-Konzept
Die im x86-Bereich erst seit kurzer Zeit verwendete Technologie der asymmetrischen Kerne ist in Arm-SoCs seit Jahren implementiert. Aufgrund von Sanktionsrisiken beliefert Rockchip Anbieter von Einplatinenrechnern nicht mehr beziehungsweise nur mit geringer Priorität – eine Situation, die sowohl Allwinner als auch CIX zur Erlangung neuer Marktanteile nutzen.
Im Fall des Orange Pi 4 Pro bekommen wir es mit einem Allwinner-A733-SoC zu tun, das zwei Hochleistungs- und sechs Energiesparkerne mitbringt. Das im Orange Pi 6 Plus verbaute SoC aus dem Hause CIX kombiniert sogar drei unterschiedliche Kerntypen. Für .NET-Entwickler ist diese Information indes eher akademischer Natur, da sich der Kernel selbst um die optimale Zuweisung kümmert.
Die Leistungen des Orange Pi 4 Pro präsentieren sich mit Sysbench folgendermaßen:
orangepi@orangepi4pro:~$ sysbench cpu run --threads=1 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) ... CPU speed: events per second: 2251.32 orangepi@orangepi4pro:~$ sysbench cpu run --threads=2 ... CPU speed: events per second: 4512.20 orangepi@orangepi4pro:~$ sysbench cpu run --threads=8 ... CPU speed: events per second: 9818.74
Aus der Art und Weise, wie das Wachstum der erreichten Ergebnisse abgestuft ist, lässt sich die Struktur des SoC ableiten. Beim Orange Pi 6 Plus bietet sich eine ähnliche Vorgehensweise an, nun sind allerdings drei Stufen erforderlich:
orangepi@orangepi6plus:~$ sysbench cpu run --threads=1 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) ... events per second: 3019.91 orangepi@orangepi6plus:~$ sysbench cpu run --threads=4 ... CPU speed: events per second: 11859.07 orangepi@orangepi6plus:~$ sysbench cpu run --threads=8 ... CPU speed: events per second: 22290.61 orangepi@orangepi6plus:~$ sysbench cpu run --threads=12 ... CPU speed: events per second: 26579.99
Zum Vergleich hier die Ergebnisse des (betagten) MSI-GF65-Laptops des Autors:
tamhan@tamhan-gf65:~$ sysbench cpu run --threads=1 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) ... CPU speed: events per second: 1468.14 tamhan@tamhan-gf65:~$ sysbench cpu run --threads=8 ... CPU speed: events per second: 8103.83
Klar ist, dass alle Systeme mehr als ausreichend Leistungsreserven für verschiedenste Aufgaben mitbringen: Für den Orange Pi 6 Plus gibt es sogar ein inoffizielles Windows-11-Image, das man allerdings nur mit einer chinesischen Mobiltelefonnummer erhalten kann.
In Zeiten des AI-Booms gilt: Arbeitsspeicher ist teuer. Insbesondere beim Einsatz als Appliance lohnt es sich, nur die nötige Speichermenge zu kommissionieren – für den Orange Pi 4 Pro gibt es die Ausbaustufen von 4 bis 16 GB (6/8/12), während der Orange Pi 6 Plus in 16- und 32-GB-Varianten zu haben ist. In der Theorie gibt es hier auch eine 64-GB-Variante, die derzeit aber nicht in der allgemeinen Distribution zur Verfügung steht.
Flexible Optionen für Massenspeicher und Co.
Wie der nachfolgende Abschnitt zeigt, können Einplatinencomputer für Entwickler auf verschiedenste Arten nützlich sein. Dabei gibt es allerdings einige grundlegende Probleme, die die Freude am System als Ganzes trüben können, von Shenzhen Xunlong jedoch geschickt umgangen werden.
Die Inbetriebnahme eines Prozessrechners setzt ein Betriebssystem voraus. Nutzer von Raspberry Pi und Co liefern dieses per MicroSD-Karte an: insbesondere im Zusammenspiel mit Reibschluss-Kartenslots eine nur leidlich zuverlässige Vorgehensweise. Beim Orange Pi 4 Pro umgeht Shenzhen Xunlong diesels Problem durch Anbieten eines M2-Slots und eines eMMC-Steckplatzes (Bild 1).
Am Orange Pi 6 Plus findet sich ein komplexeres Komplement aus zwei M2-Slots, die ebenfalls für die Aufnahme von SSDs vorgesehen sind (Bild 2).
M2-Slot und eMMC-Steckplatz auf dem Orange Pi 4 Pro (Bild 1)
Autor
Die beiden M2-Slots auf dem Orange Pi 6 Plus (Bild 2)
AutorÄrgernis Nummer zwei sind die bei Raspberry-Pi-Prozessrechnern verwendeten PCB-Antennen. Diese mögen für Maker den Aufwand beim Desktop-Einsatz reduzieren, verursachen beim Gehäusedesign allerdings Mehrarbeit. Shenzhen Xunlong umgeht dieses Problem durch Verwendung eines uFL-Steckers, der beim Orange Pi 4 Pro das Anstecken beliebiger externer Antennen erlaubt. Designer können diese Antenne dann an einem physikalisch günstigen Platz im Gehäuse platzieren.
Beim Orange Pi 6 Plus kommt die Platine ohne eigenes Funkmodul aus. Auf der Unterseite findet sich ein PCIe-M.2-Steckverbinder im E-KEY-Format – er nimmt mehr oder weniger beliebige Funkmodule auf und ermöglicht so komplette Flexibilität im Bereich der Funktechnik.
Hervorzuheben ist beim Orange Pi 6 Plus indes das Vorhandensein von zwei auf einem Realtek RTL8126 basierenden 5G-Ethernet-Schnittstellen. Das System lässt sich somit als Behelfsrouter einsetzen, der die Endgeräte über einen Downstream-Switch anspricht. Alternativ ist die Nutzung als intelligenter Access Point denkbar.
GPIO-Bank und Dupont-USB für MSR-Aufgaben
Seit dem Raspberry Pi 1B+ gehören die 40 Pins umfassenden Dupont-Stecker zum guten Ton im Prozessrechnerwesen. Beide Varianten des Orange Pi bringen einen diesbezüglichen Steckverbinder mit – wer die Tochterplatine direkt, also ohne Extender, mit dem Board verbindet und samt Spacern verschraubt, hat im Allgemeinen keine Vibrationsprobleme zu befürchten. Spacer lassen sich bei Bedarf mit einem 3D-Drucker herstellen und sind für die Stabilität von immenser Bedeutung.Auf der Platine des Orange Pi 6 Plus findet sich – wie in Bild 3 gezeigt – eine kleine Besonderheit: Der neun Pins umfassende Stecker bietet USB-2.0-Signale an, was zum Beispiel beim Anbinden eines hauseigenen Funkmoduls hilft. In der Praxis gilt nämlich, dass eine USB-Steckverbindung den Vibrationen des Alltags nur leidlich widerstehen kann.
USB-Signale ohne USB-Stecker auf dem Orange Pi 6 Plus (Bild 3)
AutorNutzung für Kiosk- beziehungsweise Appliance-Szenarien und zur Simulation von Clustern
Die Verfügbarkeit einer GPIO-Bank und die Möglichkeit zum Anschließen einer Kamera lassen die Verwendung als „Zentralrechner“ eines Embedded-Systems prädestiniert erscheinen. Echtzeitfähigkeit lässt sich hier durch eine externe Acht-Bit-MCU hinzufügen, was zur in Bild 4 gezeigten Systemarchitektur führt. Bei Systemen mit langer Totzeit resultiert diese Vorgehensweise außerdem in einer massiven Reduktion des Energieverbrauchs.
Systemarchitektur bei Echtzeitfähigkeit (Bild 4)
Microchip.comAngemerkt sei, dass diese Methode nicht nur für MSR-Aufgaben taugt. Wer seine Software mit Hardware „verdongelt“, eliminiert Piraterie und erschwert das Klonen. Die von Christian Kaar in den 2010ern geführte Runtastic war ein exzellentes Beispiel dafür: Die Verfügbarkeit von zwei 5-GBit-Ethernetports ermöglicht die Realisierung von Netzwerkfiltern, Werbeblockern oder allgemeinen Software-in-a-Box-Konzepten mit hoher Bandbreite. Ein denkbares Konzept wäre ein VPN-Router, der alle mit ihm verbundenen Geräte über einen firmeneigenen VPN-Knoten nach außen führt.
Dank des Full-Size-HDMI-Anschlusses taugen die Systeme als Basis für Kioske aller Arten. In Ungarn gilt die Kombination aus Bondrucker mit Fiskalmodul, Prozessrechner und Display als Klassiker: Millionenfach an Caféhäuser, Restaurants und Co. vermietet sorgen sie bei ihren Entwicklern jeden Monat für Einkommen.
Erzeuger von „irgendwie vernetzter“ Software sind gut beraten, ihre CI-Tests nicht nur in einem durch VMware oder VirtualBox simulierten Cluster durchzuführen. Reale Hardware geht mit einem eigenen Latenzprofil einher – bei geschickter Konstruktion (Stichwort Aluminiumprofile, Schrauben, Gewindestangen, Spacer) lassen sich kompakte Clusterchen realisieren, die in Mannschaftsstärke ausgerollt werden können.
Zu guter Letzt bieten sich die Systeme – insbesondere der Orange Pi 4 Pro ist hier ideal – als „Nodes“ für ein geografisch verteiltes Botnetz an. Residential IPs sind per definitionem in Residenzen anzutreffen. Im Zusammenspiel mit einem robusten Gehäuse lässt sich so mit geringen Kosten ein Netzwerk verteilter Maschinen erzeugen, die für aller Herren Aufgaben gut geeignet sind. Dank der Platzierung in Büros oder Privathaushalten ist es für „VPN-Erkennungsdienste“ bei korrekter Konfiguration so gut wie unmöglich, die Nodes von organischen Systemen zu unterscheiden.
Interaktion mit GPIO-Ports in .NET
An dieser Stelle kehren wir zum Orange Pi 4 Pro zurück, weil er eine betriebsbereite GPIO-Implementierung mitbringt. Zur Inbetriebnahme wird der Autor in den folgenden Schritten auf die Imagedatei Orangepi4pro_1.0.4_debian_bookworm_desktop_xfce_linux5.15.147.img setzen, die – wie gewohnt und von anderen Prozessrechnern wie dem Raspberry Pi bekannt – auf eine MicroSD-Karte zu brennen ist.
Der erste Bring-up und das Einrichten der SSD-Verbindung nehmen mitunter etwas Zeit in Anspruch. Der Autor bietet ein YouTube-Video an, das die Hardware vorstellt und die im Rahmen des ersten Bring-ups möglichen Probleme en détail durchspielt.
Der Befehl /sys/devices$ tree -L 2 zeigt das Fehlen von sysfs (Bild 5); diese einfache Methode zur Interaktion mit GPIO-Pins wird vom Kernel seit einigen Versionen nicht mehr unterstützt.
sysfs wird zur Interaktion mit GPIO-Pins nicht mehr unterstützt (Bild 5)
AutorOffizielle Zugriffsmethode ist die WiringOP-Bibliothek, die die Interaktion mit der realen Hardware über „magische Speicherstellen“ des SoC erledigt. Problematisch ist hier lediglich, dass es für die WiringOP-Bibliothek derzeit keinen nativen Wrapper gibt.
Erste Aktion ist sodann das Installieren des .NET Frameworks am Prozessrechner unter Verwendung des von Microsoft bereitgestellten Deployment-Skripts:
orangepi@orangepi4pro:/sys/devices$ curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel STS
Es ist nicht zum Adaptieren der Systemkonfiguration befähigt, weshalb wir im nächsten Schritt folgende Befehle ausführen – dotnet --version informiert dann über den passenden Versionsstand:
orangepi@orangepi4pro:/sys/devices$ echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc orangepi@orangepi4pro:/sys/devices$ echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc orangepi@orangepi4pro:/sys/devices$ source ~/.bashrc orangepi@orangepi4pro:/sys/devices$ dotnet --version 9.0.308
Zu beachten ist, dass dieser Befehl nur die Umgebung des gerade eingeloggten Benutzers adaptiert und den root-Benutzer außen vor lässt. Dies wird später noch zu Problemen führen.
Vorher wollen wir noch überprüfen, ob das zum Hochbringen des Prozessrechners verwendete Image die Hardware-Zugriffsbibliothek bereits in einem nutzungsfertigen Format vorhält. Dazu bietet es sich an, nach folgendem Schema eine leere C-Datei über den touch-Befehl zu erzeugen und danach an GCC zur Kompilation und zum Linken zu übergeben:
orangepi@orangepi4pro:~$ touch test.c orangepi@orangepi4pro:~$ gcc test.c -lwiringPi /usr/bin/ld: /usr/lib/gcc/aarch64-linux-gnu/12/../../../aarch64-linux-gnu/Scrt1.o: in function `_start': (.text+0x1c): undefined reference to `main' /usr/bin/ld: (.text+0x20): undefined reference to `main' collect2: error: ld returned 1 exit status
GCC überprüft im ersten Schritt die per -l übergebenen Parameter. Das hier aufscheinende Monieren eines fehlenden Einsprungpunkts weist also darauf hin, dass die Bibliothek für den Linker erreichbar war.
.NET-Payloads im Remotebetrieb bequem ausführbar machen
Nach dem Konfigurieren des SSH-Zugangs liegt es nahe, diesen auch für die Auslieferung der .NET-Kompilate zu verwenden. Der Autor wird in den folgenden Schritten mit einer Insider Preview von Visual Studio 2026 arbeiten; die auf GitHub bereitstehende Erweiterung funktioniert allerdings auch mit der älteren Version problemlos. Nach dem Deployment – es erfolgt, wie man es von Visual Studio gewohnt ist – ist ein Neustart erforderlich; danach findet sich im Menü die Option Erweiterungen | Linux Debugger | Build and Deploy. Außerdem findet sich dort ein Einstellungs-Fenster, in dem Benutzername und Passwort sowie die IP-Adresse des Prozessrechners einzupflegen sind. Danach bietet sich das Ausführen an – ein weiteres YouTube-Video demonstriert den Prozess im Detail.
Rund 30 Sekunden später – die erstmalige Einrichtung nimmt etwas mehr Zeit in Anspruch – findet sich dann ein neuer Ordner namens VSLinuxDbg, in dem diverse zu unserem Projekt gehörende Dateien unterkommen:
orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ ls TamsGPIOToy.deps.json TamsGPIOToy.exe TamsGPIOToy.runtimeconfig.json TamsGPIOToy.dll TamsGPIOToy.pdb vsldBuildContents.tar.gz
Zu beachten ist, dass die DLL-Datei den eigentlich ausführbaren .NET-Code bereitstellt. Das Anzeigen der Begrüßungsmeldung gelingt mit folgendem Befehl:
orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ dotnet TamsGPIOToy.dll Hello, World!
Errichtung einer Interop-Struktur
Nächste Aktion ist der Bring-up einer Interop-Verbindung zwischen der .NET-Applikation und der eigentlichen C-Bibliothek. Obwohl es in .NET als korrekt gilt, hierfür eigene Methodenklassen anzulegen, wollen wir die drei benötigten Instruktionen einfach nach folgendem Schema im Header unseres Einsprungpunkts unterbringen:
using System.Runtime.InteropServices;
namespace TamsGPIOToy
{
internal class Program
{
[DllImport("libwiringPi.so", EntryPoint = "wiringPiSetup")] //This is an example of how to call a method / function in a c library from c#
public static extern int WiringPiSetup();
[DllImport("libwiringPi.so", EntryPoint = "pinMode")] //Uses Gpio pin numbers
public static extern void pinMode(int pin, int mode);
[DllImport("libwiringPi.so", EntryPoint = "digitalWrite")] //Uses Gpio pin numbers
public static extern void digitalWrite(int pin, int value);
Von besonderer Wichtigkeit ist das Statement DllImport, das im ersten Schritt über den Namen der zu verwendenden Library (hier libwiringPi.so) und danach über die Namen der in der Library angelegten Methode informiert – hier sind es drei Methoden.
Für einen kleinen Rauchtest befehlen wir nach folgendem Schema eine Initialisierung des GPIO-Subsystems:
static void Main(string[] args) {
Console.WriteLine("Hello, World!");
WiringPiSetup();
}
}
}
Nach dem abermaligen Anklicken der Menüoption für die Auslieferung bietet es sich an, über SSH eine Ausführung zu befehligen. Wenn diese ohne Superuser-Rechte erfolgt, sehen wir eine nach folgendem Schema aufgebaute Fehlermeldung:
orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ dotnet TamsGPIOToy.dll Hello, World! wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: No such file or directory. Aborting your program because if it can not access the GPIO hardware then it most certianly won't work Try running with sudo?
Von besonderer Bedeutung ist hier der Verweis auf die Devices /dev/mem beziehungsweise /dev/gpiomem. Dabei handelt es sich um „Trapdoors“, über die der Linux-Kernel Applikationen den direkten Zugriff auf Teile des Arbeitsspeichers des Gesamtsystems ermöglicht.
Die weiter oben bereits erwähnte eingeschränkte Anpassung der Environment-Attribute führt dann dazu, dass das Voranstellen von sudo am Fehlen der .NET-Ausführungsumgebung scheitert:
orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ sudo dotnet TamsGPIOToy.dll [sudo] password for orangepi: sudo: dotnet: command not found
Funktionsfähig wird das Programm erst dann, wenn wir im ersten Schritt unter Nutzung des which-Befehls den Pfad zur .NET-Runtime herausfinden. Danach beschwören wir eine vollständige Rootshell, in der wir das Programm zur Ausführung bringen. Das Aufscheinen der Begrüßungsmeldung ohne Fehlermeldungen informiert dann darüber, dass die Initialisierung der Hardware erfolgreich verlief:
orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ which dotnet /home/orangepi/.dotnet/dotnet orangepi@orangepi4pro:~/VSLinuxDbg/TamsGPIOToy$ sudo -s root@orangepi4pro:/home/orangepi/VSLinuxDbg/TamsGPIOToy# /home/orangepi/.dotnet/dotnet TamsGPIOToy.dll Hello, World!
Mit diesem Wissen ausgestattet können wir das GPIO-Testprogramm nach folgendem Schema in die .NET-Umgebung portieren:
static void Main(string[] args) {
Console.WriteLine("Hello, World!");
WiringPiSetup();
pinMode(0, 1); // Output is 1
for (; ; )
{
digitalWrite(0, 1);
digitalWrite(0, 0);
}
}
Das Ergebnis ist dann die abermalige Ausführung, die die in Bild 6 gezeigte Ausgabedarstellung liefert.
Die Ausführung eines ähnlichen Programms aus C heraus führt zum in Bild 7 gezeigten Verhalten. Anhand des Unterschieds der Arbeitsgeschwindigkeit sind Rückschlüsse auf die jeweilige Effizienz möglich.
Der .NET-Code erreicht eine Arbeitsfrequenz von rund 1,03 Megahertz (Bild 6)
Autor
Der C-Code arbeitet mit 1,28 Megahertz (Bild 7)
AutorFazit
Die neuen Prozessrechner aus dem Hause Shenzhen Xunlong bieten Entwicklern dank der hohen Rechenleistung die Möglichkeit, verschiedenste (containerisierte) Workloads unbürokratisch nahe am Kunden auszuführen oder als Appliance zu verpacken. Explizit angemerkt sei, dass dies auch abseits klassischer MSR-Aufgaben gewinnbringend sein kann.