Herman Roebbers, Trainer
Herman Roebbers ist ein fortgeschrittener Experte bei Capgemini Engineering und arbeitet seit Mitte der 1980er Jahre an eingebetteten Systemen und Parallelverarbeitung. Er ist außerdem externer Berater der EEMBC-Arbeitsgruppen Ulpmark, Iotmark und Securemark und Ultra-Low-Power-Trainer im Workshop„Ultra-Low Power for the Internet of Things“.
Auf dem Weg zum batterielosen IoT ist es wichtig, Energie so effizient wie möglich zu nutzen. Am Beispiel einer Verschlüsselungsbibliothek zeigt Herman Roebbers, wie allein kleine Änderungen an den Tooling- und Chip-Einstellungen den Verbrauch erheblich beeinflussen können.
Wie kann ich den Energieverbrauch meines IoT-Systems in Richtung Ultra-Low-Power reduzieren? Diese Frage wird immer relevanter, da wir unsere Erwartungen an IoT-Geräte immer weiter erhöhen. Letztendlich ist das Ziel, dass die Systeme so wenig Energie benötigen, dass sie diese aus ihrer Umgebung gewinnen können und keine Batterien mehr benötigen.
Um dies zu erreichen, müssen wir in zwei Richtungen arbeiten: die Ernteerträge erhöhen und den Verbrauch senken. Ersteres wird bereits in Angriff genommen: Neue Materialien und Methoden zur Herstellung und Nachbearbeitung von Solarzellen führen zu immer höheren Erträgen. Auch auf dem Gebiet der HF-Energieernte werden Fortschritte erzielt. Das Delfter Startup Nowi hat zum Beispiel spezielle Chips entwickelt, die dies sehr gut können. Außerdem wird viel an neuen Materialien geforscht, um Temperaturunterschiede effizienter in Energie umzuwandeln. Wir arbeiten auch intensiv an immer effizienteren Konvertern, die die geerntete Energie in die benötigte(n) Spannung(en) umwandeln und für eine effiziente Energiespeicherung sorgen, zum Beispiel in wiederaufladbaren Batterien oder Superkondensatoren.
Eine Fallstudie für Ultra-Low-Power
Ein früherer Bits&Chips-Artikel gab einen Überblick über alle Aspekte, die für das Energiesparen wichtig sind: vom Chipsubstrat, der Transistorauswahl, der Prozessorarchitektur und der Leiterplatte über Treiber, Betriebssystem, Codierwerkzeuge und Codierstile bis hin zur Anwendung. In der Zwischenzeit wurde die Tabelle etwas erweitert.
Ein aktueller Fall veranschaulicht die Auswirkungen verschiedener Mechanismen auf den Energieverbrauch. EEMBC hat gerade einen Benchmark veröffentlicht, um den Energiebedarf für verschiedene typische tls-Operationen (Transport Layer Security) zu ermitteln. Tls ist Teil einer https-Implementierung und als solcher für den Aufbau einer sicheren Verbindung unerlässlich. Der Benchmark wurde auf ein Evaluation Board portiert, das Kryptographie über die Arm Mbedtls Bibliothek unterstützt.
Wir können diesen Prozess nutzen, um zu zeigen, was jeder Optimierungsschritt bringt. Zu diesem Zweck führen wir zunächst jedes Mal eine Basismessung durch. Das Benchmarking Framework verwendet einen Energiemonitor von Stmicroelectronics und einen Arduino Uno. Der Arduino wird als UART-Schnittstelle zum zu testenden Gerät (dut, Abbildung 1) verwendet.
Abbildung 1: Der Aufbau zur Messung des Stromverbrauchs
Wir verwenden auch die Entwicklungsumgebung Atollic Truestudio 9.0.1 für STM32, die eine proprietäre Version des GCC-Compilers verwendet, sowie die Software Stm32cubemx, die (Initialisierungs-)Code für Peripheriegeräte generieren kann und damit die Konfiguration erheblich vereinfacht.
Schritt 1: Sehen Sie sich die Compiler-Einstellungen an
Wenn wir eine Basismessung mit einer nicht optimierten Version (Einstellung -O0) bei 80 MHz (höchste Geschwindigkeit) und 3,0 Volt durchführen, ergibt dies einen Securemark-Score von 505. Wenn wir die Optimierer-Einstellung auf -O1 ändern, macht das einen gewaltigen Unterschied: wir kommen auf 1336! Die Optimierer-Einstellungen für -Og und -O2 bewirken keinen großen Unterschied, aber wenn wir auf -O3 oder -Ofast gehen, wird es noch besser: 1490.
Dies zeigt, was Sie allein mit den Compiler-Einstellungen erreichen können. Die idealen Einstellungen können jedoch von Funktion zu Funktion unterschiedlich sein. In unserem Fall gibt es zum Beispiel keinen Unterschied zwischen -O3 und -Ofast, aber das ist nicht immer der Fall. Es kann sich also lohnen, die Einstellungen pro Funktion oder pro Datei separat zu wählen.
Bei den Compiler-Einstellungen -O2, -O3 und -Ofast können Programmierfehler auftreten, die bei anderen Einstellungen nicht vorkommen. Das Timing kann sich ändern und es ist notwendig, Variablen, die in mehreren Kontexten verwendet werden (z.B. normaler und Interrupt-Kontext) als flüchtig zu qualifizieren, um Probleme zu vermeiden.
Schritt 2: Sehen Sie sich die pll an
Mikrocontroller haben heutzutage sehr umfangreiche Einstellungen für alle Arten von Taktsignalen auf dem Chip. Eine dieser Einstellungen betrifft den Frequenzmultiplikator (pll). Dieser kann verwendet werden, um eine niedrige Frequenz zu multiplizieren und zu dividieren, um alle möglichen anderen Taktfrequenzen zu erzeugen.
In unserem Fall beträgt die Frequenz des internen Oszillators 16 MHz. Um daraus 80 MHz zu machen, können wir sie leider nicht einfach mit fünf multiplizieren. Wir haben die Wahl zwischen zwei Einstellungen: Die erste ist, mit 1 zu dividieren, mit 10 zu multiplizieren und dann mit 2 zu dividieren. Die zweite Option ist, mit 2 zu dividieren, mit 20 zu multiplizieren und dann wieder mit 2 zu dividieren.
Daraus ergeben sich unterschiedliche Punktzahlen: 1462 gegenüber 1490. Das Ergebnis ist in beiden Fällen 80 MHz, aber die zweite Methode ist zwei Prozent sparsamer. Je niedriger die Taktfrequenzen, desto weniger Energie verlieren Sie, und je früher Sie die Taktfrequenz teilen, desto besser.
Wenn Sie genügend Zeit zur Verfügung haben, können Sie den Prozessor auch ohne pll verwenden, denn das ist eigentlich ein ziemlicher Energiefresser. Mit dem eingebauten Oszillator können wir eine maximale Frequenz von 48 MHz erzeugen, was zu einem 4 Prozent höheren Ergebnis führt. Der Nachteil ist, dass es ein bisschen länger dauert: 80/48 = 1,66 mal länger, um genau zu sein.
Das Nucleo L4A6ZG Entwicklungsboard von STMicroelectronics bietet eine Vielzahl von Tools zur Optimierung des Energieverbrauchs.
Schritt 3: Schalten Sie unnötige Uhren aus
Jetzt, wo wir ein paar Dinge erforscht haben, können wir eine Einstellung wählen und von dort aus weiter optimieren. Wir beginnen recht konservativ: -O1 und eine Frequenz von 80 MHz über unsere zweite pll-Einstellung. Das bringt unseren Securemark-Score auf 1336.
Der nächste Schritt besteht darin, alle überflüssigen Takte abzuschalten. In unserem Fall können der Takt für den UART und alle E/A-Ports abgeschaltet werden. Das spart zwischen 2,5 und 2,9 mW und ergibt einen Wert von 1448. Das bedeutet 1448/1336 = 1,08 Mal weniger Energie (8 Prozent Gewinn).
Schritt 4: Optimieren Sie die Funktion memcpy
Bei der Ausführung von kryptographischen Funktionen wird die Funktion memcpy regelmäßig verwendet. Wenn Sie sich für eine optimierte Version entscheiden, können Sie im Falle von GCC einen Gewinn von fünf Prozent erzielen. Der IAR-Compiler bietet bereits eine optimierte Version. Damit können wir unsere Punktzahl auf 1524 erhöhen. Gewinn: 5 Prozent.
Schritt 5: Ziehen Sie die Rändelschrauben fest
Jetzt können wir sehen, ob wir das auch mit einer niedrigen Taktfrequenz erreichen können. Damit könnten wir die Kernspannung senken. Bei unserer mcu sollte diese Kernspannung 1,2 V für Frequenzen über 26 MHz betragen. Der Einfachheit halber nehmen wir 24 MHz, eine Standardfrequenz im Menü des msi-Oszillators, bei der die pll ausgeschaltet bleiben kann – ein weiterer Gewinn von 4 Prozent: 1588.
Wir können auch testen, ob wir die Compiler-Optimierungen ruhig etwas aggressiver einstellen können. Wenn wir auf die Einstellung -O2 gehen, erreichen wir eine Punktzahl von 1691 – ein weiterer Zuwachs von 6,4 Prozent.
Schritt 6: Reduzieren Sie die Spannungen
Wir haben die Taktfrequenz bereits so vorbereitet, dass eine niedrigere Kernspannung möglich ist. Jetzt werden wir sie tatsächlich einstellen. Das Ergebnis ist wunderbar: 2021, fast 20 Prozent Gewinn!
Die Stromversorgungsspannung kann auch etwas niedriger sein. Wir haben mit 3,0 V begonnen, aber wenn wir auf 2,4 V gehen, ergibt das wiederum eine Verbesserung von 26 Prozent. Wir können sogar noch weiter auf 1,8 V gehen, falls nötig. Das haben wir hier nicht getan, aber wenn wir extrapolieren, können wir mit einer weiteren Einsparung von einem Drittel rechnen.
Fazit
Mit ein paar einfachen Maßnahmen kann der Energieverbrauch bereits drastisch in Richtung Ultra-Low-Power gesenkt werden. In unserer Fallstudie ist ein Faktor von fünf bis sieben im Vergleich zu einer nicht optimierten Version leicht zu erreichen.
'An embedded system without batteries is within reach.'
Allerdings habe ich mich hier auf die Werkzeug- und Spaneinstellungen beschränkt. Mit zusätzlichen Maßnahmen in anderen Bereichen lassen sich zusätzliche Verbesserungen im zweistelligen Prozentbereich erzielen. Ein eingebettetes System ohne Batterien ist also in Reichweite.
Dieser Artikel wird veröffentlicht von Bits&Chips.
Recommendation by former participants
By the end of the training participants are asked to fill out an evaluation form. To the question: 'Would you recommend this training to others?' they responded with a 7.6 out of 10.


