Frage:
Endlosschleife zwischen Mikrocontroller und moderner CPU
James
2020-01-05 17:37:19 UTC
view on stackexchange narkive permalink

Auf einem Mikrocontroller (genauer gesagt auf einer Arduino Uno-Karte mit dem ATmega 328P-Mikrocontroller) würde ich normalerweise eine Endlosschleife verwenden, um nach Eingaben usw. zu suchen (im Arduino-Land ist dies normalerweise die -Schleife () Funktion).Wenn ich diese Funktion jedoch leer lasse, verursacht dies keine Probleme.

Auf einem Desktop / Laptop mit einer Intel i7-CPU usw. würde eine ähnliche Endlosschleife (mit nichts oder sehr wenig zu tun) die CPU auf ~ 100% fixieren und im Allgemeinen die Lüfter usw. hochfahren (Eine Verzögerung könnte hinzugefügt werden, um dies beispielsweise zu verhindern.

Warum ist dies auf einem Mikrocontroller scheinbar in Ordnung, auf einem Mikroprozessor jedoch normalerweise nicht erwünscht?Habe ich Recht, wenn ich denke, dass der ATmega tatsächlich zu 100% läuft und dass er, weil er so schwach ist, keine offensichtlichen Hitzeprobleme verursacht?

Was wäre, wenn ich Ihnen sagen würde, dass die "Leerlauf" -Aufgabe auf einem Prozessor nur eine Schleife ist, die die gesamte nicht verwendete Prozessorzeit verbraucht, die nicht anderweitig geplant war?
@RonBeyer Sie meinen Dinge wie die Linux-Leerlaufaufgabe, die den Befehl `HLT` (halt) ausführt, anstatt tatsächlich eine Schleife zu erstellen?
Fünf antworten:
bobflux
2020-01-05 18:46:34 UTC
view on stackexchange narkive permalink

Warum ist dies auf einem Mikrocontroller scheinbar in Ordnung, auf einem Mikroprozessor jedoch normalerweise nicht erwünscht?

Aus dem gleichen Grund ist es auch auf einem Mikrocontroller unerwünscht: Es verschwendet Strom.

Habe ich Recht, wenn ich denke, dass der ATmega tatsächlich zu 100% läuft

Richtig.

und dass es, weil es so schwach ist, keine offensichtlichen Hitzeprobleme verursacht?

Richtig. Wenn Sie Ihren Mikrocontroller jedoch mit batteries betreiben, müssen Sie wirklich gründlich darüber nachdenken, keine Energie zu verschwenden. Auf einer winzigen CPU wie AtMega328P verursacht es keine Hitzeprobleme, verkürzt aber definitiv die Akkulaufzeit.

Alle CPUs, ob Desktop-Kraftpakete oder winzige Mikrocontroller, verwenden dieselben Methoden:

1- Reduzieren Sie die Taktrate oder Spannung.

2- Fahren Sie nicht benötigte Hardware herunter.

3- Gehen Sie in den Ruhezustand und wachen Sie bei einem Ereignis auf (dies ist ein Sonderfall beim Herunterfahren nicht benötigter Hardware, in diesem Fall wird die CPU heruntergefahren).

Im AtMega328P können Sie dies auch implementieren. Sie können eine langsamere Uhr verwenden, wenn Sie nicht die unglaubliche Leistung des 8-Bit-Kerns benötigen, nicht benötigte Peripheriegeräte herunterfahren können ... und das Wichtigste ist der Ruhemodus.

Einzelheiten sollten Sie im Handbuch lesen, da es verschiedene Schlafmodi gibt, die sich in den Wecklatenzen unterscheiden, welche Peripheriegeräte online bleiben und die CPU aufwecken können, ob RAM-Daten erhalten bleiben oder verloren gehen usw. Aber im Grunde die Idee ist: Im Schlafmodus wird die CPU gestoppt, sodass sie viel weniger Strom verbraucht. Wenn ein Interrupt auftritt, wird die CPU aufgeweckt und der Interrupt verarbeitet.

Natürlich müssen Sie den richtigen Ruhemodus verwenden und richtig konfigurieren, damit das Peripheriegerät, das die CPU aufwecken muss (z. B. ein Timer oder ein GPIO-Interrupt), nicht heruntergefahren wird. Wenn alles heruntergefahren ist, müssen Sie NMI oder sogar Reset verwenden, um es zu aktivieren, im letzteren Fall durch Neustart.

Wenn Ihre Anwendung nur auf Interrupts wartet, wie z. B.:

  • Pin Change Interrupt (PCI) zur Erkennung eines Tastendrucks oder eines eingehenden Signals

  • Timer

  • Von UART oder USB empfangene Daten

  • usw.

Dann müssen Sie die Hauptschleife nicht drehen.Nachdem Sie beim Booten alles konfiguriert haben, starten Sie die Hauptschleife mit der Anweisung "Go to Sleep".Der nächste Befehl wird ausgeführt, nachdem die CPU aufgewacht ist, verarbeitet alle ausstehenden Interrupts und kehrt zur Hauptschleife zurück.Dann kann die Hauptschleife bei Bedarf etwas gegen die empfangenen Ereignisse unternehmen, wenn sie nicht vollständig vom Interrupt-Code behandelt wurden ... und dann wieder in den Ruhezustand wechseln.

Selbst wenn Sie keine Batterien verwenden, kann ein Netz mit niedrigem Standby-Strom das Schaltnetzteil mit Strom versorgen, um Zyklen zu überspringen und auch viel weniger Strom zu verschwenden.

Marcus Müller
2020-01-05 18:13:08 UTC
view on stackexchange narkive permalink

Auf einem Mikrocontroller (genauer gesagt auf einer Arduino Uno-Karte mit dem ATmega 328P-Mikrocontroller) würde ich normalerweise eine Endlosschleife verwenden, um nach Eingaben usw. zu suchen (im Arduino-Land ist dies normalerweise die Funktion loop ()). Wenn ich diese Funktion jedoch leer lasse, verursacht dies keine Probleme.

Klassisches Programmiermuster mit einer Hauptschleife…

Auf einem Desktop / Laptop mit einer Intel i7-CPU usw. würde eine ähnliche Endlosschleife (mit nichts oder sehr wenig zu tun) die CPU auf ~ 100% fixieren und im Allgemeinen die Lüfter usw. hochfahren ( Eine Verzögerung könnte hinzugefügt werden, um dies beispielsweise zu verhindern.

… wir schreiben möglicherweise verschiedene Hauptschleifen.

Dieselbe Hauptschleife wäre auch auf einem Mikrocontroller eine schlechte Praxis, da dadurch auch die CPU der Volllast ausgeführt wird - was Strom verbraucht. Tun Sie das nicht, besonders wenn Sie im Akkubetrieb sind.

Moderne CPU-Kerne verfügen über Synchronisationsmechanismen. Auf diese Weise können Benutzer etwas implementieren wie "Lassen Sie die Ausführung dieser Schleife ruhen, bis 1 ms vergangen ist oder bis sich diese Bedingung geändert hat".

Das ist im Grunde das Herzstück eines jeden Multi-Task-Betriebssystems - und im Grunde sind es mittlerweile alle Betriebssysteme, die diesen Namen verdienen. Auf Mikrocontrollern finden Sie häufig sogenannte RTOSes (Echtzeitbetriebssysteme), die garantieren, wie sicher Sie sein können, dass die Ausführung von etwas nach so vielen Nanosekunden begonnen hat, da dies typisch für den Anwendungsfall ist von Mikrocontrollern, während auf Desktops und Server-CPUs normalerweise vollwertige simultane Multiprozessor-Betriebssysteme zu finden sind, die weniger Garantien für das Timing bieten, aber einen viel größeren Satz an Funktionen sowie eine Abstraktion der Hardware- und Softwareumgebung bieten.

Ich kenne die Arduino-Ausführungsumgebung nicht gut genug, um tatsächlich qualifizierte Aussagen darüber zu machen. Ich recherchiere dies, während ich schreibe: Arduino scheint nicht dafür ausgelegt zu sein - es erwartet wirklich, dass Sie sich nur geschäftig drehen. Da es keine "Yield" -Funktionalität gibt, kann das "Housekeeping", das zwischen Aufrufen Ihrer -Schleife durchgeführt wird, nicht aufgerufen werden, wenn Sie die integrierte delay -Funktion verwenden. Pfui! Schlechtes Design.

Was Sie in einem leistungs- und / oder latenzbewussten Design tun würden, würden Sie ein RTOS für Ihren Mikrocontroller verwenden - FreeRTOS ist ziemlich beliebt, für die ARM Cortex-M-Serie hat mbed viel Traktion, ich persönlich wie ChibiOS (aber ich denke nicht, dass dies eine gute Wahl ist, wenn von Arduino-Skizzen gewechselt wird), treibt die Linux Foundation Zephyr voran (worüber ich in Konflikt gerate); Es gibt wirklich eine Fülle von Möglichkeiten, und der Hersteller Ihres Mikrocontrollers unterstützt normalerweise eine oder mehrere über seine IDEs.

Warum ist dies auf einem Mikrocontroller scheinbar in Ordnung, auf einem Mikroprozessor jedoch normalerweise nicht erwünscht?

Es ist nicht wirklich in Ordnung, es ist in der Tat ein ungewöhnliches Entwurfsmuster für Mikrocontroller, die normalerweise in regelmäßigen Abständen Dinge tun oder auf externe Reize reagieren. Es ist nicht üblich, dass Sie "so viel CPU wie möglich" auf einem Mikrocontroller kontinuierlich verwenden möchten.

Es gibt Ausnahmen zu diesem Muster, und sie existieren sowohl in der MCU als auch in der Server- / Desktop-Prozessor-Welt. Wenn Sie wissen, dass Sie praktisch immer z. Netzwerkdaten, die in einer Switch-Appliance verarbeitet werden sollen, oder wenn Sie wissen, dass Ihr Spiel immer schon ein Stück Welt vorberechnen kann, das Sie möglicherweise in wenigen Augenblicken benötigen oder nicht, finden Sie diese Spin-Loops. In einigen Hardwaretreibern finden Sie "Drehsperren", was bedeutet, dass die CPU kontinuierlich einen Wert abfragt, bis er sich geändert hat (z. B. ist die Hardware eingerichtet und kann jetzt verwendet werden), aber es handelt sich im Allgemeinen nur um eine Notfalllösung, und Sie müssen erklären, warum Sie das tun, wenn Sie beispielsweise versuchen, solchen Code in Linux zu integrieren.

Habe ich Recht, wenn ich denke, dass der ATmega tatsächlich zu 100% läuft und dass er aufgrund seiner geringen Leistung keine offensichtlichen Hitzeprobleme verursacht?

Ja. Der ATMega ist nach modernen Maßstäben nicht stromsparend, aber stromsparend genug, damit die Hitze kein Problem darstellt.

Warum die Ablehnung?Es wäre cool, wenn Sie das erweitern könnten;Hier gibt es zwei sehr ähnliche Antworten, und nur eine hat eine Abwertung erhalten, daher frage ich mich natürlich, was ich hätte besser machen können.
Sie müssen hierfür kein RTOS verwenden.Sie schalten das mcu einfach am Ende Ihrer Schleife in den Ruhezustand und lassen es von einem Timer (oder einer externen Quelle) aktivieren.
@RubberDuck ah, aber ich habe nicht gesagt, dass Sie ein Betriebssystem benötigen;Ich habe die "Standard" -Methode beschrieben.
.... Kumpel.Ich habe mich über eine Ablehnung gestritten, bevor ich überhaupt Zeit hatte, einen Kommentar zu hinterlassen, der erklärt, warum.Um über die Erklärung hinauszugehen, die ich bereits gegeben habe, ist dies der anderen Antwort unterlegen, da der Kontext der Frage nicht berücksichtigt wird.
:) Nicht ausflippen :) Ich bin eigentlich sehr froh, dass du das kommentiert hast!Ich hinterlasse diesen Kommentar sehr oft, um die Leute zu ermutigen, Feedback zu hinterlassen.Der Kontext war für mich schwierig, da Arduino nicht meine native Umgebung ist.(Ich hoffe, ich habe das geklärt)
Schauen Sie sich meine Reputationszahl an: Es ist mir egal, wie viele zusätzliche imaginäre Internetpunkte ich bekomme.Was mir wertvoll ist, ist ehrliches Feedback.Wenn ich etwas aus EE.SE herausnehme, lerne ich viel UND die soziale Interaktion :)
_ "Es ist nicht wirklich in Ordnung" _ Unsinn, die meiste Zeit ist es in Ordnung.Es ist nicht so, dass der Chip noch etwas zu tun hat.Die Energie, die Sie mit einem ausgefallenen RTOS sparen, wird den Stromverbrauch bei der Implementierung nie wieder wettmachen, insbesondere wenn Sie einen modernen PC verwenden, um dies zu tun!
@BruceAbbott ähm, das spiegelt überhaupt nicht meine Erfahrung wider.Zum Beispiel eine kleine Steuerplatine, fünf Tasten, drei LEDs, ein PWM-Ausgang, der über diese Tasten einstellbar ist, wobei meistens Folgendes zu beachten ist: läuft seit Monaten mit zwei Alkalien ab;chibiOS Leerlauf-Thread 99,99 ..% der Zeit.Ich muss nicht berechnen, wie lange dies dauern würde, wenn dies die ganze Zeit eine Weile dauern würde (1).
Sicher, aber wie viel Strom hat Ihr PC während der Programmierung verbraucht?Ich wette, mehr als 2 Alkalien.Wahrscheinlich mehr als 100 Alkalien - genug, um diese MCU jahrelang zu betreiben!:) Da das OP speziell nach Arduino Uno gefragt hat, macht es wenig Sinn, über Software mit extrem geringem Stromverbrauch zu sprechen (die minimale Stromaufnahme auf diesem Board beträgt 15 mA), und für die überwiegende Mehrheit der Dinge, für die sie verwendet werden, spielt es keine Rolle.
Wie viel Strom hat der Arduino-Compiler verbraucht?Auf 1% der monatlichen halbzufälligen Abweichung in meinen Stromrechnungen gerundet, null.Während diese AAs seit mehr als einem Monat einige BLE Arduino in einem Baum antreiben.Erhebliche Anstrengungen, um diesen Baum zu besteigen und zu ersetzen.
"Dieselbe Hauptschleife wäre auch auf einem Mikrocontroller eine schlechte Praxis" - hängt wirklich davon ab.Einige Anwendungen verfügen über eine Menge Strom (alles, was mit Netzstrom versorgt wird oder ohnehin große Batterien hat, z. B. um einen Audioverstärker zu betreiben), andere nicht (batteriebetriebene Geräte, die immer eingeschaltet sind).
Bruce Abbott
2020-01-06 01:23:02 UTC
view on stackexchange narkive permalink

Habe ich Recht, wenn ich denke, dass der ATmega tatsächlich zu 100% läuft, und dass, weil es so wenig Strom hat, es keine offensichtliche Hitze verursacht Probleme?

Ja, es läuft normalerweise die ganze Zeit zu 100%, ist aber so schwach, dass es sich nicht wesentlich erwärmt.

Auf einem Desktop / Laptop mit einer Intel i7-CPU usw., wenn ich eine ähnliche ausgeführt habe Endlosschleife (mit nichts oder sehr wenig zu tun) würde es stecken die CPU bei ~ 100% und im Allgemeinen drehen Sie die Lüfter usw.

Je schneller eine CPU getaktet wird, desto mehr Strom verbraucht sie, da jedes Mal, wenn sich ein Logikpegel ändert, die Kapazitäten der Transistoren in den Gates aufgeladen werden müssen. Moderne CPUs sind so konzipiert, dass sie so schnell wie möglich laufen - tatsächlich schneller als möglich. Selbst wenn die Transistoren so klein wie möglich gemacht werden, die niedrigstmögliche Spannung verwendet und ein riesiger Kühlkörper angelegt wird, können sie immer noch nicht schnell genug laufen, um das "Bedürfnis der PC-Benutzer nach Geschwindigkeit" zu befriedigen. Sie verlassen sich daher auf die Tatsache, dass das Betriebssystem und die Anwendungsprogramme die meiste Zeit darauf warten, dass etwas passiert (Benutzereingaben, Peripheriegeräte usw.).

