Kysymys:
Ääretön silmukka mikro-ohjaimessa vs. moderni CPU
James
2020-01-05 17:37:19 UTC
view on stackexchange narkive permalink

Mikrokontrollerissa (tarkemmin sanoen Arduino Uno -levyllä, joka käyttää ATmega 328P -mikrokontrolleria) käytän yleensä ääretöntä silmukkaa tulojen jne. tarkistamiseen (Arduino-maassa tämä on yleensä -silmukka () toiminto).Jos jätän tämän toiminnon tyhjäksi, se ei aiheuta ongelmia.

Pöytätietokoneessa / kannettavassa, jossa on Intel i7 -prosessori jne., jos suoritin samanlaisen äärettömän silmukan (ilman mitään tekemistä tai hyvin vähän tekemistä), se kiinnittäisi suorittimen ~ 100%: iin ja yleensä kiihdyttäisi faneja jne. (viive voidaan lisätä esimerkiksi tämän estämiseksi).

Miksi tämä näyttää olevan ok mikrokontrollerilla, mutta sitä ei yleensä haluta mikroprosessorille?Olenko oikeassa ajattellessani, että ATmega toimii itse asiassa 100%: lla ja että koska se on niin vähän virtaa käyttävä, se ei aiheuta ilmeisiä lämpöongelmia?

Entä jos sanoisin, että prosessorin "tyhjäkäynti" -tehtävä oli vain silmukka, joka käytti kaiken käyttämättömän prosessorin ajan, jota ei muuten ajoitettu?
@RonBeyer tarkoitatko asioita, kuten Linux-tyhjäkäyntitehtävä, joka suorittaa `` HLT` (pysäytys) -käskyn todellisen silmukan sijaan?
Viisi vastused:
bobflux
2020-01-05 18:46:34 UTC
view on stackexchange narkive permalink

Miksi tämä näyttää olevan kunnossa mikrokontrollerissa, mutta sitä ei yleensä haluta mikroprosessorille?

Se ei myöskään ole toivottu mikro-ohjaimelle samasta syystä: se hukkaa virtaa.

Olenko oikeassa ajattellessani, että ATmega toimii itse asiassa 100%: lla

Oikea.

ja että koska se on niin vähän virtaa käyttävä, se ei aiheuta ilmeisiä lämpöongelmia?

Oikea. Jos kuitenkin suoritat mikrokontrolleriasi batteries-palvelimella, sinun on mietittävä todella kovasti, ettet tuhlaa virtaa. Pienellä AtMega328P: n kaltaisella prosessorilla se ei aiheuta lämpöongelmia, mutta se varmasti lyhentää akun käyttöikää.

Kaikki suorittimet, olivatpa ne työpöydän voimalaitoksia tai pieniä mikro-ohjaimia, käyttävät samoja menetelmiä:

1 - Vähennä kellonopeutta tai jännitettä.

2 - Sammuta tarpeeton laitteisto.

3- Mene nukkumaan ja herää tapahtuman yhteydessä (tämä on erikoistapaus tarpeettoman laitteiston sammuttamisesta, tässä tapauksessa prosessori sammutetaan).

AtMega328P: ssä voit myös toteuttaa tämän. Voit käyttää hitaampaa kelloa, jos et tarvitse kaikkia 8-bittisen ytimen mahtavaa voimaa, voit sulkea tarpeettomat oheislaitteet ... ja tärkeintä on lepotila.

Sinun tulisi lukea lisätietoja käyttöoppaasta, koska on olemassa useita lepotiloja, jotka eroavat toisistaan ​​herätysviiveissä, mitkä oheislaitteet pysyvät verkossa ja kykenevät herättämään prosessorin, onko RAM-tiedot säilyneet vai kadonneet jne. Mutta periaatteessa idea on: lepotilassa CPU pysäytetään, joten se kuluttaa paljon vähemmän virtaa. Kun keskeytys tapahtuu, tämä herättää suorittimen ja se käsittelee keskeytyksen.

Sinun on tietysti käytettävä oikeaa lepotilaa ja määritettävä se oikein, jotta prosessorin herättämistä tarvitsevaa oheislaitetta (esimerkiksi ajastinta tai GPIO-keskeytystä) ei suljeta. Jos kaikki on suljettu, sinun on käytettävä NMI: tä tai jopa Nollaa sen herättämiseksi, jälkimmäisessä tapauksessa käynnistämällä se uudelleen.

Jos kaikki sovelluksesi on odottaa keskeytyksiä, kuten:

  • Kiinnitä vaihdon keskeytys (PCI) napin painalluksen tai saapuvan signaalin havaitsemiseksi

  • Timer

  • UART: n tai USB: n vastaanottamat tiedot

  • et

Sitten sinun ei tarvitse pyörittää pääsilmukkaa.Kun olet määrittänyt kaiken käynnistyksen yhteydessä, aloitat pääpiirin "mene nukkumaan" -ohjeella.Seuraava käsky suoritetaan, kun prosessori herää, käsittelee kaikki odottavat keskeytykset ja palaa pääpiiriin.Sitten pääsilmukka voi tarvittaessa tehdä jotain vastaanotetuista tapahtumista, jos keskeytyskoodi ei käsitellyt niitä kokonaan ... ja sitten palata nukkumaan.

Vaikka et käyttäisikään paristoja, virransyöttö virtalähteellä voi olla matala valmiustilan virralla ohittaa jaksot ja tuhlata paljon vähemmän virtaa.

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

Mikrokontrollerissa (tarkemmin sanoen Arduino Uno -levyllä, joka käyttää ATmega 328P-mikrokontrolleria) käytän tavallisesti ääretöntä silmukkaa tulojen jne. tarkistamiseen (Arduino-maassa tämä on yleensä loop () -toiminto). Jos jätän tämän toiminnon tyhjäksi, se ei aiheuta ongelmia.

Klassinen ohjelmointimalli, jolla on pääpiiri ...

Pöytätietokoneessa / kannettavassa, jossa on Intel i7 -prosessori jne., jos suoritin samanlaisen äärettömän silmukan (ilman mitään tekemistä tai hyvin vähän tekemistä), se kiinnittäisi suorittimen ~ 100%: iin ja yleensä kiihdyttäisi faneja jne. ( viive voidaan lisätä esimerkiksi tämän estämiseksi).

… saatamme kirjoittaa erilaisia ​​pääsilmukoita.

Tämä sama pääsilmukka olisi huono käytäntö myös mikro-ohjaimessa, koska se myös suorittaa CPU: n täydellä kuormalla - mikä polttaa virtaa. Älä tee sitä, varsinkin jos sinulla on akku.

Nykyaikaisissa suorittimen ytimissä on synkronointimekanismit. Tämän avulla ihmiset voivat toteuttaa jotain "anna tämän silmukan suorituksen nukkua, kunnes 1 ms on kulunut tai kunnes ehto on muuttunut".

Se on pohjimmiltaan minkä tahansa monitoimisen käyttöjärjestelmän ydin - ja periaatteessa kaikki tämän nimen ansaitsevat käyttöjärjestelmät ovat jo nyt. Mikrokontrollereista löydät usein ns. RTOS-tiedostoja (reaaliaikaiset käyttöjärjestelmät), jotka takaavat, kuinka varma voit olla, että jonkin suorittaminen on alkanut niin monen nanosekunnin jälkeen, koska se on tyypillistä käyttötapaukselle mikrokontrollereista, kun taas työasemissa ja palvelimen suorittimissa on yleensä täysimittaisia ​​samanaikaisia ​​moniprosessoivia käyttöjärjestelmiä, jotka antavat vähemmän takuita ajoitukselle, mutta tarjoavat paljon suuremman valikoiman toimintoja sekä laitteisto- ja ohjelmistoympäristön abstraktiota.

En tiedä Arduinon suoritusympäristöä tarpeeksi hyvin, jotta voisin todella tehdä siitä päteviä lausuntoja. Tutkin tätä kirjoittaessani: Arduino ei tunnu olevan suunniteltu tätä varten - se odottaa sinun vain pyörivän kiireisesti. Koska sillä ei ole "tuotto" -toimintoa, "taloudenhoitoa", jota se tekee -silmukkaan soitettujen puheluiden välillä, ei voida kutsua, kun käytät sisäänrakennettua delay -toimintoa. Uh! Huono muotoilu.

Mitä tekisit teho- ja / tai latenssitietoisessa suunnittelussa, käyttäisit RTOS: ää mikrokontrollerisi kanssa - FreeRTOS on melko suosittu, ARM Cortex-M -sarjassa mbedillä on paljon pitoa, minä henkilökohtaisesti kuten ChibiOS (mutta en usko, että se on hyvä valinta vaihdettaessa Arduino-luonnoksista), Linux-säätiö työntää Zephyriä (josta olen ristiriidassa); todellakin, on paljon valintoja, ja mikrokontrollerin valmistaja tukee yleensä yhtä tai useampaa IDE: nsä kautta.

Miksi tämä näyttää olevan kunnossa mikrokontrollerissa, mutta sitä ei yleensä haluta mikroprosessorille?

Se ei todellakaan ole kunnossa, se on epätavallinen muotoilu itse asiassa mikro-ohjaimille, jotka yleensä tekevät asioita säännöllisin väliajoin tai reagoivat ulkoisiin ärsykkeisiin. Ei ole tavallista, että haluat "käyttää niin paljon suoritinta kuin mahdollista" mikro-ohjaimessa jatkuvasti.

Tähän malliin on poikkeuksia, ja niitä on sekä MCU: ssa että palvelin- / työpöytäprosessorimaailmassa; kun tiedät, että sinulla on käytännössä aina esim. Verkkotiedot käsiteltäviksi kytkinlaitteessa tai kun tiedät, että pelisi voisi aina jo ennakoida jonkin verran maailmaa, jota saatat tarvita tai et välttämättä tarvita hetkessä, löydät nämä spinpiirit. Joissakin laitteistoajureissa on "pyörimislukot", mikä tarkoittaa, että keskusyksikkö kysyy arvoa jatkuvasti, kunnes se on muuttunut (esim. Laitteiston asennus on valmis ja sitä voidaan käyttää nyt), mutta se on yleensä vain hätäratkaisu, ja sinun on selitettävä, miksi teet niin, kun yrität saada tällaista koodia esimerkiksi Linuxiin.

Olenko oikeassa ajattellessani, että ATmega toimii tosiasiallisesti 100-prosenttisesti ja että koska se on niin vähän virtaa käyttävä, se ei aiheuta ilmeisiä lämpöongelmia?

Kyllä. ATMega ei nykyaikaisella tavalla ole vähän virtaa käyttävä, mutta se on riittävän pieni virralla, jotta lämmöstä ei tule ongelmaa.

miksi downvote?Olisi hienoa, jos voisit laajentaa sitä;täällä on kaksi hyvin samanlaista vastausta, ja vain yksi sai äänestyksen, joten luonnollisesti ihmettelen, mitä olisin voinut tehdä paremmin.
Sinun ei tarvitse käyttää RTOS: ta tähän.Sinä vain laitat mcun nukkumaan silmukan loppuun ja ajastin (tai ulkoinen lähde) herättää sen.
@RubberDuck ah, mutta en sanonut tarvitsevasi käyttöjärjestelmää;Kuvasin "tavallisen" tavan tehdä tämä.
.... jätkä.Hämmentynyt alasäänestyksestä ennen kuin minulla edes oli aikaa jättää kommentti selittäen miksi.Tämä on huonompi kuin toinen vastaus, koska jo antamani selityksen annin, koska siinä ei oteta huomioon kysymyksen asiayhteyttä.
:) Ei hämmentynyt :) Olen itse asiassa hyvin onnellinen, että kommentoit!Jätän usein tämän kommentin kannustaakseni ihmisiä jättämään palautetta.Konteksti minulle oli vaikea, koska arduino ei ole kotimainen ympäristöni.(Toivon, että olen selvittänyt sen)
Katsokaa mainemäärääni: En voinut välittää vähemmän siitä, kuinka monta mielikuvitettua Internet-pistettä saan;minulle arvokasta on rehellinen palaute.Jos otan jotain EE.SE: stä, opin paljon JA sosiaalista vuorovaikutusta :)
_ "Se ei ole oikein", _ hölynpölyä, suurimman osan ajasta se on hieno.Ei ole kuin sirulla olisi mitään muuta tekemistä.Hienolla RTOS: lla säästämäsi teho _ ei koskaan korvaa sen toteuttamiseen käytettyä virtaa, varsinkin jos käytät siihen modernia tietokonetta!
@BruceAbbott um, se ei kuvaa ollenkaan kokemustani.Esimerkiksi pieni ohjainkortti, viisi näppäintä, kolme LEDiä, PWM-lähtö, joka on säädettävissä mainittujen painikkeiden avulla, suurimman osan ajasta huomaten: virtaa kaksi alkalia pois kuukausien ajan;chibiOS-käyttämättömät säikeet 99,99 ..% ajastaMinun ei tarvitse laskea, kuinka kauan tämä juoksisi, jos tämä olisi koko ajan `` jonkin aikaa ''.
Toki, mutta kuinka paljon virtaa tietokoneesi käytti, kun ohjelmoit sitä?Panostan yli 2 alkaliin.Todennäköisesti yli 100 emästä - riittää käyttämään MCU: ta vuosia!:) Koska OP kysyi nimenomaan Arduino Unosta, ei ole mitään järkeä puhua erittäin pienitehoisista ohjelmistoista (minimivirta tällä levyllä on 15 mA), ja suurimmalla osalla asioista, joihin he tottuvat, sillä ei ole merkitystä.
Kuinka paljon tehoa Arduino-kääntäjä käytti?Pyöristettynä lähimpään 1 prosenttiin kuukausittain puolisatunnaisista vaihteluista yleishyödyllisissä laskuissani, nolla.Nämä AA: t ovat käyttäneet jotakin BLE Arduinoa puuhun yli yli kuukauden.Merkittäviä ponnisteluja kiivetä puuhun ja korvata ne.
"Tämä sama pääpiiri olisi huono käytäntö myös mikro-ohjaimessa" - riippuu todella.Joissakin sovelluksissa on runsaasti virtaa (kaikki verkkovirtaiset tai joissa on suuria akkuja, sanotaan käyttävän äänenvahvistinta), jotkut eivät (akkukäyttöiset laitteet, jotka ovat aina päällä)
Bruce Abbott
2020-01-06 01:23:02 UTC
view on stackexchange narkive permalink

Olenko oikeassa ajattellessani, että ATmega toimii itse asiassa 100 prosentilla, ja koska se on niin vähän virtaa käyttävä, se ei aiheuta ilmeistä lämpöä ongelmia?

Kyllä, se toimii normaalisti 100% koko ajan, mutta on niin vähän virtaa kuluttava, että se ei kuumene merkittävästi.

Pöytätietokoneessa / kannettavassa tietokoneessa, jossa on Intel i7 -prosessori jne., jos suoritin vastaavaa ääretön silmukka (ilman mitään tekemistä tai hyvin vähän tekemistä) se kiinnittyy CPU ~ 100%: lla ja yleensä kiihdyttävät faneja jne.

Mitä nopeammin prosessori kellotetaan, sitä enemmän virtaa se käyttää, koska joka kerta kun logiikkataso muuttuu, sen on ladattava porttien transistorien kapasitanssit. Nykyaikaiset suorittimet on suunniteltu toimimaan mahdollisimman nopeasti - itse asiassa nopeammin kuin mahdollista. Jopa sen jälkeen, kun transistorit on tehty mahdollisimman pieniksi, käyttäen pienintä mahdollista jännitettä ja kohdistamalla valtava jäähdytyselementti, ne eivät silti voi toimia tarpeeksi nopeasti tyydyttääkseen tietokoneen käyttäjän "nopeuden tarpeen". Joten he luottavat siihen, että käyttöjärjestelmä ja sovellusohjelmat viettävät suurimman osan ajastaan ​​odottaessaan tavaroiden tapahtumista (käyttäjän syötteet, oheislaitteet jne.).

Jos yrität käyttää kaikkia i7: n ytimiä jatkuvasti suurimmalla taajuudella, se sulaa. Tämän estämiseksi käyttämättömät ytimet kytketään pois päältä ja kun enimmäisnopeutta ei vaadita (ts. Suurimman osan ajasta), aktiiviset ytimet toimivat alemmalla taajuudella. Valmiustilassa käyttöjärjestelmä ei vain suorita varattua silmukkaa jatkuvasti suorittamalla ohjeita, vaan asettaa CPU: n hidastuneeseen tai pysähtyneeseen tilaan odottaessaan keskeytyksiä jne. Myös prosessorin eri osat voidaan sammuttaa, kun niitä ei käytetä. / p>

ATmegaa voidaan käyttää myös pienemmällä virralla ja yksittäiset oheislaitteet voidaan kytkeä pois päältä, kun sitä ei tarvita. Jos järjestelmän kello vaihdetaan alemmalle taajuudelle, kuten 32,678 kHz, ja kaikki tarpeettomat oheislaitteet kytketään pois päältä, se voi toimia (hitaasti) vain muutamalla μA: lla - ei lämpötilan alentamiseksi, vaan kestämään pidempään pienellä akulla.

On myös mahdollista ylikellottaa monia Atmega-pelimerkkejä.Olen käyttänyt ATmega1284p: tä (mitoitettu 20 MHz: n maksimille 5 V: n jännitteellä) taajuudella 30 MHz ja se toimi hyvin, mutta sai melko lämmin.

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

Riippuu siitä, onko ATmega-järjestelmässäsi verkkovirta vai pienet paristot.

Vaihtovirran loppuminen (seinän syylävirtalähteen kautta) 100-prosenttisen prosessorin, joka käyttää linkoussilmukkaa, kuluttama teho on pienempi kuin sähkölaskusi vaihtelun melutaso.Lämmöntuotto on todennäköisesti liian pieni vaatimaan jäähdytyselementtiä tai tuuletinta, ellei se ole erittäin eristetyssä ympäristössä.Voi olla mitattavissa IR-lämpömittarilla.

Pienien paristojen loppumisesta Arduino-spin-silmukka vaikuttaa merkittävästi siihen, kuinka usein sinun on vaihdettava tai ladattava kyseiset akut.Ehkä tuntia tai kuukautta.Vakava ongelma, jos sulautettuun järjestelmään pääsy on vaikeaa.Yksi yleinen ratkaisu on käyttää jonkinlaista ajastettua pienitehoisempaa lepotilaa äärettömän silmukan sisällä tai lepotilaa ja herätyskeskeytystä jostakin ulkoisesta lähteestä.

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

Nykyaikaiselle mikroprosessorille kirjoitat todennäköisesti graafisen käyttöliittymän, joka tekee työsi. GUI: lla on oma tapahtumasilmukka (t), jossa käsitellään esimerkiksi hiiren napsautuksia, piirroksia jne. Suurin osa toiminnoistasi sijaitsee tapahtumakäsittelijän sisällä, jolle päätapahtumasilmukka on delegoinut.

Jos siis aloitat äärettömän silmukan tällaisen tapahtumakäsittelijän sisällä, aiot rikkoa tavallisen tapahtumakäsittelyn, koska se riippuu siitä, palaatko tapahtumasilmukkaan melko lyhyen ajan kuluttua, jotta käyttöliittymä pysyy reagoiva. Ainakin oma sovelluksesi ei vastaa, jos sinulla on ääretön silmukka (hiiren napsautukset eivät tee mitään, grafiikkaa ei enää päivitetä).

Monitoiminto sinänsä (ja siten myös muut prosessit) ei yleensä kärsi siitä, koska muutkin prosessit siirtyvät OS-ytimestä.

Joten ei ole "pahaa", kun mikroprosessorissa on ääretön silmukka, mutta se on vastoin käyttäjäkokemuksen standardeja ainakin graafisissa sovelluksissa. Konsolisovelluksessa sinulla saattaa kuitenkin olla ääretön silmukka vahingoittamatta, esimerkiksi jos haluat laskea pi: n miljoonaan numeroon (ja lopuksi laittaa tuloksen konsoliin) tai jotain vastaavaa, koska käyttäjä on normaalisti ( pahimmassa tapauksessa) valmis konsolisovelluksiin, joiden tulosten tuottaminen kestää melkein ikuisesti.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 4.0-lisenssistä, jolla sitä jaetaan.
Loading...