프로세서는 WFI 명령어에서 일어나하게 세 가지 조건이있다 :
- 비 마스킹 인터럽트가 발생하고, 그 우선 순위는 현재의 실행 우선 순위보다 큰 (즉, 인터럽트 촬영)
- PRIMASK에 의해 마스크 된 인터럽트는 디버그 엔트리 요청 인
- 이 보류 중이됩니다.
WFI 명령어가 실행될 때 웨이크 업 조건 중 하나라도 true이면 NOP (즉, 절전 모드로 전환되지 않음)입니다.
보류중인 인터럽트가 없는지 확인하는 것은 해당 코드를 수행해야하는 코드입니다. 일반적으로 인터럽트 소스가 만족되어 인터럽트 요청을 어서 트하지 않고 필요한 보류 비트를 지우는 것을 의미합니다. 인터럽트 보류중인 레지스터에서 읽음으로써 보류중인 것을 볼 수는 있지만 인터럽트 처리기는 일반적으로 일들을 정지 상태로 두도록 지정됩니다.
대부분의 시스템은 WFI를 실행하기 전후에 일부 작업을 수행해야합니다. 예를 들어, WFI로 수면 모드로 가기로 결정하기 전에 수행해야 할 추가 작업이 있는지 확인하기 위해 수행해야하는 테스트가 있습니다. 그런 다음 WFI의 테스트와 실행은 PRIMASK가 1로 설정된 중요한 섹션에서 수행됩니다 (위의 옵션 2를 수행 중입니다). 이렇게하면 테스트와 WFI 사이에 인터럽트가 발생하지 않고 웨이크 업 후에 인터럽트가 발생하지 않도록 추가 인터럽트가 발생하지 않도록 보장합니다 (일반적으로 클로킹과 관련된). 웨이크 업 후 PRIMASK는 0으로 다시 설정되고 (임계 섹션을 벗어남) 보류중인 인터럽트가 취해집니다.
ARM은 프로세서가 절전 모드로 들어가기 전에 데이터 작업이 완료되도록하기 위해 WFI 직전에 DSB 명령을 실행하도록 권장합니다. 그것은 모든 상황에서 엄격히 필요하지 않을 수도 있지만 상황이 바뀌고 그것을 간과 할 경우를 대비하여 작성하십시오.
매우 완벽한 답변을 해주셔서 감사합니다. 그러나 나는 영어/암 네이티브 스피커가 아닙니다. 그렇다면 마스크 된 (PRIMASK에 의한) 것과 보류중인 인터럽트의 차이점은 무엇입니까? WFI를 중요한 섹션에 두는 것은 처리기가 실행되는 것을 막을 것이지만 인터럽트는 여전히 보류 중입니다. 그렇다면 임계 부분은 사례 2가 WFI를 NOP로 변환하는 것을 어떻게 막을 것입니까? – Julien
WFI가 실행될 때 언급 된 조건 중 하나라도 해당되면 프로세서는 절전 모드로 전환되지 않습니다. 이것은 당신이 원하는 것입니다. 그렇지 않으면 중요한 사건을 놓칠 수도 있습니다. PRIMASK를 1로 설정하는 목적은 WFI 이전에 실행 된 테스트 나 코드가 아무런 방해없이 실행되도록하는 것입니다. 인터럽트는 추가 작업이 필요한지 여부를 결정하는 것이 일반적입니다.이 테스트는 인터럽트 가능성없이 수행되어야합니다. 그러나 테스트가 완료된 후 인터럽트가 보류 상태가되면 WFI는 NOP이며 PRIMASK가 다시 0으로 설정되면 인터럽트가 취해집니다. –