Kā Veikt Paralēlus Uzdevumus (pavedienus) Arduino Programmā

Satura rādītājs:

Kā Veikt Paralēlus Uzdevumus (pavedienus) Arduino Programmā
Kā Veikt Paralēlus Uzdevumus (pavedienus) Arduino Programmā

Video: Kā Veikt Paralēlus Uzdevumus (pavedienus) Arduino Programmā

Video: Kā Veikt Paralēlus Uzdevumus (pavedienus) Arduino Programmā
Video: ПЕРВАЯ СХЕМА НА АРДУИНО [Уроки Arduino #4] 2024, Novembris
Anonim

Mikroprocesoru tehnoloģijā paralēli darbojošos uzdevumus sauc par pavedieniem. Tas ir ļoti ērti, jo bieži vien ir nepieciešams veikt vairākas operācijas vienlaikus. Vai ir iespējams likt Arduino mikrokontrollerim veikt vairākus uzdevumus vienlaikus, piemēram, īstu procesoru? Paskatīsimies.

Paralēlās straumes Arduino programmā
Paralēlās straumes Arduino programmā

Tas ir nepieciešams

  • - Arduino;
  • - 1 LED;
  • - 1 pjezo skaņas signāls.

Instrukcijas

1. solis

Vispārīgi runājot, Arduino neatbalsta patiesu paralelizāciju vai daudzsavienojumu.

Bet jūs varat pateikt mikrokontrollerim pārbaudīt, vai ir pienācis laiks izpildīt kādu papildu fona uzdevumu katrā cikla "loop ()" atkārtojumā. Šajā gadījumā lietotājam šķitīs, ka vienlaikus tiek veikti vairāki uzdevumi.

Piemēram, mirgosim gaismas diodi noteiktā frekvencē un paralēli izstarosim skaņas, kas paceļas un krīt kā sirēna no pjezoelektriskā izstarotāja.

Arduino mēs vairākkārt esam savienojuši gan LED, gan pjezo izstarotāju. Saliksim ķēdi, kā parādīts attēlā. Ja savienojat LED ar digitālo tapu, kas nav "13", atcerieties, ka strāvas ierobežojošais rezistors ir aptuveni 220 omi.

Elektroinstalācijas shēma skaņas signālam un LED ar Arduino
Elektroinstalācijas shēma skaņas signālam un LED ar Arduino

2. solis

Uzrakstīsim šādu skici un augšupielādēsim to Arduino.

Pēc dēļa ielādēšanas jūs varat redzēt, ka skice nav izpildīta tieši tā, kā mums tas ir nepieciešams: kamēr sirēna nav pilnībā darboties spējīga, gaismas diode nemirgos un mēs vēlētos, lai sirēna signāla laikā mirgot. Kāda šeit ir problēma?

Fakts ir tāds, ka šo problēmu nevar atrisināt parastajā veidā. Uzdevumus mikrokontrolleris veic stingri secīgi. Operators "delay ()" aizkavē programmas izpildi uz noteiktu laika periodu, un līdz šī laika beigām šādas programmas komandas netiks izpildītas. Tāpēc mēs nevaram iestatīt atšķirīgu izpildes ilgumu katram uzdevumam programmas "ciklā ()".

Tādēļ jums kaut kā jāimitē daudzuzdevumu veikšana.

Pīkstiena un LED vadība virknē
Pīkstiena un LED vadība virknē

3. solis

Opciju, kādā Arduino veiks uzdevumus pseido paralēli, Arduino izstrādātāji iesaka rakstā

Metodes būtība ir tāda, ka ar katru "loop ()" cilpas atkārtojumu mēs pārbaudām, vai ir laiks mirgot gaismas diode (fona uzdevuma veikšanai) vai nē. Un, ja tā notiek, mēs apgriežam gaismas diodes stāvokli. Tas ir sava veida apiet operatoru "delay ()".

Būtisks šīs metodes trūkums ir tāds, ka koda sadaļa LED vadības bloka priekšā ir jāizpilda ātrāk nekā mirgojošā LED intervāla "LEDInterval" laika intervāls. Pretējā gadījumā mirgošana notiks retāk, nekā nepieciešams, un mēs negūsim paralēlu uzdevumu izpildes efektu. Jo īpaši mūsu skicē sirēnas skaņas maiņas ilgums ir 200 + 200 + 200 + 200 = 800 ms, un mēs iestatījām LED mirgošanas intervālu uz 200 ms. Bet gaismas diode mirgos ar 800 msek periodu, kas 4 reizes atšķiras no mūsu iestatītā. Parasti, ja kodā tiek izmantots operators "delay ()", tad ir grūti simulēt pseidoparallelismu, tāpēc ieteicams no tā izvairīties.

Šajā gadījumā sirēnas skaņas vadības blokam būtu jāpārbauda, vai ir pienācis laiks vai nē, un neizmantot "delay ()". Bet tas palielinātu koda apjomu un pasliktinātu programmas lasāmību.

LED mirgo bez kavēšanās () operators
LED mirgo bez kavēšanās () operators

4. solis

Lai atrisinātu šo problēmu, mēs izmantosim brīnišķīgo ArduinoThread bibliotēku, kas ļauj viegli izveidot pseido-paralēlus procesus. Tas darbojas līdzīgi, bet ļauj jums nerakstīt kodu, lai pārbaudītu laiku - vai uzdevums ir jāizpilda šajā cilpā vai nē. Tas samazina koda daudzumu un uzlabo skices lasāmību. Apskatīsim bibliotēku darbībā.

Vispirms lejupielādējiet bibliotēkas arhīvu no oficiālās vietnes https://github.com/ivanseidel/ArduinoThread/archive/master.zip un izpakojiet to Arduino IDE direktorijā "bibliotēkas". Pēc tam pārdēvējiet mapi "ArduinoThread-master" uz "ArduinoThread".

ArduinoThread bibliotēkas instalēšana
ArduinoThread bibliotēkas instalēšana

5. solis

Savienojuma shēma paliks nemainīga. Mainīsies tikai programmas kods. Tagad tas būs tāds pats kā sānjoslā.

Programmā mēs izveidojam divas plūsmas, katra veic savu darbību: viena mirgo ar LED, otra kontrolē sirēnas skaņu. Katrā cilpas atkārtojumā katram pavedienam mēs pārbaudām, vai ir pienācis laiks tā izpildei vai nē. Ja tas pienāk, tas tiek palaists izpildei, izmantojot metodi "run ()". Galvenais ir neizmantot operatoru "delay ()".

Detalizētāki paskaidrojumi ir sniegti kodeksā.

Ielādēsim kodu Arduino atmiņā, palaidīsim to. Tagad viss darbojas tieši tā, kā vajadzētu!

Ieteicams: