Свежие обсуждения
Микроконтроллеры

Интересный вход в прерывание у ПИКа

1 3 4

Я пробовал делать прерывание в прерывании, не получилось. Как делал и почему не получилось не помню, давно было.

 

Vladikas: Я пробовал делать прерывание в прерывании, не получилось
правильно. Пока не выйдеш из прерывания, все остальные складываются в очередь и выполняются по очереди после выхода из текущего.

 

DDR:
не возникнет ситуации
Почему же? Скидывается только флаг вызвавшего события. Остальные-то остаются.

Алгоритм прерывания в прерывании, по-моему, должен быть примерно таким:
1. Проверяем источник прерывания, и переходим на ПП его обработки, в которой (в каждом варианте):
2. Сохраняем необходимые регистры.
3. Сбрасываем флаг вызвавшего события.
4. Глобальное разрешение прерываний.
5. Непосредственно сам обработчик.
6. Восстановление сохранённых регистров.
7. Выход (RETFIE)

Сам не пробовал, но вроде должно работать.
Поправьте, если не так.

 

Gregory: Поправьте, если не так.
если в момент времени между п4 и п5 возникнет новый источник прерывания- контроллер до обработки п5 так и не дойдет, а перезагрузит счетчик вектором прерывания 004h и следовательно это прерывание так и останется необработанным. Нельзя при обработке прерывания подымать флаг разрешения общего прерывания. Разработчик специально предусмотрел сброс флага GIE для того, чтобы организовать очередь в обработке прерываний.

 

DDR:
это прерывание так и останется необработанным
Да почему же?
Оно просто прервётся, и начнётся обработка нового прерывания. По окончании которой будет возврат по стеку в прерванную.

 

немного запамятовал
GIE аппаратно сбрасывается при переходе на прерывание и аппаратно устанавливается при выходе по RETFIE
программный сброс бита желателно сделать если на подпрограмму прерывания переходить через CALL

 

AnSi:
переходить через CALL
Ну, это вроде тогда и не прерывание получается.

аппаратно устанавливается при выходе по RETFIE
Вобще-то это, вроде, как софтово. Просто для RETFIE, как бы "два в одном флаконе".
Поэтому в приведённом мной алгоритме, можно выходить обычным RETURN, поскольку GIE уже поднят ранее.

 

так можно сказать что и "флаги" устанавливаются программно, после выполнения некоторых команд
я цитировал даташит
в принципе все команды аппаратные и RETFIE не исключение

 

Gregory: По окончании которой будет возврат по стеку в прерванную.
да, согласен, как то не учел этот момент.

 

Не стоит, имхо, на pic стеком злоупотреблять. можно оверфлоу легко словить.