Что произойдет, если я отключу прерывание внутри его ISR? - PullRequest
3 голосов
/ 25 сентября 2010

Что произойдет, если вы отключите прерывание внутри ISR этого прерывания?
Например, если я передаю данные через USART из буфера, и в этом буфере заканчиваются данные, я хочу временно прекратить передачу, поэтому после отправкиПоследний байт в буфере, я отключаю прерывание.

(Это на PIC18F4580)

В паспорте для PIC18F4580 говорится, что «ошибочное поведение может возникнуть», если прерывание отключено внутриISR.

Ответы [ 3 ]

4 голосов
/ 25 сентября 2010

Я не знаю конкретно о PIC18F4580, но как правило ,
нет ничего плохого в отключении прерывания в ISR

По существу это предотвратит повторный вызов ISR снова (то есть до тех пор, пока прерывание не будет каким-то образом повторно включено), но это не должно влиять на логику ISR, вызывать его прерывание или другие странные вещь, о которой можно говорить.
В самом деле, возможно, ISR начнут с отключения прерываний, чтобы они не прервались при обслуживании первого прерывания (и, следовательно, избежали различных проблем с повторным входом за счет возможных пропущенных событий).

Конечно, вам нужно спланировать, как / где прерывание будет повторно включено, если это важно для остальной части вашей программы / логики.

1 голос
/ 16 октября 2010

Отказ от ответственности: Если говорить о PIC32 и опыте dsPIC, то здесь, в сочетании с тем, что я прочитал из таблицы данных PIC18F4580 и ошибок ( Ссылки PIC18F4580 ).

Согласно PIC18F4580секция прерываний таблицы данных:

Не используйте инструкцию MOVFF для изменения любого из регистров управления прерываниями, пока любое прерывание разрешено.Это может привести к ошибочному поведению микроконтроллера.

Таким образом, чтобы получить это неизвестное поведение, вам нужно изменить регистр INTCONx.Поскольку вы указали, что хотите включить разрешение прерывания для модуля USART внутри обработчика, вам не нужно беспокоиться об этом предупреждении, поскольку вы будете менять PIE, а не INTCONx.Обратите внимание, что регистр PIE поддерживает определенные периферийные прерывания.Существует также общее разрешение прерываний (GIE), которое маскирует ALL маскируемые прерывания в одном кадре.Вы не хотите возиться с этим внутри прерывания, так как он должен обрабатываться для вас автоматически процедурой входа / выхода обработчика (также в регистре INTCON).

Так, как сказал mjv, маскировкаПериферийное прерывание USART в его обработчике вполне разумно.

0 голосов
/ 25 сентября 2010

Прерывание прекращается. Но зачем это делать? И есть ли у вас план, когда вы собираетесь снова включить прерывание?

Просто пусть ваш ISR ничего не делает, если нечего делать.

...