Në teknologjinë e mikroprocesorit, detyrat që funksionojnë paralelisht quhen Threads. Kjo është shumë e përshtatshme, sepse shpesh është e nevojshme të kryhen disa operacione në të njëjtën kohë. A është e mundur që mikrokontrolluesi Arduino të kryejë disa detyra në të njëjtën kohë, si një procesor i vërtetë? Le të shohim.
Është e nevojshme
- - Arduino;
- - 1 LED;
- - 1 zhurmë piezo.
Udhëzimet
Hapi 1
Në përgjithësi, Arduino nuk mbështet paralelizimin e vërtetë, ose shumë-fillin.
Por mund t'i thoni mikrokontrolluesit të kontrollojë nëse ka ardhur koha për të ekzekutuar disa detyra shtesë, në sfond në çdo përsëritje të ciklit "loop ()". Në këtë rast, përdoruesit do t'i duket se disa detyra po kryhen njëkohësisht.
Për shembull, le të shkelim një LED në një frekuencë të caktuar dhe, paralelisht, të lëshojmë tinguj që ngrihen dhe bien si një sirenë nga një emetues piezoelektrik.
Ne kemi lidhur si LED ashtu edhe emetuesin piezo me Arduino më shumë se një herë. Le të mbledhim qarkun siç tregohet në figurë. Nëse po lidhni një LED me një kunj dixhital përveç "13", mos harroni të keni një rezistencë kufizuese të rrymës prej rreth 220 ohm.
Hapi 2
Le të shkruajmë një skicë si kjo dhe ta ngarkojmë në Arduino.
Pas ngarkimit të tabelës, mund të shihni se skica nuk ekzekutohet saktësisht siç na duhet: derisa të funksionojë plotësisht sirena, LED nuk do të pulsojë, dhe ne do të dëshironim që LED të pulsojë GJAT tingëllimit të sirenës. Cili është problemi këtu?
Fakti është se ky problem nuk mund të zgjidhet në mënyrën e zakonshme. Detyrat kryhen nga mikrokontrolluesi në mënyrë rigoroze sekuenciale. Operatori "vonesë ()" vonon ekzekutimin e programit për një periudhë të caktuar kohe dhe derisa të skadojë kjo kohë, komandat e mëposhtme të programit nuk do të ekzekutohen. Për shkak të kësaj, ne nuk mund të vendosim një kohëzgjatje të ndryshme të ekzekutimit për secilën detyrë në "ciklin ()" të programit.
Prandaj, duhet në një farë mënyre të simuloni shumë detyrat.
Hapi 3
Opsioni në të cilin Arduino do të kryejë detyra në pseudo-paralele sugjerohet nga zhvilluesit Arduino në artikullin
Thelbi i metodës është që me çdo përsëritje të lakut "loop ()", ne kontrollojmë nëse është koha të shkelim dritën LED (për të kryer një detyrë sfondi) apo jo. Dhe nëse ndodh, atëherë ne përmbysim gjendjen e LED. Ky është një lloj anashkalimi i operatorit "vonesë ()".
Një disavantazh i rëndësishëm i kësaj metode është që seksioni i kodit përpara njësisë së kontrollit LED duhet të ekzekutohet më shpejt se intervali kohor i ndezur i LED "ledInterval". Përndryshe, ndezja e syve do të ndodhë më rrallë sesa është e nevojshme, dhe ne nuk do të marrim efektin e ekzekutimit paralel të detyrave. Në veçanti, në skicën tonë, kohëzgjatja e ndryshimit të tingullit të sirenës është 200 + 200 + 200 + 200 = 800 msec, dhe ne vendosim intervalin LED të ndezjes në 200 msec. Por LED do të pulsojë me një periudhë prej 800 msec, e cila është 4 herë e ndryshme nga ajo që kemi vendosur. Në përgjithësi, nëse në kod përdoret operatori "vonesë ()", atëherë është e vështirë të simulosh pseudo-paralelizëm, prandaj këshillohet të shmanget.
Në këtë rast, do të ishte e nevojshme që njësia e kontrollit të tingullit të sirenës të kontrollojë nëse ka ardhur koha apo jo, dhe të mos përdorë "vonesë ()". Por kjo do të rriste sasinë e kodit dhe do të përkeqësonte lexueshmërinë e programit.
Hapi 4
Për të zgjidhur këtë problem, ne do të përdorim bibliotekën e mrekullueshme ArduinoThread, e cila ju lejon të krijoni lehtësisht procese pseudo-paralele. Funksionon në një mënyrë të ngjashme, por ju lejon të mos shkruani kod për të kontrolluar kohën - nëse keni nevojë të ekzekutoni detyrën në këtë lak apo jo. Kjo zvogëlon sasinë e kodit dhe përmirëson lexueshmërinë e skicës. Le të shikojmë bibliotekën në veprim.
Para së gjithash, shkarkoni arkivin e bibliotekës nga faqja zyrtare https://github.com/ivanseidel/ArduinoThread/archive/master.zip dhe zbërthejeni atë në drejtorinë "bibliotekat" të Arduino IDE. Pastaj riemërtoni dosjen "ArduinoThread-master" në "ArduinoThread".
Hapi 5
Diagrami i lidhjes do të mbetet i njëjtë. Vetëm kodi i programit do të ndryshojë. Tani do të jetë njësoj si në shiritin anësor.
Në program, ne krijojmë dy rryma, secila kryen funksionimin e vet: njëri pulson me një LED, e dyta kontrollon tingullin e sirenës. Në çdo përsëritje të lakut, për secilën fije, ne kontrollojmë nëse ka ardhur koha për ekzekutimin e tij apo jo. Nëse arrin, ajo lëshohet për ekzekutim duke përdorur metodën "ekzekutoj ()". Gjëja kryesore është të mos përdorni operatorin "vonesë ()".
Shpjegime më të hollësishme jepen në kod.
Le të ngarkojmë kodin në memorjen Arduino, ekzekutojeni atë. Tani gjithçka funksionon saktësisht si duhet!