Wenn Sie versuchen würden, alle Kerne in einem i7 kontinuierlich mit maximaler Frequenz zu betreiben, würde dies schmelzen. Um dies zu verhindern, werden nicht verwendete Kerne ausgeschaltet, und wenn keine maximale Geschwindigkeit erforderlich ist (dh die meiste Zeit), laufen die aktiven Kerne mit einer niedrigeren Frequenz. Im Leerlauf führt das Betriebssystem nicht nur eine Besetztschleife aus, die kontinuierlich Anweisungen ausführt, sondern versetzt die CPU in einen verlangsamten oder angehaltenen Zustand, während sie auf Interrupts usw. wartet. Verschiedene Teile der CPU können auch ausgeschaltet werden, wenn sie nicht verwendet werden.

Der ATmega kann auch in einen Energiesparmodus versetzt und einzelne Peripheriegeräte ausgeschaltet werden, wenn sie nicht benötigt werden. Wenn der Systemtakt auf eine niedrigere Frequenz wie 32,678 kHz geändert wird und alle unnötigen Peripheriegeräte ausgeschaltet sind, kann er (langsam) mit nur wenigen μA betrieben werden - nicht um die Temperatur zu senken, sondern um mit einer kleinen Batterie länger zu halten.

Es ist auch möglich, viele Atmega-Chips zu übertakten.Ich habe einen ATmega1284p (für maximal 20 MHz bei 5 V ausgelegt) mit 30 MHz betrieben und es hat gut funktioniert, wurde aber ziemlich warm.

