Что произойдет, если я отключу прерывание внутри его ISR?
Что произойдет, если вы отключите прерывание внутри ISR этого прерывания?
Например, если я передаю данные через USART из буфера, и в этом буфере заканчиваются данные, я хочу временно прекратить передачу, поэтому после отправки последнего байта в буфер я отключаю прерывание.
(Это на PIC18F4580)
Лист данных для PIC18F4580 гласит, что "непредсказуемое поведение может возникнуть", если прерывание отключено внутри ISR.
3 ответа
Отказ от ответственности: здесь речь идет о PIC32 и опыте dsPIC в сочетании с тем, что я прочитал из таблицы данных PIC18F4580 и ошибок ( ссылки на PIC18F4580).
Согласно разделу прерываний таблицы данных PIC18F4580:
Не используйте инструкцию MOVFF для изменения любого из регистров управления прерываниями, пока любое прерывание разрешено. Это может привести к нестабильному поведению микроконтроллера.
Таким образом, чтобы получить это неизвестное поведение, вам нужно изменить регистр INTCONx. Поскольку вы указали, что хотите включить разрешение прерывания для модуля USART внутри обработчика, вам не нужно беспокоиться об этом предупреждении, поскольку вы будете менять PIE, а не INTCONx. Обратите внимание, что регистр PIE поддерживает определенные периферийные прерывания. Существует также общее разрешение прерываний (GIE), которое маскирует ВСЕ маскируемые прерывания в одном кадре. Вы не хотите возиться с этим внутри прерывания, так как оно должно быть обработано для вас автоматически процедурой входа / выхода обработчика (также в регистре INTCON).
Как сказал mjv, маскировка периферийного прерывания USART внутри его обработчика - вполне разумная вещь.
Я не знаю конкретно о PIC18F4580, но, как правило,
нет ничего плохого в отключении прерывания во время его ISR
По сути, это предотвратит повторный вызов ISR (то есть до тех пор, пока прерывание каким-то образом не будет повторно включено), но это не должно влиять на логику ISR, вызывать его завершение или другие странные вещи, о которых можно подумать.
В действительности, возможно, ISR начнут с отключения прерываний, чтобы они не прерывались при обслуживании первого прерывания (и, следовательно, избегали различных проблем с повторным входом за счет возможных пропущенных событий).
Конечно, вам нужно спланировать, как / где прерывание будет повторно включено, если это важно для остальной части вашей программы / логики.
Прерывание прекращается. Но зачем это делать? И есть ли у вас план, когда вы собираетесь снова включить прерывание?
Просто пусть ваш ISR ничего не делает, если нечего делать.