Pytanie:
Nieskończona pętla na mikrokontrolerze vs nowoczesny procesor
James
2020-01-05 17:37:19 UTC
view on stackexchange narkive permalink

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 pętla () funkcja).Jeśli jednak zostawię tę funkcję pustą, nie spowoduje to żadnych problemów.

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), przypiąłby procesor do ~ 100% i ogólnie podkręcił wentylatory itp. (można na przykład dodać opóźnienie, aby temu zapobiec).

Dlaczego jest to pozornie w porządku w przypadku mikrokontrolera, ale zwykle nie jest pożądane w przypadku mikroprocesora?Czy mam rację, myśląc, że ATmega faktycznie działa na 100%, a ponieważ ma tak małą moc, że nie powoduje żadnych oczywistych problemów z ciepłem?

A co, jeśli powiem ci, że „bezczynne” zadanie na procesorze jest tylko pętlą wykorzystującą cały niewykorzystany czas procesora, który nie byłby zaplanowany w inny sposób?
@RonBeyer masz na myśli rzeczy takie jak bezczynne zadanie Linuksa, które wykonuje instrukcję `HLT` (zatrzymanie) zamiast faktycznie zapętlić?
Pięć odpowiedzi:
bobflux
2020-01-05 18:46:34 UTC
view on stackexchange narkive permalink

Dlaczego jest to pozornie w porządku w przypadku mikrokontrolera, ale zwykle nie jest pożądane w przypadku mikroprocesora?

Jest również niepożądany w mikrokontrolerze z tego samego powodu: marnuje energię.

Czy mam rację sądząc, że ATmega faktycznie działa na 100%

Dobrze.

a to dlatego, że ma tak małą moc, że nie powoduje żadnych oczywistych problemów z ciepłem?

Dobrze. Jeśli jednak uruchomisz swój mikrokontroler na batteries, musisz naprawdę mocno pomyśleć o tym, aby nie marnować mocy. W przypadku małego procesora, takiego jak AtMega328P, nie spowoduje to problemów z ciepłem, ale zdecydowanie skróci żywotność baterii.

Wszystkie procesory, niezależnie od tego, czy są to zaawansowane komputery stacjonarne, czy małe mikrokontrolery, używają tych samych metod:

1- Zmniejsz częstotliwość zegara lub napięcie

2- Wyłącz niepotrzebny sprzęt

3 - Idź spać i obudź się podczas zdarzenia (jest to specjalny przypadek wyłączania niepotrzebnego sprzętu, w tym przypadku procesor jest wyłączony).

W AtMega328P możesz to również zaimplementować. Możesz użyć wolniejszego zegara, jeśli nie potrzebujesz całej niesamowitej mocy 8-bitowego rdzenia, możesz wyłączyć niepotrzebne urządzenia peryferyjne ... a najważniejszy jest tryb uśpienia.

Aby dowiedzieć się więcej, przeczytaj instrukcję, ponieważ istnieje kilka trybów uśpienia, które różnią się opóźnieniem budzenia, jakie urządzenia peryferyjne pozostają online i są w stanie wybudzić procesor, czy dane RAM są zachowane czy utracone itp. Ale w zasadzie idea jest: w trybie uśpienia procesor jest zatrzymywany, więc zużywa znacznie mniej energii. Kiedy pojawia się przerwanie, to budzi CPU i przetwarza przerwanie.

Oczywiście musisz użyć odpowiedniego trybu uśpienia i odpowiednio go skonfigurować, aby urządzenie peryferyjne, które musi obudzić procesor (na przykład zegar lub przerwanie GPIO), nie zostało wyłączone. Jeśli wszystko zostanie wyłączone, będziesz musiał użyć NMI lub nawet Reset, aby go obudzić, w tym drugim przypadku przez ponowne uruchomienie.

Jeśli wszystko, co robi twoja aplikacja, to czeka na przerwania, takie jak:

  • Przerwanie zmiany pinu (PCI) w celu wykrycia naciśnięcia przycisku lub sygnału przychodzącego

  • Timer

  • Dane odebrane przez UART lub USB

  • etc

Wtedy nie musisz kręcić głównej pętli.Po skonfigurowaniu wszystkiego podczas rozruchu, zaczynasz główną pętlę instrukcją „idź spać”.Następna instrukcja zostanie wykonana po przebudzeniu procesora, przetworzeniu wszystkich oczekujących przerwań i powrocie do głównej pętli.Następnie główna pętla może, jeśli to konieczne, zrobić coś z odebranymi zdarzeniami, jeśli nie zostały one całkowicie obsłużone przez kod przerwania ... a następnie wrócić do snu.

Nawet jeśli nie używasz baterii, niski prąd w trybie czuwania może zasilać zasilacz impulsowy, aby pomijać cykle i marnować dużo mniej energii.

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

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.

dlaczego głos przeciw?Byłoby fajnie, gdybyś mógł to rozwinąć;są tutaj dwie bardzo podobne odpowiedzi i tylko jedna otrzymała głos przeciw, więc naturalnie zastanawiam się, co mogłem zrobić lepiej.
Nie musisz do tego używać RTOS.Po prostu kładziesz MCU do uśpienia na końcu pętli i budzisz go za pomocą timera (lub źródła zewnętrznego).
@RubberDuck ah, ale nie powiedziałem, że potrzebujesz systemu operacyjnego;Opisałem „standardowy” sposób robienia tego.
.... koleś.Strasznie się przejmuję, zanim zdążyłem zostawić komentarz wyjaśniający dlaczego.Wykraczając poza wyjaśnienie, które już podałem, jest to gorsze od innej odpowiedzi, ponieważ nie bierze pod uwagę kontekstu pytania.
:) Nie wariuje :) Właściwie bardzo się cieszę, że skomentowałeś!Bardzo często zostawiam ten komentarz, aby zachęcić ludzi do wystawiania opinii.Kontekst był dla mnie trudny, ponieważ arduino nie jest moim rodzimym środowiskiem.(Mam nadzieję, że to wyjaśniłem)
Spójrz na moją reputację: nie obchodzi mnie, ile dodatkowych wyimaginowanych punktów internetowych otrzymam;dla mnie cenne są szczere opinie.Jeśli wyciągnę cokolwiek z EE.SE, to to, że dużo się uczę ORAZ interakcji społecznej :)
_ „To nie jest w porządku” _ nonsens, przez większość czasu jest w porządku.To nie tak, że chip ma coś innego do roboty.Energia, którą zaoszczędzisz dzięki fantazyjnemu systemowi RTOS, _ nigdy_ nie nadrobi mocy wydatkowanej na jego implementację, zwłaszcza jeśli używasz do tego nowoczesnego komputera!
@BruceAbbott um, to wcale nie odzwierciedla mojego doświadczenia.Na przykład mała płytka kontrolna, pięć klawiszy, trzy diody LED, wyjście PWM, które można regulować za pomocą wspomnianych przycisków, przez większość czasu zauważając: od miesięcy gaśnie dwie baterie alkaliczne;ChibiOS bezczynny wątek 99,99 ..% czasu.Nie muszę obliczać, jak długo to by działało, gdyby było to „while (1)” przez cały czas.
Jasne, ale ile mocy zużywał Twój komputer podczas programowania?Stawiam na więcej niż 2 ługi.Prawdopodobnie ponad 100 alkaliów - wystarczy, aby MCU działał przez lata!:) Ponieważ OP zapytał konkretnie o Arduino Uno, nie ma sensu mówić o oprogramowaniu o bardzo niskim poborze mocy (minimalny pobór prądu na tej płycie to 15mA) i dla większości rzeczy, które są używane, nie ma to znaczenia.
Ile mocy zużywał kompilator Arduino?W zaokrągleniu do najbliższego 1% miesięcznej pół-losowej zmiany moich rachunków za media, zero.Podczas gdy te AA zasilają niektóre BLE Arduino w drzewie od ponad miesiąca.Znaczny wysiłek, aby wspiąć się na to drzewo i je zastąpić.
„Ta sama główna pętla byłaby złą praktyką również na mikrokontrolerze” - tak naprawdę zależy.Niektóre aplikacje mają mnóstwo dostępnej mocy (wszystko, co jest zasilane z sieci lub ma duże baterie, powiedzmy, aby uruchomić wzmacniacz audio), niektóre nie (urządzenia zasilane bateryjnie, które są zawsze włączone)
Bruce Abbott
2020-01-06 01:23:02 UTC
view on stackexchange narkive permalink

Czy mam rację, myśląc, że ATmega faktycznie działa na 100% i ponieważ ma tak małą moc, że nie powoduje żadnego widocznego ciepła problemy?

Tak, normalnie działa cały czas na 100%, ale ma tak małą moc, że nie nagrzewa się znacząco.

Na komputerze stacjonarnym / laptopie z procesorem Intel i7 itp., jeśli uruchomiłem podobny nieskończona pętla (bez nic do zrobienia lub bardzo mało do zrobienia) to by się przypięło CPU na ~ 100% i generalnie podkręca wentylatory itp.

Im szybciej procesor jest taktowany, tym więcej pobiera mocy, ponieważ za każdym razem, gdy zmienia się poziom logiczny, musi ładować pojemności tranzystorów w bramkach. Nowoczesne procesory są zaprojektowane tak, aby działały tak szybko, jak to możliwe - w rzeczywistości szybciej niż to możliwe. Nawet po zmniejszeniu jak najmniejszych tranzystorów, zastosowaniu najniższego możliwego napięcia i zastosowaniu ogromnego radiatora, nadal nie mogą one działać wystarczająco szybko, aby zaspokoić „potrzebę szybkości” użytkownika PC. Dlatego polegają na fakcie, że system operacyjny i aplikacje spędzają większość czasu czekając, aż coś się wydarzy (dane wejściowe użytkownika, sprzęt peryferyjny itp.).

Gdybyś spróbował uruchomić wszystkie rdzenie w i7 w sposób ciągły z maksymalną częstotliwością, stopiłby się. Aby temu zapobiec, nieużywane rdzenie są wyłączane, a gdy nie jest wymagana maksymalna prędkość (tj. Przez większość czasu), aktywny rdzeń (y) pracują z niższą częstotliwością. W stanie bezczynności system operacyjny nie tylko uruchamia zajętą ​​pętlę w sposób ciągły wykonując instrukcje, ale wprowadza procesor w stan spowolnienia lub zatrzymania w oczekiwaniu na przerwania itp. Różne części procesora również mogą zostać wyłączone, gdy nie są używane. / p>

ATmega można również przełączyć w tryby niższego poboru mocy, a poszczególne urządzenia peryferyjne wyłączać, gdy nie są potrzebne. Jeśli zegar systemowy zostanie zmieniony na niższą częstotliwość, na przykład 32,678 kHz, a wszystkie niepotrzebne urządzenia peryferyjne zostaną wyłączone, może on działać (wolno) przy zaledwie kilku μA - nie w celu obniżenia temperatury, ale aby działać dłużej na małej baterii.

Możliwe jest również „podkręcenie” wielu chipów Atmega.Uruchomiłem ATmega1284p (maks. 20 MHz przy 5 V) przy 30 MHz i działało dobrze, ale zrobiło się dość ciepło.

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

Zależy od tego, czy Twój system ATmega wyczerpuje się z sieci prądu przemiennego czy z małych baterii.

Przy zasilaniu z prądu przemiennego (przez zasilacz ścienny) moc zużywana przez 100% procesor wykorzystujący pętlę spinową jest poniżej poziomu szumów wahań na rachunku za media.Rozpraszanie ciepła najprawdopodobniej jest zbyt małe, aby wymagać radiatora lub wentylatora, chyba że w super izolowanym środowisku.Można to zmierzyć termometrem na podczerwień.

Wyczerpujące się małe baterie, pętla obrotowa Arduino będzie miała znaczący wpływ na częstotliwość wymiany lub ładowania tych baterii.Może godziny w porównaniu z miesiącami.Poważny problem, jeśli dostęp do systemu wbudowanego jest trudny.Jednym z powszechnych rozwiązań jest użycie pewnego rodzaju czasowego trybu uśpienia o niższej mocy wewnątrz nieskończonej pętli lub trybu uśpienia z przerwaniem budzenia z jakiegoś zewnętrznego źródła.

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

Na współczesnym mikroprocesorze najprawdopodobniej napiszesz graficzny interfejs użytkownika, który wykona Twoją pracę. GUI ma własne pętle zdarzeń, w których przetwarzane są takie rzeczy, jak kliknięcia myszą, przerysowanie itp. Większość funkcji będzie znajdować się wewnątrz procedury obsługi zdarzeń, która jest delegowana przez główną pętlę zdarzeń.

Tak więc, jeśli wewnątrz takiej procedury obsługi zdarzeń uruchomisz nieskończoną pętlę, przerwiesz zwykłe przetwarzanie zdarzeń, ponieważ polega to na powrocie do pętli zdarzeń po dość krótkim czasie, aby interfejs użytkownika pozostał czuły. Przynajmniej Twoja aplikacja przestanie odpowiadać, jeśli masz nieskończoną pętlę (kliknięcia myszą nic nie robią, grafika nie będzie już aktualizowana).

Wielozadaniowość jako taka (a tym samym inne procesy) normalnie nie ucierpi z tego powodu, ponieważ inne procesy zostaną mimo to przełączone przez jądro systemu operacyjnego.

Zatem nie jest "złem" mieć nieskończoną pętlę na mikroprocesorze, ale jest to sprzeczne ze standardami obsługi użytkownika, przynajmniej w przypadku aplikacji graficznych. Jednak w przypadku aplikacji konsolowej możesz mieć nieskończoną pętlę bez szkody, na przykład, jeśli chcesz obliczyć liczbę pi do 1 miliona cyfr (i ostatecznie umieścić wynik na konsoli) lub cokolwiek podobnego, ponieważ użytkownik jest normalnie ( w najgorszym przypadku) przygotowane dla aplikacji konsolowych, których wyniki trwają prawie wieczność.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...