Herman Roebbers is advanced expert bij Altran en werkt sinds het midden van de jaren tachtig aan embedded systemen en parallel rekenen. Tevens is hij extern adviseur van de EEMBC-werkgroepen Ulpbench, Iotconnect en Securemark, en hij geeft de workshop ‘Ultra low power for Internet of Things’. 

19 October 2018

In het streven naar batterijloze iot-devices is het zaak zo efficiënt mogelijk om te gaan met energie. Herman Roebbers laat aan de hand van een encryptiebibliotheek zien hoe het tweaken van alleen de tooling en chipinstellingen al enorme impact kan hebben op het verbruik.

Hoe kan ik de energieconsumptie van mijn iot-systeem verminderen? Deze vraag wordt steeds actueler naarmate we steeds meer vragen van iot-devices. Het ultieme streven is dat systemen zo weinig energie nodig hebben dat ze die uit hun omgeving kunnen oogsten en geen batterijen meer nodig hebben.

Daarvoor moeten we twee kanten op werken: de opbrengsten van de oogst verhogen en het verbruik verminderen. Aan het eerste wordt druk gewerkt: nieuwe materialen en manieren om zonnecellen te maken en na te bewerken, geven steeds hogere rendementen. Ook op het gebied van rf-energieoogsten worden slagen gemaakt. De Delftse startup Nowi heeft bijvoorbeeld speciale chips gemaakt die daar heel goed in zijn. Verder wordt druk onderzoek gedaan naar nieuwe materialen om temperatuurverschillen efficiënter om te zetten in energie. Daarnaast wordt ook hard gewerkt aan steeds efficiëntere converters die geoogste energie omzetten naar benodigde spanning(en) en zorg dragen voor efficiënte energieopslag in bijvoorbeeld oplaadbare batterijen of supercondensatoren.

Ultra low power for Internet of Things

Are you looking for a broad and systematic overview of the overwhelming possibilities for ultra low power design? Sign up for  Herman Roebbers' workshop.

Een casestudy

Een eerder Bits&Chips-artikel gaf een overzicht van alle aspecten die belangrijk zijn om energie te besparen: van chipsubstraat, transistorkeuze, processorarchitectuur en printplaat tot aan stuurprogramma, os, codeertools- en -manieren tot aan de applicatie. Inmiddels is de tabel wat uitgebreid (zie Tabel 1).

Overzicht van powermanagementmechanismenNiveauMechanismeCategorie (Domein)
Power management werkt op al deze niveausApplicatieGebeurtenis gedreven architectuurCategorie A (software)
Gebruik Low Power modes
Selecteer radio protocol
CoderenEnergiebewust coderen
Batterijbewust coderen
Prestatiebewust coderen
Gebruik hardwareversnellers
GereedschappenToolchain
Optimizer-instellingen
Linker-configuratie
BesturingssysteemPower-api
Operation performance points-api
Tickless werken
StuurprogrammaGebruik dma
Gebruik hw-eventmechanismen
Suspend/resume-api
PrintDynamische voltage- en frequentieschalingCategorie B (software en hardware)
Power gating via i/o-pin
Aansturen spanningsregelaar via i/o-pin
Klokfrequentiebeheer
Besturen component-shutdownpinnen via i/o-pin
Isoleren sensoren van spanning en bus
ChipPower Gating (schakelen van voeding)
Lage voeddingsspanning
Aanbieden low-energy modes
(Automatisch) klokschakelen
Clock frequency scaling
Dynamic power switchingCategorie C (hardware)
Adaptive voltage scaling
Static leakage management
Ip-blok / chipPower gating state retention
Ip-blok / rtlAutomatic power/clock gating
TransistorBody bias
Finfet
Trigate fet
Sub-treshold operation
SubstraatSoi, fd-soi

Het effect van verschillende mechanismen op energie kunnen we laten zien aan de hand van een recente case. EEMBC heeft net een benchmark vrijgegeven om de energie te bepalen die nodig is voor een aantal typische tls-operaties. Tls (transport layer security) is onderdeel van een https-implementatie en als zodanig essentieel voor het opzetten van een beveiligde verbinding. De benchmark is geporteerd naar een evaluatiebord dat cryptografie ondersteunt via de de Arm Mbedtls-bibliotheek.

Bits&Chips event Save the date

Dat proces kunnen we mooi gebruiken om te laten zien wat elke optimalisatiestap oplevert. Daarvoor doen we telkens eerst een nulmeting. Het benchmark-raamwerk gebruikt hiervoor een energiemonitor van Stmicroelectronics en een Arduino Uno. De Arduino wordt ingezet als uart-interface richting het device under test (dut, Figuur 1).

Roebbers opstelling
Figuur 1: De opstelling voor het meten van het stroomgebruik

We gebruiken verder de ontwikkelomgeving Atollic Truestudio 9.0.1 voor STM32, die een eigen versie van de GCC-compiler gebruikt. We gebruiken ook de Stm32cubemx-software die (initialisatie)code voor randapparaten kan genereren en daarmee de configuratie aanzienlijk vereenvoudigt.

Stap 1: Kijk naar de compilerinstellingen

Als we een nulmeting doen met een niet-geoptimaliseerde versie (setting –O0) op 80 MHz (hoogste snelheid) en 3,0 volt, levert dat een Securemark op van 505. Veranderen we de optimizer-setting in –O1, dan scheelt dat al meteen enorm: we gaan naar 1336! De optimizer-settings voor –Og en –O2 maken niet veel verschil, maar als we naar –O3 gaan of –Ofast, dan gaat het nog weer een stuk beter: 1490.

Optimizer setting-O0-O1-Og-O2-O3-Ofast
Securemark-score50513361340133714901490

Dit demonstreert wat je alleen al met de compilerinstellingen kunt bereiken. Welke instellingen het beste zijn, kan echter per functie verschillen. In ons geval is er bijvoorbeeld geen verschil tussen –O3 en –Ofast, maar dat is lang niet altijd zo. Het kan dus lonen om per functie of per bestand apart de instellingen te kiezen.

Stap 2: Kijk naar de pll

Microcontrollers hebben tegenwoordig heel uitgebreide instellingen voor allerlei kloksignalen op de chip. Een van die instelmogelijkheden betreft de frequentievermenigvuldiger (pll). Die kan met vermenigvuldigen en delen uit een lage frequentie allerlei andere kloksnelheden maken.

In ons geval is de frequentie van de interne oscillator 16 MHz. Om daar 80 MHz van te maken, kunnen we niet simpelweg vermenigvuldigen met vijf, helaas. We hebben de keuze uit twee instellingen: de eerste is delen door 1, vermenigvuldigen met 10 en delen door 2, de tweede is optie is delen door 2, vermenigvuldigen met 20 en weer delen door 2.

Dat levert verschillende scores op: 1462 tegen 1490. Het resultaat is in beide gevallen 80 MHz, maar methode twee is twee procent zuiniger. Hoe lager de klokfrequenties, hoe minder energie je kwijt bent, en hoe eerder je de klokfrequentie deelt, hoe beter.

Als je voldoende tijd tot je beschikking hebt, kun je de processor ook zonder pll gebruiken, want dat is eigenlijk een behoorlijke energievreter. Met de ingebouwde oscillator kunnen we een maximale frequentie van 48 MHz opwekken, wat een 4 procent hogere score oplevert. Het nadeel is dat het dan wel wat langer duurt: 80/48 = 1,66 keer langer om precies te zijn.

Nucleo L4A6ZG
Het Nucleo L4A6ZG-ontwikkelbordje van STMicroelectronics biedt heel wat handvatten om het energiegebruik te optimaliseren.

Stap 3: Zet overbodige klokken uit

Nu we het een en ander hebben afgetast, kunnen we een instelling kiezen en van daaruit verder optimaliseren. We beginnen redelijk conservatief: -O1 en een frequentie van 80 MHz via onze tweede pll-instelling. Onze Securemark-score komt hiermee uit op 1336.

Een eerstvolgende stap is om alle overbodige klokken uit te zetten. In ons geval kunnen de klok naar de uart en alle i/o-poorten wel uit. Dat scheelt tussen de 2,5 en 2,9 mW en levert een score op van 1448. Dit kost 1448/1336 = 1,08 keer minder energie (8 procent winst).

Stap 4: Optimaliseer de memcpy-functie

Tijdens de uitvoering van cryptografische functies wordt regelmatig gebruikgemaakt van de memcpy-functie. Kiezen voor een geoptimaliseerde versie levert in het geval van GCC vijf procent winst op. De IAR-compiler levert al een geoptimaliseerde versie mee. We kunnen onze score daarmee verhogen naar 1524. Winst: 5 procent.

Stap 5: Draai de duimschroeven aan

We kunnen nu kijken of we ook met een lage klokfrequentie toekunnen. Daarmee zouden we de kernspanning kunnen verlagen. Voor onze mcu moet deze kernspanning 1,2 V zijn voor frequenties boven 26 MHz. Voor de eenvoud nemen we 24 MHz, een standaardfrequentie in het menu van de msi-oscillator waarbij de pll uit kan blijven. Weer 4 procent winst: 1588.

We kunnen ook proberen of we de compileroptimalisaties nog veilig wat agressiever kunnen instellen. Als we naar instelling –O2 gaan, komen we uit op een score van 1691. Nog eens 6,4 procent winst.

Stap 6: Verlaag de spanningen

We hebben de klokfrequentie al voorbereid op een lagere kernspanning, nu gaan we die daadwerkelijk instellen. Het resultaat is prachtig: 2021, bijna 20 procent winst!

Ook de voedingsspanning kan eigenlijk wel wat lager. We zijn begonnen met 3,0 V, maar als we naar 2,4 V gaan, levert dat opnieuw een verbetering van 26 procent op. We kunnen nog verder gaan naar 1,8 V als dat nodig is. Dat hebben we hier niet gedaan, maar als we extrapoleren kunnen we een verdere besparing van een derde verwachten.

Conclusie

Met enkele simpele maatregelen is het energiegebruik al drastisch te verlagen. In onze casestudy is een factor vijf tot zeven makkelijk haalbaar ten opzichte van een niet-geoptimaliseerde versie.

Ik heb me hier echter beperkt tot tooling en chipinstellingen. Met aanvullende maatregelen op andere vlakken zijn nog tientallen procenten extra verbetering te halen. Een embedded systeem zonder batterijen komt daarmee daadwerkelijk binnen bereik.