Mikroprotsessor texnologiyasida parallel bajariladigan vazifalar Threads deb nomlanadi. Bu juda qulay, chunki ko'pincha bir vaqtning o'zida bir nechta operatsiyalarni bajarish kerak bo'ladi. Arduino mikrokontrollerini bir vaqtning o'zida bir nechta vazifalarni, xuddi haqiqiy protsessor singari bajarishi mumkinmi? Ko'raylikchi.
Bu zarur
- - Arduino;
- - 1 LED;
- - 1 piezo zil.
Ko'rsatmalar
1-qadam
Umuman aytganda, Arduino haqiqiy parallellashtirishni yoki ko'p qirrali ishlarni qo'llab-quvvatlamaydi.
Ammo siz mikrokontrollaga "loop ()" tsiklining har bir takrorlanishida qo'shimcha, fon vazifasini bajarish vaqti kelganligini tekshirishini aytishingiz mumkin. Bunday holda, foydalanuvchiga bir vaqtning o'zida bir nechta vazifalar bajarilayotganga o'xshaydi.
Masalan, keltirilgan chastotada LEDni miltillaymiz va parallel ravishda piezoelektrik emitentdan sirena singari ko'tarilib tushadigan tovushlarni chiqaraylik.
Biz LEDni ham, piezo emitentni ham Arduino-ga bir necha bor ulaganmiz. Shaklda ko'rsatilgandek sxemani yig'amiz. Agar siz LEDni "13" dan tashqari raqamli pinga ulab qo'ysangiz, oqim cheklovi qarshiligi taxminan 220 ohm bo'lganligini unutmang.
2-qadam
Keling, shunday eskiz yozamiz va Arduino-ga yuklaymiz.
Plitani yuklaganingizdan so'ng, eskiz biz xohlagan darajada bajarilmayotganini ko'rishingiz mumkin: sirena to'liq ishga tushgunga qadar, LED yonib-o'chmaydi va biz sirena eshitilib turganda LED yonib-o'chishini xohlaymiz. Bu erda qanday muammo bor?
Haqiqat shundaki, bu muammoni odatdagi tarzda hal qilish mumkin emas. Vazifalar mikrokontroller tomonidan qat'iy ketma-ketlikda bajariladi. "Delay ()" operatori dasturning bajarilishini belgilangan vaqtga qoldiradi va shu vaqt tugaguniga qadar dasturning quyidagi buyruqlari bajarilmaydi. Shu sababli, biz dasturning "tsikli ()" da har bir topshiriq uchun boshqacha ijro muddatini belgilay olmaymiz.
Shuning uchun, siz qandaydir tarzda ko'p vazifalarni taqlid qilishingiz kerak.
3-qadam
Arduino psevdo-parallel ravishda vazifalarni bajaradigan variantni Arduino dasturchilari https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay maqolasida taklif qilishadi.
Usulning mohiyati shundan iboratki, "loop ()" tsiklining har bir takrorlanishi bilan biz LEDni miltillash vaqti (fon vazifasini bajarish uchun) yoki yo'qligini tekshiramiz. Agar shunday bo'lsa, biz LED holatini teskari yo'naltiramiz. Bu "delay ()" operatorini chetlab o'tishning bir turi.
Ushbu usulning muhim kamchiliklari shundaki, LED boshqaruv bloki oldida kod bo'limi "ledInterval" LED'sining miltillovchi vaqt oralig'idan tezroq bajarilishi kerak. Aks holda, milt-milt kerak bo'lgandan kamroq tez-tez sodir bo'ladi va biz vazifalarni parallel bajarish samarasini ololmaymiz. Xususan, bizning eskizimizda siren tovushining o'zgarishi davomiyligi 200 + 200 + 200 + 200 = 800 msec ni tashkil qiladi va biz LED miltillovchi intervalni 200 msek-ga o'rnatdik. Ammo LED 800 msec bilan yonib turadi, bu biz o'rnatganimizdan 4 baravar farq qiladi. Umuman olganda, kodda "delay ()" operatori ishlatilgan bo'lsa, unda psevdo-parallellikni simulyatsiya qilish qiyin, shuning uchun undan qochish maqsadga muvofiqdir.
Bunday holda, sirena ovozini boshqarish bloki ham vaqt kelgan yoki kelmaganligini tekshirishi va "delay ()" dan foydalanmasligi kerak bo'ladi. Ammo bu kod miqdorini ko'paytiradi va dasturning o'qilishini yomonlashtiradi.
4-qadam
Ushbu muammoni hal qilish uchun biz psevdo-parallel jarayonlarni osongina yaratishga imkon beradigan ajoyib ArduinoThread kutubxonasidan foydalanamiz. U xuddi shunday ishlaydi, lekin vaqtni tekshirish uchun kod yozmaslikka imkon beradi - bu tsikldagi vazifani bajarish kerakmi yoki yo'qmi. Bu kod miqdorini kamaytiradi va eskizning o'qilishini yaxshilaydi. Keling, kutubxonani amalda tekshirib ko'raylik.
Avvalo, https://github.com/ivanseidel/ArduinoThread/archive/master.zip rasmiy saytidan kutubxona arxivini yuklab oling va Arduino IDE-ning "kutubxonalari" katalogiga oching. Keyin "ArduinoThread-master" papkasini "ArduinoThread" deb o'zgartiring.
5-qadam
Ulanish diagrammasi bir xil bo'lib qoladi. Faqat dastur kodi o'zgaradi. Endi u yon panelda bo'lgani kabi bo'ladi.
Dasturda biz ikkita oqimni yaratamiz, ularning har biri o'z ishini bajaradi: biri LED bilan miltillaydi, ikkinchisi sirenaning ovozini boshqaradi. Har bir ipning takrorlanishida har bir ip uchun biz uning bajarilish vaqti kelgan-kelmaganligini tekshiramiz. Agar u kelsa, "run ()" usuli yordamida bajarish uchun ishga tushiriladi. Asosiy narsa "delay ()" operatoridan foydalanmaslikdir.
Kodda batafsilroq tushuntirishlar berilgan.
Kodni Arduino xotirasiga yuklaylik, uni ishga tushiring. Endi hamma narsa kerakli darajada ishlaydi!