Frage:
Spart eine Verzögerung in einer Schleife Energie?
Ryan Detzel
2018-02-14 21:49:26 UTC
view on stackexchange narkive permalink

Ich habe festgestellt, dass die meisten Beispiel-Snippets immer eine Verzögerung in der Schleife haben, auch wenn sie für die ordnungsgemäße Ausführung des Programms nicht benötigt werden.

Ich kann nur davon ausgehen, dass dies hinzugefügt wird, weil Benutzer ohne Verständnis kopieren und einfügen Was ist los, aber ich habe darüber nachgedacht, ob das Hinzufügen einer Verzögerung auch Strom sparen kann.

Wenn ich eine Schleife habe, die einige Eingaben auf Änderungen überprüft, kann es sein, dass eine Verzögerung hinzugefügt wird (10) spart einige Zyklen und damit Strom?

Nein. Auch eine Verzögerung "verwendet" Zyklen.
Obligatorische Referenz von Nick Gammon: https://www.gammon.com.au/forum/?id=11497. Alles über Energie.
@MarkLakata. Was ist mit `ield ()`?
@MarkLakata Multithreaded? In Arduino? In 99,99% der Fälle gibt es keinen echten Scheduler, und in den anderen 0,01% der Fälle "befreit" die Verzögerungsfunktion den aufrufenden Thread nicht (die Verzögerungsimplementierung ist wie eine for-Schleife, die nichts tut).
Sieben antworten:
Kwasmich
2018-02-14 21:52:18 UTC
view on stackexchange narkive permalink

Nein, es verbrennt Energie, indem es nichts tut.

Sie sollten Ihre MCU auf jeden Fall in den Ruhezustand versetzen und bei Ereignissen aufwachen oder den Watchdog-Timer verwenden, um nach einer vordefinierten Zeitspanne aufzuwachen.

gre_gor
2018-02-14 22:04:27 UTC
view on stackexchange narkive permalink

Die Funktion delay macht nichts Besonderes. Im Grunde zählt es nur Millisekunden innerhalb einer while-Schleife herunter und misst es mit micros () .

  void delay (unsigned long ms) {uint32_t start = micros (); while (ms > 0) {Ausbeute (); while (ms > 0 && (micros () - start) > = 1000) {ms--; Start + = 1000; }}}  
Das Aufrufen von "Yield ()" ist etwas Besonderes, aber es ist immer noch ein arbeitsreiches Warten, das die meiste Zeit damit verbringt, Anweisungen auszuführen.
@PeterCordes Das Aufrufen von "yield ()" ist nichts Besonderes. Das ist nur eine (schwach definierte) Funktion, die nichts bewirkt. Es ist dazu da, anderen Bibliotheken oder Code zu erlauben, es zu überschreiben und eine Art kooperativen Threads zu implementieren, aber der Standardcode tut dies nicht, also tut er nichts. Es ist nicht so, als würde man "Yield ()" in so etwas wie VB aufrufen, wo der Programmfluss zurück zum Betriebssystem freigegeben wird ...
@Majenko: Danke, ich nahm an, dass "Yield" ein Multitasking-Betriebssystem impliziert, nicht nur einen Stub für den Fall, dass es Multitasking gibt. (Und ja, ich dachte, es wäre buchstäblich [POSIX `sched_yield (2)`] (http://man7.org/linux/man-pages/man2/sched_yield.2.html), und dies implizierte, dass Arduino a Vollbetriebssystem wie Linux. Es ist schwer zu verfolgen, welche Entwickler-Boards (RPi / Arduino / was auch immer) was ausführen, wenn ich keines von ihnen selbst benutze.>. <)
arducode
2018-02-15 04:28:07 UTC
view on stackexchange narkive permalink

Nein, eine kurze Verzögerung (bis zu 100 Millis) wird normalerweise in eine Hohlraumschleife () eingefügt, wenn Sie an einen externen Sensor angeschlossen sind, um die Messwerte zu stabilisieren. Es hat aber nichts mit dem Stromverbrauch zu tun. Als Beispiel sind hier die Zeilen 49-52 aus der Beispielskizze "AnalogInSerialOut":

  // Warten Sie 2 Millisekunden vor der nächsten Schleife //, bis sich der Analog-Digital-Wandler eingestellt hat / / nach der letzten Lesung: Verzögerung (2);  
EngrAbbas
2018-02-16 11:12:11 UTC
view on stackexchange narkive permalink

Könnte es möglich sein, dass das Hinzufügen einer Verzögerung (10) einige Zyklen und damit Strom spart?

Nein, die Funktion delay () funktioniert nur pausiert den Code für die angegebene Zeit. Es läuft immer noch und verbraucht Energie, um die Zeit zu zählen und darauf zu warten, dass sie fertig ist.

Wenn Sie Strom sparen müssen, können Sie Ihre Schaltungskomponenten so einstellen, dass Energie gespart wird oder wenn Sie sparen möchten Mit Energie auf Ihrem Arduino können Sie ein Steckbrett-Setup verwenden (Anweisungen hier und hier) oder den internen Watchdog-Timer verwenden, um in bestimmten Zeitintervallen zu schlafen und aufzuwachen. Weitere Anleitungen zum Watchdog-Timer finden Sie hier.

Prost!

MABC
2020-07-16 16:24:27 UTC
view on stackexchange narkive permalink

Die obigen Antworten sind falsch, zumindest für NodeMCU 0.9 (ESP-12-Karte) ESP8266 und ich habe auch mit Firebeetle ESP8266-Karte getestet. Da ich einen USB-Tester habe, kann ich überprüfen, ob die Karten bei leerer Schleifenmethode etwa 70 mA-80 mA verbrauchen, während der Verzögerung (ms) jedoch etwa 20 mA-30 mA

Dies ist die Verzögerungsfunktion für die kommentierten Boards:

  void __delay (vorzeichenlose lange ms) {if (ms) {os_timer_setfn (&delay_timer, (os_timer_func_t *) &delay_end 0); os_timer_arm (&delay_timer, ms, ONCE); } else {esp_schedule (); } esp_yield (); if (ms) {os_timer_disarm (&delay_timer); }}  

Ich habe nicht weiter untersucht, warum die Verzögerungsfunktion so viel Strom verbraucht.

Duncan C
2020-07-17 05:16:07 UTC
view on stackexchange narkive permalink

Ich vermute, die Antwort hängt von der Art des verwendeten Arduino ab.

Der ESP8266 basiert auf ARM, und ich glaube, dass ARM-Chips Energieverwaltungsschaltungen enthalten, bei denen Subsysteme automatisch in den Energiesparmodus versetzt werden wenn sie nicht verwendet werden. Ein ARM-basierter Arduino wird beim Ausführen einer Verzögerung wahrscheinlich viel weniger Strom verbrauchen als bei anderen Dingen.

Ich glaube nicht, dass AVR-Chips irgendeine Art von Energieverwaltung haben, also haben sie ihr gesamtes Silizium. " jederzeit beleuchtet ". Allerdings verbrauchen CMOS-Logikschaltungen beim Umschalten von Zuständen mehr Leistung als im Leerlauf, sodass selbst ein AVR-basierter Arduino in einer delay () -Funktion wahrscheinlich etwas weniger Strom verbraucht als bei der Ausführung von Anweisungen, die die Recheneinheit verwenden. UARTs und andere Subsysteme des Chips.

Sie erzielen viel bessere Energieeinsparungen, wenn Sie Ihren Arduino in den Ruhemodus versetzen.

Bei AVR verwendet `delay ()` die ALU.
Ja, ich denke, es würde die ALU verwenden, um zu sehen, ob genug Zeit vergangen ist. Ich meinte das eher als Beispiel für die verschiedenen Subsysteme des Chips als als eine genaue Liste, aber Punkt genommen.
Edgar Bonet
2020-07-17 15:30:27 UTC
view on stackexchange narkive permalink

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.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Lesen Sie weiter auf narkive:
Suchergebnisse für 'Spart eine Verzögerung in einer Schleife Energie?' (Fragen und Antworten)
9
Antworten
wie Bremsen?
gestartet 2007-09-01 15:06:55 UTC
autos, transport & verkehr
Loading...