Arduino viivitusfunktsioon ja miks te ei peaks seda kasutama

Arduino viivitusfunktsioon ja miks te ei peaks seda kasutama

Kui alustasite õppida, kuidas areneda eest Arduino , olete ilmselt loonud toote, mis töötab natuke nii:





Teie Arduinoga oleks ühendatud üks LED -tuli. See lülituks välja ja välja igal sekundil ning jätkub seni, kuni Arduino välja lülitatakse. See on programmi 'Tere maailm' Arduino , ja illustreerib suurepäraselt, kuidas vaid mõne reaga koodist saab midagi käegakatsutavat luua.





Samuti olen valmis kihla vedama, et kasutasite viivitus () funktsioon valguse sisselülitamise ja väljalülitamise vaheliste intervallide määramiseks. Kuid siin on asi: kuigi viivitus on mugav Arduino toimimise põhinäituste jaoks, ei tohiks te seda reaalses maailmas kasutada. Siin on põhjus - ja mida peaksite selle asemel kasutama.





Kuidas Delay () töötab

See, kuidas viivitus () funktsioon töötab üsna lihtsalt. See võtab vastu ühe täisarvu (või arvu) argumendi. See number tähistab aega (mõõdetuna millisekundites), mille programm peaks ootama, kuni liigub järgmisele koodireale.

Kuid probleem on selles ,. viivitus () funktsioon ei ole hea viis panna programm ootama, sest see on nn blokeerimisfunktsioon.



mängud, mida telefoniga televiisorist mängida

Erinevus blokeerivate ja mitteblokeerivate funktsioonide vahel

Illustreerimaks, miks blokeerimisfunktsioonid on halvad, soovin, et te kujutaksite köögis ette kahte erinevat kokka: Henry blokeerimine ja Mittepiirav Eduardo . Mõlemad teevad sama tööd, kuid metsikult erineval viisil.

Kui Henry hommikusööki teeb, paneb ta kõigepealt röstrisse kaks leiba. Kui see lõpuks pingid , ja leib hüppab kuldpruuniks, Henry paneb selle taldrikule ja praeb praepannile kaks muna. Jällegi seisab ta õli hüppamisel kõrval ja valged hakkavad tahenema. Kui nad on lõpetanud, paneb ta need plaatidele ja hakkab praadima kahte peekonivirna. Kui need on piisavalt krõbedad, võtab ta need praepannilt ära, paneb taldrikule ja hakkab sööma.





Eduardo töötab veidi teistmoodi. Kui tema leib röstib, on ta juba hakanud oma mune ja peekonit praadima. Selle asemel, et oodata, kuni üks toode lõpetab toiduvalmistamise, enne kui liigub järgmise juurde, valmistab ta mitut toodet samaaegselt . Lõpptulemus on see, et Eduardo võtab hommikusöögi valmistamiseks vähem aega kui Henry - ja selleks ajaks, kui Henry Blocking on lõpetanud, on röstsai ja munad külmaks läinud.

See on rumal analoogia, kuid illustreerib asja mõtet.





Blokeerimine funktsioonid takistavad programmil midagi muud teha enne, kui see ülesanne on lõpule viidud. Kui soovite mitut toimingud et see toimuks samal ajal, ei saa te seda lihtsalt kasutada viivitus () .

Eriti kui teie rakendus nõuab lisatud anduritelt pidevalt andmete hankimist, peaksite vältima selle kasutamist viivitus () funktsioon, kuna see peatub absoluutselt kõike .

Õnneks viivitus () pole ainus viis panna oma programm Arduino kodeerimisel ootama.

Tutvuge Millisega ()

The millis () funktsioon täidab ühte ülesannet. Kui helistatakse, naaseb see (nagu pikk datatype) programmi esmakordsest käivitamisest möödunud millisekundite arv. Niisiis, miks on see kasulik?

Sest kasutades natuke lihtsat matemaatikat, saate oma programmi aspekte hõlpsalt 'ajastada', ilma et see mõjutaks selle toimimist. Järgnev on põhinäide millis () toimimisest. Nagu näete, lülitab programm LED -tule 1000 millisekundiks (üks sekund) sisse ja seejärel lülitab selle välja. Kuid ülioluline on see, et see ei blokeeriks.

Nüüd vaatame, kuidas see Arduinoga töötab.

See programm - mis põhineb tugevalt üks Arduino ametlikest dokumentidest - töötab, lahutades praeguse kellaajast eelmise salvestatud aja. Kui järelejäänud aeg (st ajast, mis on möödunud ajast, kui see viimati salvestati) on suurem kui intervall (antud juhul 1000 millisekundit), uuendab programm eelmine aeg muutuvale hetkele ja lülitab LED sisse või välja.

Kuidas kaitsta zip -faili parooliga Windows 10

Ja kuna see on mitteblokeeriv, siis esmalt mis tahes kood, mis asub väljaspool seda kui avaldus peaks normaalselt töötama.

Lihtne, kas pole? Pange tähele, kuidas me muutuja lõime currentTime kui allkirjastamata pikk. An allkirjastamata väärtus tähendab lihtsalt seda, et see ei saa kunagi olla negatiivne; teeme seda nii, et maksimaalne salvestatav arv oleks suurem. Vaikimisi on arvumuutujad allkirjastatud, mis tähendab, et selle muutuja jaoks kasutatakse ühte bitti mälu, et salvestada, kas väärtus on positiivne või negatiivne. Kui täpsustate, et see on ainult positiivne, on meil veel üks lisabitt, millega mängida.

Katkestab

Siiani oleme oma Arduino programmis õppinud ühest ajastuse lähenemise viisist, mis on parem kui viivitus () . Kuid on veel üks, palju parem, kuid keerulisem viis: katkestab . Nende eeliseks on see, et saate oma Arduino programmi täpselt ajastada ja reageerida kiiresti välisele sisendile, kuid asünkroonne viisil.

See tähendab, et see töötab koos põhiprogrammiga, oodates pidevalt sündmuse toimumist ilma teie koodi voogu katkestamata. See aitab teil sündmustele tõhusalt reageerida, ilma et see mõjutaks Arduino protsessori jõudlust.

Katkestuse käivitamisel see kas peatab programmi või kutsub üles funktsiooni, mida tavaliselt tuntakse kui Katkesta käitleja või an Katkestage teenindusrutiin . Kui see on lõpule viidud, naaseb programm selle juurde, mida ta tegi.

Arduino toitev AVR -kiip toetab ainult riistvara katkestusi. Need tekivad siis, kui sisendnõel läheb kõrgelt madalale või kui selle käivitavad Arduino sisseehitatud taimerid.

Kõlab salapäraselt. Segane isegi. Aga seda pole. Et näha, kuidas need toimivad, ja näiteid nende reaalses maailmas kasutamise kohta, tabas Arduino dokumentatsiooni .

Ärge laske end blokeerida

Kasutades millis () võtab muidugi kasutamisega võrreldes natuke lisatööd viivitus () . Kuid uskuge mind, teie programmid tänavad teid selle eest ja te ei saa ilma selleta Arduino multitegumtööd teha.

Kui soovite näha näidet millis () mida kasutatakse reaalses Arduino projektis, vaadake James Bruce'i Arduino öövalgust ja Sunrise Alarmi.

Kas leidsite muid blokeerimisfunktsioone, mille suhtes peaksime olema ettevaatlikud? Andke mulle sellest allpool kommentaarides teada ja me räägime.

Foto autorid: Arduino (Daniel Spiess) , Pealik (Ollie Svenson)

Jaga Jaga Piiksuma E -post Kas tasub Windows 11 -le üle minna?

Windows on ümber kujundatud. Kuid kas sellest piisab, et veenda teid Windows 10 -lt Windows 11 -le üle minema?

Loe edasi
Seotud teemad
  • Isetegija
  • Programmeerimine
  • Arduino
Autori kohta Matthew Hughes(Avaldatud 386 artiklit)

Matthew Hughes on tarkvaraarendaja ja kirjanik Inglismaalt Liverpoolist. Teda leidub harva ilma tassitäie tugeva musta kohvita ja jumaldab absoluutselt oma Macbook Pro'd ja kaamerat. Tema ajaveebi saate lugeda aadressil http://www.matthewhughes.co.uk ja jälgida teda Twitteris aadressil @matthewhughes.

kuidas snapchatis triipe saada
Veel Matthew Hughesilt

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin