Мултитаскинг и прекъсване на Ардуино, robotosha

Мултитаскинг и прекъсване на Ардуино

Мултитаскинг и прекъсване на Ардуино, robotosha

Какво е за прекъсване?

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

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

Прекъсвания могат да бъдат получени от различни източници:

  • Един от таймера Arduino. формиране на таймер прекъсване;
  • Промяна на състоянието на един от външния вход за прекъсване;
  • Промяната в състояние на една от групите на щифтове.

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

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

Таймер прекъсва Arduino

Таймер и таймер прекъсне ни даде възможност да направите точно това. Можем да зададете таймер, за да ни прекъсне веднъж за милисекунда. Таймерът ще, в действителност, за да ни каже, че е време да се провери часовника!

Arduino има три таймери: Timer0. Таймер 1 и таймер 2. Timer0 вече конфигуриран за генериране милисекунда прекъсване, актуализиране контра милисекунди предават в милисекунди (). Това е точно това, от което имаме нужда!

Таймери - прост брояч, който отброява с определена честота, получена от 16MHz система. Ние можем да конфигурирате честота разделител за производство на желаната честота и различните видове сметки. Можем също така да ги персонализирате, за да се генерира прекъсване, когато таймерът достигне някои предварително зададени стойности.

Timer0 е 8-битов, брои 0-255, и генерира прекъсване при препълване (над стойността на 255). Той използва часовник разделител 64 по подразбиране, за да ни даде възможност да 976.5625 Hz прекъсване честота (достатъчно близо до 1 кХц, за нашите цели). Ние няма да се промени честотата на Timer0, защото това е точно нарушава милисекунди (), за да работят!

сравни регистри

В регистрите на сравнението се съхраняват данни, които са постоянно в сравнение със състоянието на брояч / таймер. Създаване на регистър за сравнение (OCR0A) за генериране на ново спиране някъде в средата на отчитане. Кодът по-долу TIMER0_COMPA ще генерира прекъсване, когато стойността на брояча преминава 0xAF.

Библиотека за работа с прекъсвания

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

Отличното библиотеката и TimerOne TimerThree от Пол Stoffregan предоставя много функции, от ниско ниво за конфигуриране на таймер прекъсване. TimerThree библиотека не работи на ООН Arduino. Тя може да се използва с Леонардо. Мега 2560 и някои съвети ситната.

Arduino UNO има само две външни входове за прекъсвания. Но какво, ако искате повече от два входа? За щастие Arduino UNO поддържа прекъсване «ПИН-смяна» (за да настроите записа) за всички щифтове.

Прекъсване вход промяна - това е същата като на външно прекъсване. Разликата е, че първите се генерира от промяна на състоянието на някое от съответния пин 8. Те са малко по-трудно да се справят, тъй като трябва да се следи от последната известна състоянието на всички 8 пина, за да разберете кои от щифта 8 причинило прекъсване.

PinChangeInt библиотека изпълнява лесен за употреба интерфейс, за да се прекъсне входа на климата.

Правила за работа с прекъсвания

За да може всичко да работи гладко, най-добре е да се използва не повече от 10 различни прекъсвания.

Ако всичко е с по-висок приоритет, а след това на висок приоритет не се яви, че

Прекъсване товарачи трябва да се използват само за приоритет преработка, чувствителни към времето на събития. Не забравяйте, че прекъсва са деактивирани, докато сте в прекъсне треньор. Ако се опитате да направите твърде много на прекъсване ниво, можете да получите по-лошо отговор на други прекъсва.

Едно прекъсване във всеки един момент

Когато програмата е в прекъсване функция, другите прекъсва са с увреждания. Това има две важни последици:

  • Проучванията на функциите за обработка на прекъсване трябва да бъде кратък, така че да не пропуснете повече от едно прекъсване.
  • Код работи в прекъсват функции за обработка не трябва да предизвиква нещо, което би изисквало, че прекъсването е активен (например, забавяне (). Или нещо, което използва в автобуса аз 2 C). Тя ще се срине на програмата.

Сложете дълго контурна обработка ()

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

Проверете преди преконфигуриране на таймер

Таймери са ограничен ресурс. На Arduino UNO са само 3, и те се използват за много неща. Ако нещо се обърка с конфигурацията на таймер, някои неща не могат да работят. Например, в ООН Arduino:

Безопасно споделяне на данни

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

Понякога, компилаторът ще се опитат да оптимизират кода си за подобряване на производителността. Понякога, в резултат на тази оптимизация, копия от често използваните променливи ще се съхраняват в регистър, за да имате бърз достъп до тях. Проблемът е, че ако една от тези променливи се споделя от прекъсващият и кода в течение (). След това, в края на краищата, тя може да се появи остаряла копие вместо на реалните стойности. Маркиране на променлива като voltatile казва на компилатора, че не е необходимо да се произвеждат тези потенциално опасно оптимизация.

Дори маркиране променлива като летливи няма да бъде достатъчно, ако променливата е по-голяма от цяло число (например, низ, масив, структура и т.н.). Още променливи irebuetsya няколко цикъла на инструкциите за актуализация и ако възникне необходимост от прекъсване в средата на тази актуализация на данните може да се повредят. Ако имате повече променливи или структури, които са споделени с прекъсване манипулатор, трябва да забраните прекъсва, когато го ъпгрейд от контур (). Имайте предвид, че прекъсва са деактивирани в прекъсващият вече е по подразбиране.

Как оценявате тази публикация? (57 гласа, средна оценка: 4.86 от 5)

Повече по тази тема