Wie in früheren Antworten angegeben, ist delay ()
zumindest in der AVR-Version des Arduino-Kerns eine ausgelastete Wartezeit, die die CPU am Laufen hält. In dieser Antwort gibt Duncan C korrekt an, dass „CMOS-Logikschaltungen beim Umschalten von Zuständen mehr Strom verbrauchen als im Leerlauf“. Es wird dann erwartet, dass Befehle, die eine große Anzahl von Gates oder Flip-Flops schalten, mehr Leistung verbrauchen als Befehle, die nur einige umschalten.
Aus Neugier habe ich einen Aufruf von delay () um zu sehen, welche Art von Anweisungen ausgeführt werden. Ich fand heraus, dass der „heiße Pfad“ eine Schleife ist, die 44 Anweisungen pro Iteration ausführt:
- 23 von ihnen führen Arithmetik oder Logik aus (addieren, subtrahieren, vergleichen, XOR)
- 13 Daten verschieben (Register laden, Register kopieren, E / A, RAM lesen)
- 7 Programmablauf ändern (Funktionsaufruf, Rückgabe, Sprung, bedingte Verzweigungen, bedingtes Überspringen)
- 1 ändert sich ein wenig in einem Statusregister
Ich weiß nicht, wie dies mit „typischem“ Code verglichen wird, aber der große Anteil von Anweisungen, die arithmetische und logische Berechnungen durchführen, schlägt vor, dass delay ()
sollte viel energiehungriger sein als beispielsweise entlang der Abfolge von nop
Anweisungen. Am Ende besteht die einzige Möglichkeit, sicher zu wissen, ob delay ()
etwas am Stromverbrauch eines bestimmten Programms ändert, darin, es zu messen.
Als Randnotiz eine einfache Um Strom auf AVR-Karten zu sparen, müssen Sie #include <avr / sleep.h>
und am Ende der loop () einen Aufruf von sleep_mode ()
einfügen Code>. Der Schlaf dauert jedoch nicht lange, da der Arduinocore den Timer 0 so einstellt, dass die CPU alle 1024 µs unterbrochen wird.