hotpaw2
2020-01-06 02:56:28 UTC
view on stackexchange narkive permalink

Hängt davon ab, ob Ihr ATmega-System mit Wechselstrom oder kleinen Batterien betrieben wird.

>Die Wärmeableitung ist höchstwahrscheinlich zu gering, um einen Kühlkörper oder Lüfter zu erfordern, es sei denn, dies erfolgt in einer superisolierten Umgebung.Könnte mit einem IR-Thermometer messbar sein.

Wenn keine kleinen Batterien mehr vorhanden sind, macht eine Arduino-Schleife einen signifikanten Unterschied darin, wie oft Sie diese Batterien ersetzen oder aufladen müssen.Vielleicht Stunden gegen Monate.Ein ernstes Problem, wenn der Zugriff auf Ihr eingebettetes System schwierig ist.Eine übliche Lösung besteht darin, einen zeitgesteuerten Schlafmodus mit geringerer Leistung innerhalb der Endlosschleife oder einen Schlafmodus plus einen Weckinterrupt von einer externen Quelle zu verwenden.

oliver
2020-01-06 03:13:34 UTC
view on stackexchange narkive permalink

Auf einem modernen Mikroprozessor schreiben Sie höchstwahrscheinlich eine grafische Benutzeroberfläche, die Ihre Arbeit erledigt. Die GUI verfügt über eine eigene Ereignisschleife, in der beispielsweise Mausklicks, Neuzeichnungen usw. verarbeitet werden. Der größte Teil Ihrer Funktionalität befindet sich in einem Ereignishandler, an den die Hauptereignisschleife delegiert.

