Перейти к содержанию
    

Отложенные прерывания на PIC16

Сколько я ни читаю даташит, но до конца так и не понял: что происходит, если во время отработки прерывания (до сброса флага прерывания, например TMR0IF - на F877) возникают условия для нового прерывания (другой природы, например CMIF).

В "Справочнике по среднему семейству..." с микрочип.ру, на странице 106 (по нумерации acrobat) есть упоминания об "отложенных" и "ожидающих" прерываниях:

"Возврат из обработки прерываний выполняется по команде RETFIE, пои этом происходит установка бита GIE в '1', что позволяет обработать любое ОТЛОЖЕННОЕ ПРЕРЫВАНИЕ".

"Примечание 2. При выполнении команды, сбрасывающей бит GIE в '0', любое прерывание, ОЖИДАЮЩЕЕ выполнения в следующем машинном цикле, игнорируется. ... Игнорированные прерывания ставятся в ОЖИДАНИЕ выполнения, пока бит GIE не будет установлен в '1'".

Однако на этом описание данного вопроса и заканчивается. В официальных даташитах на английском - ещё меньше.

Я уже понял, что процедура прерывания не может быть прервана другим прерыванием. Но существует ли очередь отложенных прерываний - хз.

В принципе незнание данной тонкости не мешает мне писать на "бытовом" уровне, и оно работает, но хотелось бы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

существует ли очередь отложенных прерываний

Очереди как таковой не существует - есть лишь механизм флажков прерываний, другими словами, если флажок како-либо прерывания оказался взведен, невозможно определить сколько раз возникало условие прерывания, соответствующее этому флажку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В начале обработки прерывания надо запретить прерывания и сбросить флаг, вызвавший прерывание. Разрешить новое прерывание нужно только при выходе из обработки. Теперь при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В начале обработки прерывания надо запретить прерывания ...

Разрешить новое прерывание нужно только при выходе из обработки.

Собственно говоря, все это делается автоматически - никаких дополнительных манипуляций с GIE делать не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

miga писал:

Очереди как таковой не существует - есть лишь механизм флажков прерываний

 

*Leks* писал:

при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно

 

Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным.

При этом

1) Будет поднят флаг прерывания, и возможно, обработан и сброшен в том же проходе процедуры;

2) Если по выходе из процедуры прерывания обнаруживается поднятый флаг, процедура автоматически будет запущена снова.

Я правильно понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость LordN
Я правильно понимаю?
да.
Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным.
не останется, его заметят и обработают обязательно если включены соответсвующие флаги.
Изменено пользователем LordN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флажки прерывания тут не при чем они только для информации произошло прерывание или нет. Для тебя. Программу необходимо строить так чтоб в процедуре прерывания находится как можно меньше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут просто надо понимать команду RETFIE - как возврат из подпрограммы с разрешением прерываний. И все встанет на свои места

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример построения обработчика прерывания.

    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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

bzx писал:

Пример построения обработчика прерывания...

 

Благодарю, но я таки предпочитаю писать на сях, ибо время-деньги.

 

Спасибо всем за потраченное время. Кажется, у меня появилась некая ясность в данном вопросе. Дальше разберёмся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...