Na mikrokontrolerze (a dokładniej na płycie Arduino Uno z mikrokontrolerem ATmega 328P) normalnie używałbym nieskończonej pętli do sprawdzania wejść itp. (w Arduino jest to zwykle funkcja loop ()). Jeśli jednak zostawię tę funkcję pustą, nie spowoduje to żadnych problemów.
Klasyczny wzorzec programowania z główną pętlą…
Na komputerze stacjonarnym / laptopie z procesorem Intel i7 itp., gdybym uruchomił podobną nieskończoną pętlę (bez nic do zrobienia lub bardzo mało do zrobienia), spowodowałoby to przypięcie procesora do ~ 100% i ogólnie podkręcenie wentylatorów itp. ( można na przykład dodać opóźnienie, aby temu zapobiec).
… możemy pisać różne główne pętle.
Ta sama główna pętla byłaby złą praktyką również w przypadku mikrokontrolera, ponieważ to również uruchamia procesor tego procesora przy pełnym obciążeniu - co spala energię. Nie rób tego, zwłaszcza jeśli masz baterię.
Nowoczesne rdzenie procesorów mają mechanizmy synchronizacji. To pozwala ludziom na zaimplementowanie czegoś w rodzaju „pozwól, aby wykonanie tej pętli spało, dopóki nie minie 1 ms, lub dopóki ten warunek się nie zmieni”.
Zasadniczo jest to rdzeń każdego wielozadaniowego systemu operacyjnego - i praktycznie wszystkie systemy operacyjne, które zasługują na tę nazwę, są teraz. Na mikrokontrolerach często znajdziesz tak zwane RTOS (systemy operacyjne czasu rzeczywistego), które dają gwarancję, że możesz być pewien, że wykonanie czegoś rozpoczęło się po tylu nanosekundach, ponieważ jest to typowe dla przypadku użycia mikrokontrolerów, podczas gdy na komputerach stacjonarnych i procesorach serwerowych zwykle można znaleźć w pełni funkcjonalne, wieloprocesorowe systemy operacyjne, które zapewniają mniej gwarancji synchronizacji, ale oferują znacznie większy zestaw funkcji i abstrakcji środowiska sprzętowego i programowego.
Nie znam środowiska wykonawczego Arduino na tyle dobrze, aby faktycznie wypowiadać się na jego temat, badam to, gdy piszę: Arduino wydaje się nie być do tego przeznaczone - naprawdę oczekuje, że będziesz po prostu obracać się zajęty. Ponieważ nie ma funkcji „wydajności”, „porządkowanie”, które wykonuje między wywołaniami Twojej pętli
, nie może zostać wywołane, gdy używasz wbudowanej funkcji delay
. Fuj! Zły projekt.
Co byś zrobił w projekcie uwzględniającym moc i / lub opóźnienie, użyłbyś RTOS do swojego mikrokontrolera - FreeRTOS jest dość popularny, w przypadku serii ARM Cortex-M mbed ma dużą przyczepność, ja osobiście jak ChibiOS (ale nie sądzę, żeby był to dobry wybór przy przechodzeniu ze szkiców Arduino), Linux Foundation wypycha Zephyr (co mnie jest sprzeczne); naprawdę, istnieje wiele możliwości wyboru, a producent mikrokontrolera zwykle obsługuje jedno lub wiele za pośrednictwem swoich IDE.
Dlaczego jest to pozornie w porządku w przypadku mikrokontrolera, ale zwykle nie jest pożądane w przypadku mikroprocesora?
To nie jest w porządku, w rzeczywistości jest to niezwykły wzorzec projektowy dla mikrokontrolerów, które zwykle wykonują czynności w regularnych odstępach czasu lub reagują na bodźce zewnętrzne. To nie jest normalne, że chcesz "używać jak największej ilości procesora" na mikrokontrolerze w sposób ciągły.
Istnieją wyjątki od tego wzorca i istnieją one zarówno w mikrokontrolerach, jak iw świecie procesorów serwerowych / stacjonarnych; kiedy wiesz, że praktycznie zawsze masz np. dane sieciowe do przetworzenia w urządzeniu przełączającym lub gdy wiesz, że Twoja gra może już wstępnie obliczyć część świata, której możesz potrzebować lub nie, w ciągu kilku chwil, znajdziesz te pętle obrotowe. W niektórych sterownikach sprzętowych można znaleźć „blokady obrotowe”, co oznacza, że procesor stale pyta o wartość, dopóki się nie zmieni (np. Sprzęt jest gotowy do konfiguracji i można go teraz używać), ale jest to generalnie tylko rozwiązanie awaryjne i będziesz musiał wyjaśnić, dlaczego to robisz, na przykład próbując przenieść taki kod do Linuksa.
Czy mam rację sądząc, że ATmega faktycznie działa na 100%, a ponieważ ma tak małą moc, że nie powoduje żadnych oczywistych problemów z ciepłem?
Tak. ATMega nie ma, według nowoczesnych standardów, małej mocy, ale jest wystarczająco niska, aby ciepło nie stanowiło problemu.