Wenn Sie also in einem solchen Ereignishandler eine Endlosschleife starten, wird die übliche Ereignisverarbeitung unterbrochen, da Sie nach relativ kurzer Zeit zur Ereignisschleife zurückkehren müssen, damit die Benutzeroberfläche erhalten bleibt reaktionsschnell. Zumindest reagiert Ihre eigene Anwendung nicht mehr, wenn Sie eine Endlosschleife haben (Mausklicks bewirken nichts, Grafiken werden nicht mehr aktualisiert).

Multitasking als solches (und damit die anderen Prozesse) leiden normalerweise nicht darunter, da der OS-Kernel dennoch auf andere Prozesse umschaltet.

Es ist also nicht "böse", eine Endlosschleife auf einem Mikroprozessor zu haben, aber es verstößt gegen User Experience-Standards, zumindest für grafische Anwendungen. Für eine Konsolenanwendung kann es jedoch durchaus vorkommen, dass Sie eine Endlosschleife ohne Schaden haben, z. B. wenn Sie pi mit bis zu 1 Million Stellen berechnen (und schließlich das Ergebnis an die Konsole senden) oder ähnliches, da der Benutzer normalerweise ( Worst-Case) für Konsolenanwendungen vorbereitet, deren Ergebnisse fast ewig dauern.



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 4.0-Lizenz, unter der er vertrieben wird.
Loading...