Arduino бағдарламасында параллель тапсырмаларды (жіптерді) қалай орындау керек

Мазмұны:

Arduino бағдарламасында параллель тапсырмаларды (жіптерді) қалай орындау керек
Arduino бағдарламасында параллель тапсырмаларды (жіптерді) қалай орындау керек

Бейне: Arduino бағдарламасында параллель тапсырмаларды (жіптерді) қалай орындау керек

Бейне: Arduino бағдарламасында параллель тапсырмаларды (жіптерді) қалай орындау керек
Бейне: Загрузка Bootloader от Arduino UNO в Arduino NANO 2024, Қараша
Anonim

Микропроцессорлық технологияда параллель орындалатын тапсырмалар Threads деп аталады. Бұл өте ыңғайлы, өйткені бір уақытта бірнеше операцияны орындау қажет. Arduino микроконтроллерін нағыз процессор сияқты бірнеше тапсырманы бірден орындай алуы мүмкін бе? Қарайық.

Arduino бағдарламасындағы параллель ағындар
Arduino бағдарламасындағы параллель ағындар

Бұл қажетті

  • - Ардуино;
  • - 1 жарықдиодты;
  • - 1 пьезо дабылы.

Нұсқаулық

1-қадам

Жалпы, Arduino шынайы параллельдеуді немесе көпжоспарлауды қолдамайды.

Бірақ сіз микроконтроллерге «цикл ()» циклінің қайталануында қосымша, фондық тапсырманы орындау уақыты келген-келмегенін тексере аласыз. Бұл жағдайда пайдаланушыға бірнеше тапсырма бір уақытта орындалатын болып көрінеді.

Мысалы, жарық диодты берілген жиілікте жыпылықтайық және қатар, пьезоэлектрлік эмитенттен сирена тәрізді көтеріліп-төмендейтін дыбыстар шығарайық.

Біз Arduino-ға бірнеше рет светодиодты да, пьезо-эмитентті де қосқанбыз. Суретте көрсетілгендей схеманы құрастырайық. Егер сіз жарық диодты «13» -тен басқа сандық істікке қосатын болсаңыз, шамамен 220 ом болатын ток шектейтін резисторы бар екенін ұмытпаңыз.

Ардуиноға дыбыстық сигнал және жарықдиодты қосу схемасы
Ардуиноға дыбыстық сигнал және жарықдиодты қосу схемасы

2-қадам

Осылай эскиз жазып, Arduino-ға жүктейік.

Тақтаны жүктегеннен кейін, нобайдың бізге қажеті бойынша орындалмағанын көруге болады: сирена толық жұмыс істегенге дейін, жарық диоды жыпылықтамайды және сирена шыққан кезде жарық диоды жыпылықтағанын қалаймыз. Мұнда қандай проблема бар?

Мәселе мынада, бұл мәселені әдеттегідей шешу мүмкін емес. Тапсырмаларды микроконтроллер қатаң дәйектілікпен орындайды. «Кешіктіру ()» операторы бағдарламаның орындалуын белгіленген уақытқа кешіктіреді және осы уақыт аяқталғанша келесі бағдарламалық командалар орындалмайды. Осыған орай, біз бағдарламаның «циклында ()» әр тапсырма үшін әр түрлі орындалу ұзақтығын орната алмаймыз.

Сондықтан сізге көп тапсырманы қандай да бір жолмен имитациялау қажет.

Дыбыстық сигнал және жарықдиодты сериялы басқару
Дыбыстық сигнал және жарықдиодты сериялы басқару

3-қадам

Arduino псевдопараллель бойынша тапсырмаларды орындайтын нұсқаны Arduino әзірлеушілері https://www.arduino.cc/kz/Tutorial/BlinkWithoutDelay мақаласында ұсынады.

Әдістің мәні мынада: «цикл ()» циклін әр қайталаған сайын жарық диодты жыпылықтайтын уақыт келді ме (фондық тапсырманы орындау үшін) немесе жоқ. Егер ол орын алса, онда біз СИД күйін төңкереміз. Бұл «кешіктіру ()» операторын айналып өтудің бір түрі.

Бұл әдістің елеулі кемшілігі мынада: жарықдиодты басқару блогының алдындағы код бөлімі «ledInterval» жарық диодының жыпылықтайтын уақыт аралығына қарағанда жылдамырақ орындалуы керек. Әйтпесе, жыпылықтау қажеттіліктен аз жиі пайда болады және біз тапсырмаларды параллель орындау әсерін ала алмаймыз. Атап айтқанда, біздің эскизде сирена дыбысының өзгеру ұзақтығы 200 + 200 + 200 + 200 = 800 мсек және біз жарық диодты жыпылықтайтын аралықты 200 мсек етіп қойдық. Бірақ жарық диоды 800 мсек уақытпен жыпылықтайды, бұл біз орнатқаннан 4 есе ерекшеленеді. Жалпы, егер кодта «кідіріс ()» операторы қолданылса, онда жалған параллелизмді имитациялау қиын, сондықтан одан аулақ болған жөн.

Бұл жағдайда сиренаның дыбыстық басқару блогы уақыттың келген-келмегенін тексеріп, «кешіктіру» («)» қолданбауы қажет. Бірақ бұл кодтың мөлшерін көбейтіп, бағдарламаның оқылуын нашарлатар еді.

Кешіктірмей жарық диоды жыпылықтайды () операторы
Кешіктірмей жарық диоды жыпылықтайды () операторы

4-қадам

Бұл мәселені шешу үшін біз жалған параллельді процестерді оңай құруға мүмкіндік беретін керемет ArduinoThread кітапханасын қолданамыз. Ол ұқсас түрде жұмыс істейді, бірақ уақытты тексеру үшін код жазбауға мүмкіндік береді - тапсырманы осы циклде орындау қажет пе, жоқ па. Бұл кодтың мөлшерін азайтады және эскиздің оқылуын жақсартады. Кітапхананы тексеріп көрейік.

Алдымен https://github.com/ivanseidel/ArduinoThread/archive/master.zip ресми сайтынан кітапхана мұрағатын жүктеп, Arduino IDE-нің «кітапханалары» каталогына салыңыз. Содан кейін «ArduinoThread-master» қалтасының атын «ArduinoThread» деп өзгертіңіз.

ArduinoThread кітапханасын орнату
ArduinoThread кітапханасын орнату

5-қадам

Байланыс схемасы өзгеріссіз қалады. Тек бағдарлама коды өзгереді. Енді ол бүйірлік тақтадағыдай болады.

Бағдарламада біз екі ағын жасаймыз, әрқайсысы өз жұмысын орындайды: біреуі жарық диодымен жыпылықтайды, екіншісі сиренаның дыбысын басқарады. Циклдің әр қайталануында әр жіп үшін біз оның орындалатын уақыты келген-келмегенін тексереміз. Егер ол келсе, оны орындау үшін «run ()» әдісі арқылы іске қосылады. Ең бастысы - «delay ()» операторын пайдаланбау.

Толығырақ түсініктемелер кодта келтірілген.

Кодты Arduino жадына жүктейік, оны іске қосыңыз. Қазір бәрі дәл солай жұмыс істейді!

Ұсынылған: