23
; Спокойно выходим. Регистры вернул как было.
Как же выносить данные из прерываний? Да по-разному, можно в память
сохранять, можно для этого специальный регистр использовать и знать, что
он может в любой момент измениться в прерывании.
Грабли вторые — не тормози!!!
Прерывания отвлекают процессор от основных дел, более того, они
блокируют другие прерывания. Поэтому в прерывании главное все сделать
максимально быстро и свалить. Никаких циклов задержки, никаких
долгоиграющих процедур. Никаких ожиданий аппаратного события.
СКОРОСТЬ! СКОРОСТЬ! СКОРОСТЬ! Вот что должно тобой руководить
при написании обработчика.
Заскочил — сделал — выскочил!
Но такая красивая схема возможна далеко не всегда. Иногда бывает надо по
прерыванию делать и медленные вещи. Например, приём байтов из
интерфейса и запись их в какую-нибудь медленную память, вроде EEPROM.
Как тогда быть?
А тут делают проще. Цель прерывания — во что бы то ни стало среагировать
на событие именно в тот момент, когда оно пришло, чтобы не прозевать. А
вот обрабатывать его прямо сейчас обычно и не обязательно.
Заскочил в обработчик, схватил быстро тухнущие данные, перекинул их в
буфер где им ничего не угрожает, поставил где-нибудь флажок отметку “мол
там байт обработать надо” и вышел. Все! Остальное пусть сделает фоновая
программа в порядке общей очереди.
Либо, если иначе никак нельзя, разрешай прерывания внутри обработчика, но
смотри чтобы не возникли рекурсивные прерывания, когда один и тот же