실험 결과!
다른 답변은 사려 깊고 잘 추론되지만 모두 불완전하거나 추측입니다. 문서가 모호한 경우에는 모든 경우를 실험하고 테스트해야합니다.
이 질문은 결정적인 답변이 필요하므로 AVR을 꺼내어 약간의 비트 설정을 시작하십시오!
순서
테스트하기 위해 작은 Arduino (ATMEGA328P) 프로그램을 만들었습니다 ...
- 절대 반환하지 않는 ISR 설정 (
while (1)
)
- 소프트웨어에서 트리거 할 수있는 소스에 ISR 할당 (
INT0
낮음)
- 비활성화 된 인터럽트
- 인터럽트를 활성화하고 트리거하여 보류 중
인터럽트가 활성화 된 후 단일 명령으로 LED를 켜는 테스트 베드를 사용했습니다. 테스트 베드에서 인터럽트를 활성화하고 LED를 확인하는 다른 방법을 시도함으로써 활성화 명령어 이후의 명령어가 실행되었는지 여부를 알 수있었습니다.
LED가 켜지지 않으면 인터럽트가 활성화 된 직후 ISR이 실행 (및 잠금) 된 것입니다.
LED가 켜지면 ISR이 호출되기 전에 다음 명령이 실행될 수 있음을 알고 있습니다.
결과
SEI
교육 (기본 사례)
암호:
sei
결과 : LED가 켜집니다. 다음 명령이 실행되었습니다.
OUT
교수
암호:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
결과:
LED가 켜집니다. 다음 명령이 실행되었습니다.
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
결과:
LED가 켜집니다. 다음 명령이 실행되었습니다.
결론!
Q : 대기는 SEI 명령어 또는 상태 레지스터의 기능입니까?
A : I
비트를 SREG
a에서 a 0
로 변경하면 비트 1
를 설정하는 데 사용되는 명령에 관계없이 보류중인 인터럽트가 있어도 다음 명령을 다음에 실행할 수 있습니다.
노트
이것은 실제로 많은 합병증으로 매우 흥미로운 질문으로 바뀌 었습니다. 당신이 그가 세부 사항에 관심이 있다면, 체크 아웃 ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/