먼저 레벨 센시티브 타입 인터럽트의 상태 머신을 알아 봅시다. 다음 그림은 레벨 센시티브 타입 인터럽트가 상태 머신에서 상태 정보가 어떤 방식으로 바뀌는지 나타냅니다.

그림 16.4 레벨 센시티브 인터럽트의 State Machine 변경 흐름
그림의 가장 왼쪽 부분에 있는 Inactive는 키보드와 터치와 같은 페리페럴에서 인터럽트가 발생하지 않는 상태입니다. 먼저 Inactive에서 pending로 바뀌는 흐름을 알아 봅시다.
‘Inactive’ to ‘pending’
페리페럴이 인터럽트를 유발하지 않으면 상태 머신은 Inactive 상태입니다. 인터럽트가 발생(Assert)되면 GIC가 PE에게 인터럽트가 발생했다는 시그널을 보냅니다. 해당 인터럽트가 활성화됐고 우선 순위 레지스터 보다 우선 순위가 높으면 Inactive에서 pending 상태로 변경됩니다.
‘Pending’ to ‘active and pending’
인터럽트를 PE가 받아 소프트웨어적으로 ICC_IAR0_EL1 or ICC_IAR1_EL1 레지스터의 값을 읽으면 Pending에서 'active and pending' 상태로 바뀝니다. 위에서 소개한 ICC_IAR_EL1 레지스터만 읽으면 PE가 GIC에게 ACK를 전달하는 효과가 있습니다. GIC가 ACK를 받으면 해당 인터럽트의 시그널을 de-asserts합니다.
‘Active’ and ‘pending to active’
페리페럴이 인터럽트 시그널을 de-assert하면 Active and pending 상태에서 active 상태로 바뀝니다. 보통 소프트웨어로 페리페럴에 있는 상태 레지스터(status register)의 값을 써줄 때 이와 같이 상태가 변경됩니다.
‘Active’ to ‘inactive’
PE에서 실행되는 소프트웨어에서 End of Interrupt Registers (EOIRs) 레지스터에 ICC_IAR_EL1 레지스터에서 읽은 인터럽트 아이디(INTID)를 써주면 Active에서 inactive로 상태가 변경됩니다.
CPU interface에서 인터럽트를 PE에 포워딩하면 GIC 인터럽트 핸들러에서 IAR나 EOI 레지스터에 접근해 GIC와 커뮤니케이션합니다. 이 과정에서 레벨 센시티브 타입의 인터럽트의 상태가 어떤 방식으로 변경되는지 머릿 속으로 그리면서 코드를 분석합시다.
최근 덧글