AVR. Навчальний курс. Підпрограми та переривання
Щоб зрозуміло було відразу і на віки наведу абстрактний приклад.Уяви ти прокидаєшся вранці і йдеш вмиватися і чистити зуби. Сам процес вмивання та чищення зубів відпрацьовано вже до автоматизму і нічим не відрізняється від вечірньої процедури. Та й якщо тобі захочеться раптом взяти вмитися серед дня або почистити зуби просто так, то все ти повториш у точно такій же послідовності. Дрібні варіації, звісно не в рахунок. Цілком очевидно, що у твоїх мізках зашиті дві підпрограми: “Чистка зубів ” та “Умивання “. Також і в коді, коли в тебе якась послідовність дій часто повторюється,то її раціональніше винести в підпрограму. Вони жпроцедури, функціями називати їх можна, але це не зовсім коректно. У функцію можна передавати параметри, для передачі параметрів в підпрограму в асемблері механізмів немає, їх доводиться винаходити самостійно. Наприклад, я передаю через регістри, заздалегідь завантаживши туди потрібні значення перед викликом процедури.
Перерив Вони схожі на процедури, але працюють за дещо іншим принципом і мають принципово інше призначення.
Знову умовний приклад. Ти сидиш встромляєш у монітор, читаєш цю статтю, тут дзвінок у двері - апаратне переривання від пристрою двері. Якщо ти не нічиш від воєнкомату чи сусідки яку ти вчора затопив, і в тебе дозволені переривання від пристрою “двері” то ти відірвеш дупу від стільця і підеш у передпокій – вектор переривання, від апаратного пристрою двері. Прийшовши в передпокій, тобто на вектор переривання, відбувається перехід до оброблювача переривання, тобто ми вже врубаємо, якийсь заздалегідь записаний алгоритм, що визначає що зробити: відкрити двері, обматерити тих хто за дверима, відкрити і обматерити, викликати міліцію,викликати дурню. Та що завгодно.
Пріоритети переривань. Уяви ти ламанувся відчиняти двері, а тобі прийшло друге апаратне переривання - захотілося погадати. З одного боку важливо і те, й інше. З іншого боку в туалет можна і потерпіти, а ось гість може й звалити. Так що заздалегідь вишиковуються пріоритети переривань і спочатку приймаємо гостя, а потім йдемо гадити. З іншого боку можна прийняти гостя, а потім днище як зірве і станеться великий конфуз. Тож треба дуже ретельно підходити до процесу вибору пріоритетів.
Головне пам'ятати те, що відкладене переривання нікуди не подінеться, і як тільки процесор звільниться, то піде виконувати його. Алейого можна скасувати вручну, скинувши прапорний біт, що відповідає за виклик переривання.
Для цих цілейAVR є зручний прапорТ у регістріSREG. Він нізащо не відповідає і зроблено для цілей користувача, тобто. для вільного користування.
А тепер фактичний матеріал.Белетристика закінчилася, принцип зрозумілий, розповім як усе це реалізовано.
Повернення з процедури здійснюється командоюRET
У коді це виглядає так:
Далі буде присвячено Лохову С.П. - Нашому викладачеві асемблера. У якого на лекціях від іржача валялися всі, але лише ті, хто до цього знав асемблер, розумів про що він говорить взагалі! До нього на пари ходили виключно поржати.