Steht der Stromverbrauch des Mikrocontrollers in direktem Zusammenhang mit seiner Betriebszeit?

Ich muss mich für einen Weg entscheiden, die Effizienz eines Algorithmus zu messen, der auf einem Mikrocontroller/Mikroprozessor läuft.

Mein Gedanke ist, dass ich die Laufzeit des Algorithmus verwenden kann, um eine bestimmte Aufgabe als indirektes Maß dafür zu verwenden, wie der Stromverbrauch dieses Algorithmus im Vergleich zum Stromverbrauch eines anderen Algorithmus abschneidet. Dies wäre jedoch nur sinnvoll, wenn die Betriebszeit des Mikrocontrollers in direktem Zusammenhang mit seiner Leistungsaufnahme steht. Ist diese Annahme wahr?

Der Mikrocontroller läuft unter exakt denselben Bedingungen mit jedem Algorithmus, derselben Peripherie usw.

Ich würde denken: offensichtlich nicht. Angenommen, der Algorithmus benötigt 2 ms in Taktzyklen, und ein Peripheriegerät löst alle 5 ms einen Interrupt aus. Dann wird der Algorithmus in einem Moment nicht unterbrochen und endet in 2 ms, in einem anderen Moment wird der Algorithmus durch das Peripheriegerät unterbrochen und endet in 3 ms.
Ich stimme Ihnen voll und ganz zu @Huisma Aber stellen Sie sich vor, wir kümmern uns nur um die Ausführungszeit des Algorithmus in einer kontrollierten Testumgebung, ohne dass externe Interrupts oder unkontrollierte Variablen auf den Mikrocontroller einwirken. Wäre die Annahme, dass die Betriebszeit proportional zum Stromverbrauch / Wirkungsgrad ist, dann eine praktikable Option?

Antworten (2)

Es gibt viele Dinge, die den Stromverbrauch des Geräts ändern, aber vorausgesetzt, Sie berechnen nur einen Algorithmus, bei dem alle nicht verwendeten Peripheriegeräte abgeschaltet werden, z deaktiviert (läuft eine Uhr und löst einen Interrupt aus),

Dann ja, je länger die Berechnung dauert, desto mehr Strom hat es verbraucht, es gibt einen Kompromiss zwischen Taktgeschwindigkeit und Gesamtstromverbrauch (denn die meisten Geräte, die in kürzester Zeit mit der höchsten Taktgeschwindigkeit laufen, verbrauchen weniger Energie als eine langsamere Uhr längere Zeit) aber wieder unter der Annahme, dass alles gleich bleibt, längere Zeit = mehr Leistung

Wenn Sie anfangen möchten, andere Peripheriegeräte einzubeziehen, finden Sie am Ende des Datenblatts für Ihr Gerät Diagramm für Diagramm für Diagramm, das den Stromverbrauch für Ihren speziellen Anwendungsfall und verschiedene andere Beziehungen umreißt, z. B. wenn Sie den Pin-Pullup haben eingeschaltet, wie lange das Schalten dieses Pins auf Low den Verbrauch erhöht. Wenn Sie etwas anderes im Signal ansteuern, wird es sowohl im High- als auch im Low-Zustand etwas verbrauchen. Wenn Sie ADCs verwenden, haben die Eingangspuffer abhängig davon eine nicht lineare Stromaufnahme auf die Eingangsspannung. (normalerweise würden Sie sie deaktivieren)

Würde die Art der Anweisungen eine Rolle spielen? Z.B. Wenn die Multiplikation mehr Leistung verbraucht als die Addition, kann es vorteilhaft sein, drei Additionen anstelle einer Multiplikation mit 3 durchzuführen, wobei die erste die Betriebszeit erhöht
Normalerweise ist der Stromverbrauch der ALU pro Takt konsistent, da multiplizieren und addieren Sie normalerweise Einzelzyklus-Hardwarefunktionen, da gibt es wahrscheinlich nicht viel zu sparen, skalieren Sie Ihre Divisionen so, dass sie mit einer Konstante multipliziert und dann durch Potenzen von 2 dividiert werden können Sparen Sie viele Taktzyklen, wenn die Aufteilung nicht in der Hardware implementiert ist. Ebenso sparen Sie wahrscheinlich Taktzyklen, wenn Sie die richtigen Datengrößen und -typen verwenden. Ein 16-Bit-Mikro benötigt beispielsweise 2 Zyklen, um einen 32-Bit-Wert hinein- oder herauszuschieben.
Andere Dinge können sein, sich die zugrunde liegende Assembly anzusehen, die mathematischen Bibliotheken und der Compiler bieten Ihnen möglicherweise nicht die beste Implementierung für eine spezielle Aufgabe.
Andere Dinge, wenn Sie daran interessiert sind, haben die meisten Mikrocontroller einige freie Hardwareregister, auf die sie mit kürzeren Anweisungen zugreifen und Operationen ausführen können, als wenn sie in den RAM gestellt würden (8-Bit-Adresse gegenüber einer 16-Bit-Adresse, sobald die ersten 256 Bytes in der Speicherzuordnung überschritten sind). , da alle 2 Bytes, die aus dem Programmcode in einem 16-Bit-Mikro gelesen werden, auch ein Taktzyklus sind. Kombinieren Sie dies mit Kenntnissen der umgekehrten polnischen Notation (Mathe einrichten, damit Werte die ALU nie verlassen müssen) und Sie können einige zusätzliche Zyklen einsparen
Die Optimierungen, von denen Sie hier sprechen, sollten jedoch vom Compiler durchgeführt werden, vorausgesetzt, dass eine höhere Programmiersprache wie C verwendet wird.
Nicht immer, und wenn Sie die Dinge so schnell wie möglich wollen, schadet es nicht, sich anzusehen, was der Compiler sich ausgedacht hat, manchmal geht er von Annahmen aus, die sich von Ihren unterscheiden. zB 16 Bit * 16 Bit muss = 32-Bit-Ergebnis, wenn es die Grenzen nicht kennt, aber wenn Sie wissen, dass es sie nie überschreiten wird, dann kann es schneller sein, nur das 16-Bit-Ergebnis zu erfassen.
@Reroute Multiply ist häufig keine Einzelzyklusfunktion, je nachdem, wie fortgeschritten der betreffende Prozessor ist.

Steht der Stromverbrauch des Mikrocontrollers in direktem Zusammenhang mit seiner Betriebszeit?

So'ne Art. Was am meisten Strom verbraucht, ist der CPU-Takt und alle aktiven Hardware-Peripheriegeräte wie GPIO. Hardware-Peripheriegeräte sind eine eigene Geschichte, da jedes einzelne einzigartige Stromverbrauchseigenschaften aufweist.

Es besteht natürlich ein direkter Zusammenhang zwischen den benötigten CPU-Taktzyklen und der Länge des ausgeführten Maschinencodes, also gibt es auch einen Zusammenhang zwischen CPU-Taktzyklen und Stromverbrauch.

Dies ist vorausgesetzt, dass Sie Schlafmodi verwenden, wenn Sie keinen Code ausführen, oder es sonst sinnlos ist, vom Stromverbrauch des Algorithmus zu sprechen.

Dabei spielen die Effizienz des Algorithmus, die „Code-Effizienz“ der CPU und der Stromverbrauch der Hardware pro Tick eine Rolle. Code-Effizienz bedeutet in diesem Fall, wie viele CPU-Ticks benötigt werden, um ein bestimmtes Stück Programmcode einer höheren Schicht (C-Code usw.) auszuführen.

Zum Beispiel argumentieren einige Leute, dass 8-Bit-MCUs immer noch verwendet werden sollten, weil sie weniger Strom verbrauchen als 32-Bit-MCUs. Dies trifft tendenziell zu, wenn Sie den Spitzenstromverbrauch betrachten, aber nicht unbedingt, wenn Sie den Stromverbrauch im Zeitverlauf betrachten.

Nehmen Sie so etwas wie den C-Code my_uint32 = u32a + u32b;. Die durchschnittliche 32-Bit-CPU führt diese Zeile in ein paar Assembler-Befehlen aus, was vielleicht etwa 10-20 CPU-Ticks bedeutet. Eine 8-Bit-MCU benötigt jedoch Hunderte von Assembler-Anweisungen in Form von Softwarebibliotheken, um denselben Code auszuführen. Vielleicht 500-1000 CPU-Ticks, ganz grob gezählt. Der 8-Bitter könnte also bis zu 100-mal mehr Ausführungsgeschwindigkeit / Stromverbrauch benötigen, um denselben Code auszuführen. Und dann ist es plötzlich egal, dass die MCU pro Tick weniger Strom zieht als die 32 Bitter.