Эмпирические результаты!
В то время как другие ответы вдумчивы и хорошо аргументированы, они все неполные или просто предположения. Там, где документация неоднозначна, мы должны экспериментировать и проверять каждый случай.
Этот вопрос заслуживает окончательного ответа, поэтому давайте вытащим AVR и начнем устанавливать некоторые биты!
Процедура
Для тестирования я сделал небольшую программу Arduino (ATMEGA328P), которая ...
- установить ISR, который никогда не вернется (
while (1)
)
- назначил ISR источнику, который я мог вызвать в программном обеспечении (
INT0
понижается)
- отключенные прерывания
- включил и вызвал прерывание, так что оно будет в ожидании
Я использовал тестовый стенд, который включал бы светодиод в одной инструкции после включения прерываний. Пробуя разные способы разрешения прерываний в испытательном стенде и проверяя светодиод, я мог определить, была ли выполнена инструкция после инструкции включения или нет.
Если светодиод не загорелся, то я знаю, что ISR выполнялся (и блокировался) сразу после включения прерываний.
Если светодиод загорелся, то я знаю, что следующей инструкции было разрешено выполнить до вызова ISR.
Результаты
SEI
инструкция (базовый вариант)
Код:
sei
Результат: светодиод включен. Следующая инструкция выполнена.
OUT
инструкция
Код:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Результат:
Светодиод включен. Следующая инструкция выполнена.
ST
инструкция
Код:
clr r29 // Clear Y high byte
ldi r28,0x5f // Set Y low byte to point to SREG
ld r16, Y // Get SREG
ori r16,128 // Set I bit
st Y,r16 // Put SREG
Результат:
Светодиод включен. Следующая инструкция выполнена.
Вывод!
В: Ожидание - это функция инструкции SEI или регистра состояния?
A: Похоже, что изменение I
бита в SREG
is с a 0
на a 1
позволит следующей команде выполнить следующую, даже если есть ожидающее прерывание, независимо от того, какая команда используется для установки бита.
Примечания
Это на самом деле превратилось в очень интересный вопрос с множеством осложнений. Если вы заинтересованы в деталях, проверьте ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/