Функция за забавяне на Arduino и защо не трябва да я използвате

Функция за забавяне на Arduino и защо не трябва да я използвате

Когато за първи път започнахте да се научат как да се развиват за Arduino , вероятно сте създали продукт, който работи малко по следния начин:





Свързан с вашия Arduino ще бъде една LED светлина. Това ще се включва и изключва на всяка секунда и ще продължи, докато Arduino не бъде изключен. Това е програмата „Hello World“ на Arduino , и отлично илюстрира как само няколко реда код могат да създадат нещо осезаемо.





Също така съм готов да се обзаложа, че сте използвали забавяне () функция за определяне на интервалите между включване и изключване на светлината. Но ето нещо: докато забавянето е удобно за основни демонстрации на това как работи Arduino, наистина не бива да го използвате в реалния свят. Ето защо - и какво трябва да използвате вместо това.





Как работи Delay ()

Начинът, по който забавяне () функцията работи е доста проста. Той приема един цяло число (или число) аргумент. Това число представлява времето (измерено в милисекунди), което програмата трябва да изчака, докато премине към следващия ред код.

Но проблемът е, че забавяне () Функцията не е добър начин да накарате програмата ви да изчака, защото е известна като „блокираща“ функция.



прехвърляне на музика от ipod в itunes

Разликата между блокиращи и неблокиращи функции

За да илюстрирам защо блокирането на функциите е лошо, искам да си представите два различни готвачи в кухня: Хенри Блокиране , и Eduardo NonBlocking . И двамата вършат същата работа, но по много различни начини.

Когато Хенри прави закуска, той започва с поставянето на два кръга хляб в тостера. Когато най -накрая пинг , и хлябът изскача златистокафяв, Хенри го поставя на чиния и разбива две яйца в тиган. Отново той стои отстрани, докато маслото изскача, а белите започват да се втвърдяват. Когато приключат, той ги подрежда и започва да пържи две стърготини бекон. След като са достатъчно хрупкави, той ги сваля от тигана, поставя ги в чинията и започва да яде.





Едуардо работи по малко по -различен начин. Докато хлябът му се препича, той вече започна да пържи яйцата и бекона си. Вместо да чака един продукт да завърши готвенето, преди да премине към следващия, той готви няколко продукта едновременно . Крайният резултат е, че на Едуардо отнема по -малко време за приготвяне на закуска, отколкото на Хенри - и докато Хенри Блокинг приключи, тостът и яйцата са изстинали.

Това е глупава аналогия, но илюстрира въпроса.





Блокиране функции възпрепятстват дадена програма да прави каквото и да било, докато тази конкретна задача не приключи. Ако искате няколко действия за да се случи по едно и също време, просто не можете да използвате забавяне () .

По -специално, ако приложението ви изисква непрекъснато получаване на данни от свързани сензори, трябва да внимавате да избегнете използването на забавяне () функция, тъй като спира абсолютно всичко .

За щастие, забавяне () не е единственият начин да накарате програмата ви да чака, когато кодира за Arduino.

Запознайте се с Милис ()

The милис () функция изпълнява една задача. При извикване се връща (като a дълго datatype) броят на милисекундите, които са изтекли от първото стартиране на програмата. И така, защо това е полезно?

Защото, използвайки малко проста математика, можете лесно да „измервате“ аспектите на вашата програма, без да влияете върху начина, по който тя работи. Следва основна демонстрация на това как работи millis (). Както ще видите, програмата ще включи LED светлината за 1000 милисекунди (една секунда) и след това ще я изключи. Но най-важното е, че го прави по начин, който не блокира.

Сега нека разгледаме как работи с Arduino.

Тази програма - което се основава в голяма степен на един от официалната документация на Arduino - работи чрез изваждане на предишното записано време от текущото. Ако остатъкът (т.е. времето, изминало от последното записване на времето) е по -голямо от интервала (в този случай 1000 милисекунди), програмата актуализира previousTime променлива към текущото време и включва или изключва светодиода.

как да създадете втори акаунт в instagram

И тъй като е неблокиращ, всеки код, който се намира първо извън него ако изявлението трябва да работи нормално.

Просто, нали? Обърнете внимание как създадохме променливата текущо време като без подпис дълго. Ан без подпис стойността просто означава, че тя никога не може да бъде отрицателна; правим това, така че максималният брой, който можем да съхраняваме, да е по -голям. По подразбиране числовите променливи са подписани, което означава, че един „бит“ памет за тази променлива се използва за съхраняване дали стойността е положителна или отрицателна. Като посочим, че това ще бъде само положително, имаме още един бит, с който да играем.

Прекъсва

Досега научихме за един начин да подходим към времето в нашата програма Arduino, който е по -добър от забавяне () . Но има и друг, много по -добър начин, но по -сложен: прекъсва . Те имат предимството, че ви позволяват точно да определяте времето на вашата програма Arduino и да реагирате бързо на външен вход, но в асинхронен начин.

Това означава, че тя работи заедно с основната програма, като постоянно чака да се случи събитие, без да прекъсва потока на вашия код. Това ви помага да реагирате ефективно на събития, без това да влияе на производителността на процесора Arduino.

Когато се задейства прекъсване, то или спира програмата, или извиква функция, известна като Манипулатор за прекъсване или an Програма за прекъсване на услугата . След като това е приключило, програмата се връща към това, което е вървяла.

AVR чипът, захранващ Arduino, поддържа само хардуерни прекъсвания. Те възникват, когато входният щифт преминава от високо към ниско или когато се задейства от вградените таймери на Arduino.

Звучи загадъчно. Дори объркващо. Но не е. За да видите как работят и да видите някои примери за тяхното използване в реалния свят, посетете документацията на Arduino .

Не се блокирайте

Използвайки милис () несъмнено отнема малко допълнителна работа в сравнение с използването забавяне () . Но повярвайте ми, вашите програми ще ви благодарят за това и не можете да правите многозадачност на Arduino без него.

Ако искате да видите пример за милис () използвани в реалния проект Arduino, вижте Arduino Night Light и Sunrise Alarm на James Bruce.

Открили ли сте други блокиращи функции, от които трябва да внимаваме? Кажете ми в коментарите по -долу и ще поговорим.

Снимки: Arduino (Даниел Спайс) , Главен (Оли Свенсън)

Дял Дял Туит електронна поща Струва ли си да надстроите до Windows 11?

Windows е преработен. Но достатъчно ли е това, за да ви убеди да преминете от Windows 10 към Windows 11?

Прочетете Напред
Свързани теми
  • Направи си сам
  • Програмиране
  • Arduino
За автора Матю Хюз(386 статии са публикувани)

Матю Хюз е софтуерен разработчик и писател от Ливърпул, Англия. Рядко се среща без чаша силно черно кафе в ръка и абсолютно обожава своя Macbook Pro и фотоапарата си. Можете да прочетете неговия блог на http://www.matthewhughes.co.uk и да го последвате в Twitter в @matthewhughes.

как да използвате spotify като аларма
Още от Матю Хюз

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате