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.