knyaz* писал(а):Ну как то так, если в чем то не прав поправьте.
Для программирования на ЯВУ может и достаточно такого объяснения.Но лучше понимать аппаратную реализацию работу прерываний.
Собственно тут уже все написали, но и я напишу. По большому счету повторюсь, что уже написано.
•контроллер не знает и не будет знать какую часть программы выполняет, основной ли это цикл или обработчик прерывания. Ему все равно, берет очередную инструкцию на которую указывает счетчик программ и выполняет.
•флаг события при возникновении соответствующего события устанавливается всегда, вне зависимости он настроек МК, разве что соответствующий модуль периферии должен быть включен.
•прерывание возникнет если установлены флаг события, ему соответствующая маска разрешения прерывания и разрешены прерывания глобально. Как только собралась данная комбинация из трех битов, само собой после завершения инструкции которую выполнял,контроллер тут же:
.....сохраняет на стек адрес инструкции которую МК хотел выполнить следующей, если бы не возникло прерывание и уменьшает указатель стека на размер адреса ;
.....запрещает прерывания глобально и в большинстве случаев сбрасывает соответствующий флаг события(в зависимости от вектора прерывания);
.....загружает в программный счетчик адрес вектора прерывания и выбирает оттуда инструкцию, как правило там лежит инструкция безусловного перехода на обработчик прерывания.
.... все это он делает одновременно и если не ошибаюсь, то за 7 тактов (точно не помню)....
.... после этой "встряски" так же весело выполняет инструкции из памяти программ, только уже из другого участка памяти программ и абсолютно "не задумываясь" что куда-то перепрыгнул.
•Весело добежав до инструкции RETI (если такая будет), загрузит программный счетчик со стека адрес возврата, указатель стека вернется как былО, включится разрешение глобальных прерываний. Т.е. по факту вернется к месту, откуда прервался.
Тут кончено лучше на ассме попрогать немного, чтобы прочувствовать как это.