2 Михаил Е с прошлой страницы
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ShiphT 21 мая 2004 г. 10:22

Вот как раз это и не имеет отношения к повторному вызову прерывания. Это говорит лишь о том, что флаг (не маска!) прерывания, устанновленный по факту запроса прерывания и вынуждающий процессор перейти к обработке этого события аппаратно сбрасывается как только PC будет указывать на вектор. Пример:
Возьмем модуль Timer0 (jy вроди как почти во всех одинаковый). Прерывание управляется двумя регистрами - TIMSK (Timer Interrupt Mask Register) и TIFR (Timer Interrupt Flag Register). В регистре TIMSK ставим бит TOIE0, разрешая тем самым прерывание по переполнению этого таймера. Бит TOV0 в регистре TIFR остается сброшен. Как только переполняется счетчик таймера, бит TOV0 (!) в регистре TIFR (!) устанавливается в значение 1, говоря процессору что поступило прерывание и его необходимо обработать. Процессор по окончании выполнения текущей команды и в случае если разрешено это прерывание (бит TOIE0 в регистре TIMSK) и глобальные прерывания (бит I регистра SREG) то текущий адрес PC заносится в стек как адрес возврата, а в PC грузится адрес вектора прерывания, сбрасывается бит разрешения глобальных прерываний и бит вызвавший данное прерывание. Этим битом является бит TOV0 регистра TIFR. И именно про него сказано "соответствующий флаг, вызвавший прерывание, аппаратно очищается.".
Таким образом, если находясь в прерывании мы разрешим глобальные прерывания (бит I в SREG) и дождемся переполнения счетчика TCNT0 таймера 0, то опять выставится бит TOV0 регистра TIFR и процессор заново вызовет обработчик этого же прерывания потому что бит TOIE0 в регистре TIMK никто(!!!) не сбрасывал. Для исключения этой ситуации необходимо сбросить данный бит и установить его заново перед возвратом из прерывания, но только(!) после того как вручную сбросить флаг I регистра SREG. Это необходимо для того, что бы если у нас вдруг снова возникло условие вызова данного прерывания, то оно было бы вызвано только после выхода из текущего обработчика во избежание вложенности одного и того же прерывания. Т.к. если оно смогло вызваться второй раз, то может и в третий, четвертый и т.д. А стек не резиновый и, как следствие, всевозможные глюки.


PS: Так что неправда все-таки Ваша =)))).

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru