Arduino программасында параллель тапшырмаларды (жиптерди) кантип аткарууга болот

Мазмуну:

Arduino программасында параллель тапшырмаларды (жиптерди) кантип аткарууга болот
Arduino программасында параллель тапшырмаларды (жиптерди) кантип аткарууга болот

Video: Arduino программасында параллель тапшырмаларды (жиптерди) кантип аткарууга болот

Video: Arduino программасында параллель тапшырмаларды (жиптерди) кантип аткарууга болот
Video: arduino подключение питания и виды сигналов урок №2. 2024, Май
Anonim

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

Arduino программасында параллель агымдар
Arduino программасында параллель агымдар

Ал зарыл

  • - Arduino;
  • - 1 светодиод;
  • - 1 пьезо үнү.

Нускамалар

1 кадам

Жалпысынан айтканда, Arduino чыныгы параллелизацияны же көп жиптөөнү колдобойт.

Бирок сиз микроконтроллерге "цикл ()" циклинин ар бир кайталанышында кошумча, фондук тапшырманы аткарууга убакыт келгендигин текшерүүсүн айта аласыз. Мындай учурда, колдонуучуга бир эле учурда бир нече тапшырма аткарылып жаткандай сезилет.

Мисалы, берилген жыштыкта LED шамын күйгүзүп, параллелдүү түрдө пьезоэлектрдик эмитенттен чыккан сиренадай көтөрүлүп-төмөндөгөн үндөрдү чыгаралы.

Биз Arduino компаниясына бир нече жолу светодиодду жана пьезо эмитентин туташтырдык. Сүрөттө көрсөтүлгөндөй схеманы чогултабыз. Эгерде сиз диоддук диапазонду "13" эмес, башка санариптик сайгычка туташтырып жатсаңыз, болжол менен 220 омдук чектөөчү каршылык көрсөтүүнү унутпаңыз.

Ардуиного чейин зырылдоочу жана LED үчүн электр өткөргүчтөрүнүн схемасы
Ардуиного чейин зырылдоочу жана LED үчүн электр өткөргүчтөрүнүн схемасы

2-кадам

Келгиле, ушундай эскиз жазып, Arduinoго жүктөлсүн.

Тактаны жүктөгөндөн кийин, эскиздин биз талап кылгандай аткарылбай жаткандыгын көрө аласыз: сирена толук иштемейинче, диод күйбөйт жана сиренанын үнү угулганда диоддун жаркылдагын каалайбыз. Бул жерде эмне көйгөй бар?

Чындыгында, бул көйгөйдү кадимкидей жол менен чечүү мүмкүн эмес. Тапшырмаларды микроконтроллер катуу ырааттуу аткарат. "Delay ()" оператору программанын аткарылышын белгиленген мөөнөткө кечиктирет жана ушул убакыт бүткөнгө чейин программанын төмөнкү командалары аткарылбайт. Ушундан улам, программанын "циклиндеги ()" ар бир тапшырма үчүн ар кандай аткаруунун узактыгын орното албайбыз.

Ошондуктан, сиз кандайдыр бир жол менен көп тапшырманы окшоштурушуңуз керек.

Сигнал жана диоддук башкаруу катар
Сигнал жана диоддук башкаруу катар

3-кадам

Arduino псевдо-параллелдик тапшырмаларды аткара турган вариантын Arduino иштеп чыгуучулары https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay макаласында сунуш кылышкан.

Методдун маңызы - "цикл ()" циклинин ар бир кайталанышында, биз диоддун көзүн күйгүзүү мезгили келдиби же жокпу (фон тапшырмасын аткаруу үчүн). Эгер ошондой болсо, анда биз LED абалын оодарабыз. Бул "delay ()" операторун айланып өтүүнүн бир түрү.

Бул ыкманын олуттуу кемчилиги - LED башкаруу блогунун алдындагы код бөлүмү "ledInterval" диодунун күйүп-жанып турган убакыт аралыгына караганда тезирээк аткарылышы керек. Болбосо, ирмөө зарыл болгондон азыраак пайда болот жана биз тапшырмаларды параллель аткаруу натыйжасын ала албайбыз. Тактап айтканда, биздин эскизде сиренанын үнүн өзгөртүү узактыгы 200 + 200 + 200 + 200 = 800 мсек, ал эми биз диоддун жаркылдаган аралыгын 200 мсек кылып койдук. Бирок LED 800 мсек мезгилинде жаркылдайт, бул биз койгонунан 4 эсе айырмаланат. Жалпысынан, эгерде коддо "delay ()" оператору колдонулса, анда псевдопараллелизмди окшоштуруу кыйын, андыктан андан алыс болгонубуз оң.

Бул учурда, сиренанын үнүн көзөмөлдөөчү бөлүккө убакыттын келгендигин же келбегендигин текшерип, "delay ()" баскычын колдонбоо керек болот. Бирок бул коддун көлөмүн көбөйтүп, программанын окулушун начарлатмак.

Жарык диоды кечиктирбестен күйүп-жанып турат () оператору
Жарык диоды кечиктирбестен күйүп-жанып турат () оператору

4-кадам

Бул көйгөйдү чечүү үчүн, жасалма параллель процесстерди оңой түзүүгө мүмкүнчүлүк берген сонун ArduinoThread китепканасын колдонобуз. Ал ушундай эле жол менен иштейт, бирок убакытты текшерүү үчүн код жазбоого мүмкүнчүлүк берет - ушул циклдеги тапшырманы аткаруу керекпи же жокпу. Бул коддун көлөмүн азайтып, эскиздин окулушун жакшыртат. Келгиле, иш жүзүндө китепкананы карап көрөлү.

Алгач, https://github.com/ivanseidel/ArduinoThread/archive/master.zip расмий сайтынан китепкана архивин жүктөп алып, Arduino IDEнин "китепканалары" каталогуна ачыңыз. Андан кийин "ArduinoThread-master" папкасынын атын "ArduinoThread" деп өзгөртүңүз.

ArduinoThread китепканасын орнотуу
ArduinoThread китепканасын орнотуу

5-кадам

Байланыш схемасы ошол бойдон калат. Программанын коду гана өзгөрүлөт. Эми бул каптал тилкесиндегидей болот.

Программада биз эки агымды түзөбүз, алардын ар бири өз ишин аткарат: бири светодиод менен жымыңдайт, экинчиси сиренанын үнүн башкарат. Циклдин ар бир кайталанышында, ар бир жип үчүн, анын аткарылышына убакыт келдиби же жокпу текшеребиз. Эгер ал келсе, анда "run ()" ыкмасы менен аткарууга башталат. Эң башкысы "delay ()" операторун колдонбоңуз.

Толугураак түшүндүрмөлөр кодексте келтирилген.

Кодду Arduino эс тутумуна жүктөлү, аны иштетели. Азыр бардыгы талаптагыдай иштеп жатат!

Сунушталууда: