Mishel 0 8 марта, 2006 Опубликовано 8 марта, 2006 · Жалоба Сколько я ни читаю даташит, но до конца так и не понял: что происходит, если во время отработки прерывания (до сброса флага прерывания, например TMR0IF - на F877) возникают условия для нового прерывания (другой природы, например CMIF). В "Справочнике по среднему семейству..." с микрочип.ру, на странице 106 (по нумерации acrobat) есть упоминания об "отложенных" и "ожидающих" прерываниях: "Возврат из обработки прерываний выполняется по команде RETFIE, пои этом происходит установка бита GIE в '1', что позволяет обработать любое ОТЛОЖЕННОЕ ПРЕРЫВАНИЕ". "Примечание 2. При выполнении команды, сбрасывающей бит GIE в '0', любое прерывание, ОЖИДАЮЩЕЕ выполнения в следующем машинном цикле, игнорируется. ... Игнорированные прерывания ставятся в ОЖИДАНИЕ выполнения, пока бит GIE не будет установлен в '1'". Однако на этом описание данного вопроса и заканчивается. В официальных даташитах на английском - ещё меньше. Я уже понял, что процедура прерывания не может быть прервана другим прерыванием. Но существует ли очередь отложенных прерываний - хз. В принципе незнание данной тонкости не мешает мне писать на "бытовом" уровне, и оно работает, но хотелось бы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miga 0 8 марта, 2006 Опубликовано 8 марта, 2006 · Жалоба существует ли очередь отложенных прерываний Очереди как таковой не существует - есть лишь механизм флажков прерываний, другими словами, если флажок како-либо прерывания оказался взведен, невозможно определить сколько раз возникало условие прерывания, соответствующее этому флажку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*Leks* 0 9 марта, 2006 Опубликовано 9 марта, 2006 · Жалоба В начале обработки прерывания надо запретить прерывания и сбросить флаг, вызвавший прерывание. Разрешить новое прерывание нужно только при выходе из обработки. Теперь при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miga 0 10 марта, 2006 Опубликовано 10 марта, 2006 · Жалоба В начале обработки прерывания надо запретить прерывания ... Разрешить новое прерывание нужно только при выходе из обработки. Собственно говоря, все это делается автоматически - никаких дополнительных манипуляций с GIE делать не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mishel 0 11 марта, 2006 Опубликовано 11 марта, 2006 · Жалоба miga писал: Очереди как таковой не существует - есть лишь механизм флажков прерываний *Leks* писал: при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным. При этом 1) Будет поднят флаг прерывания, и возможно, обработан и сброшен в том же проходе процедуры; 2) Если по выходе из процедуры прерывания обнаруживается поднятый флаг, процедура автоматически будет запущена снова. Я правильно понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость LordN 11 марта, 2006 Опубликовано 11 марта, 2006 (изменено) · Жалоба Я правильно понимаю?да.Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным.не останется, его заметят и обработают обязательно если включены соответсвующие флаги. Изменено 11 марта, 2006 пользователем LordN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kojevnikov 0 17 марта, 2006 Опубликовано 17 марта, 2006 · Жалоба Флажки прерывания тут не при чем они только для информации произошло прерывание или нет. Для тебя. Программу необходимо строить так чтоб в процедуре прерывания находится как можно меньше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alich 0 29 марта, 2006 Опубликовано 29 марта, 2006 · Жалоба Тут просто надо понимать команду RETFIE - как возврат из подпрограммы с разрешением прерываний. И все встанет на свои места Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bzx 0 29 марта, 2006 Опубликовано 29 марта, 2006 · Жалоба Пример построения обработчика прерывания. org 0x04 ; Сохранение контекста системных регистров STATUS, W, FSR и пр. ; если регистры не используются при обработки системных прерываний, ; то их можно и не сохранять movwf w_temp movfw STATUS movwf status_temp movfw FSR movwf FSR_temp .... ; Анализ того, кем вызвано прерывание btfsc INTCON,T0IF goto InterruptT0; Прерывание T0 btfsc INTCON,RAIF goto Change_Interrupt; Прерывание по изменению состояния btfsc PIR1,C1IF goto InterruptComparator; Прерывание компаратора ...... ; и т.д. InterruptT0: ... InterruptComparator: ... ; Выход из обработчика прерываний ; Востановление контекста системных регистров Interrupt_exit: clrwdt movfw FSR_temp movwf FSR movfw status_temp movwf STATUS swapf w_temp,f swapf w_temp,w retfie Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mishel 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба bzx писал: Пример построения обработчика прерывания... Благодарю, но я таки предпочитаю писать на сях, ибо время-деньги. Спасибо всем за потраченное время. Кажется, у меня появилась некая ясность в данном вопросе. Дальше разберёмся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться