Инструкция AVR SEI ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) ожидает завершения следующей инструкции перед включением прерываний.
Если я использую другую инструкцию для установки флага I в SREG, будет ли это ждать 1 инструкцию?
Другими словами: ожидание - это особенность инструкции SEI или регистра состояния?
Если это особенность инструкции SEI, то в какой момент фактически устанавливается флаг, в цикле, который выполняет SEI или со следующей инструкцией?
avr
interrupts
assembly
Джей Джей
источник
источник
Ответы:
Эмпирические результаты!
В то время как другие ответы вдумчивы и хорошо аргументированы, они все неполные или просто предположения. Там, где документация неоднозначна, мы должны экспериментировать и проверять каждый случай.
Этот вопрос заслуживает окончательного ответа, поэтому давайте вытащим AVR и начнем устанавливать некоторые биты!
Процедура
Для тестирования я сделал небольшую программу Arduino (ATMEGA328P), которая ...
while (1)
)INT0
понижается)Я использовал тестовый стенд, который включал бы светодиод в одной инструкции после включения прерываний. Пробуя разные способы разрешения прерываний в испытательном стенде и проверяя светодиод, я мог определить, была ли выполнена инструкция после инструкции включения или нет.
Если светодиод не загорелся, то я знаю, что ISR выполнялся (и блокировался) сразу после включения прерываний.
Если светодиод загорелся, то я знаю, что следующей инструкции было разрешено выполнить до вызова ISR.
Результаты
SEI
инструкция (базовый вариант)Код:
sei
Результат: светодиод включен. Следующая инструкция выполнена.
OUT
инструкцияКод:
Результат:
Светодиод включен. Следующая инструкция выполнена.
ST
инструкцияКод:
Результат:
Светодиод включен. Следующая инструкция выполнена.
Вывод!
В: Ожидание - это функция инструкции SEI или регистра состояния?
A: Похоже, что изменение
I
бита вSREG
is с a0
на a1
позволит следующей команде выполнить следующую, даже если есть ожидающее прерывание, независимо от того, какая команда используется для установки бита.Примечания
Это на самом деле превратилось в очень интересный вопрос с множеством осложнений. Если вы заинтересованы в деталях, проверьте ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/
источник
sei
Насколько я понимаю из документации, выполнение инструкции ничем не отличается от прямой записи 1 в I бит SREG. Преимущество инструкции в том, что вам не нужно сначала загружать значение1<<I
в рабочий регистр, чтобы изменить SREG, что экономит время.Разработать, используя
sei
:Установка бита с использованием
sbi
(будет работать только в том случае, если SREG находится в младших 32 байтах карты регистров, но, похоже, что на большинстве, если не на всех, это не так.)Пишу я немного в SREG:
I
Бит должен быть установлен в SREG как толькоsei
инструкции (илиsbi
илиout
) Завершает. Однако любые ожидающие прерывания не будут обрабатываться до тех пор, пока не будет выполнена следующая инструкция - бит будет установлен, но для включения прерываний требуется дополнительный цикл. Поскольку прерывание не может быть обработано в середине инструкции, а для выполнения некоторых инструкций требуется более одного цикла, в качестве одной инструкции указывается время, необходимое для включения. Это должно иметь место для всех версий кода - то есть каждая из вышеупомянутых причин приведет к задержке инструкции.После небольшого поиска я нашел эту ветку на форуме Arduino, в которой было проведено несколько различных тестов для проверки поведения. Кажется, согласен с тем, что я сказал выше.
Кроме того, согласно этому потоку, если
I
флаг уже установлен, то отсроченный отклик прерывания не вызывается, изsei
чего следует, что отсроченный отклик вызван не самой инструкцией, а скорее во внутреннем оборудовании, контролируемомI
флагом - поэтому любая операция , которая изменяет флаг в SREG, будь тоsei
илиout
илиsts
будет иметь точно такое же поведение.источник
SBI
этотI
бит не может использоваться для установки бита,SREG
поэтому любой код, который делает это, скорее всего, на самом деле не тестировался в реальной жизни, потому что он даже не будет собираться.SBI
может работать только на нижних 32 регистрах, а SREG находится в слоте 63.out
тот, который я использовал изначально. Я думал, что я столкнусь с AVR (может быть ATTiny), который имеет SREG в нижних 32 регистрах, но я могу себе это представить.ИМХО делает запись в SREG все еще с задержкой 1 инструкция может быть проверена так (псевдокод):
К сожалению, мне не хватает времени, чтобы сделать это :(
источник
Это не то, что он говорит. Документация говорит
не то чтобы он ждал следующей инструкции. Я прочитал это, поскольку флаг установлен немедленно, но даже если он включен, никакие прерывания не будут обрабатываться до тех пор, пока не будет выполнена следующая инструкция.
источник