• Interrupt class 정리
  • Timer & Keyboard 인터럽트로 처리하기

Interrupt Class

pub struct Interrupt {
    id: u32,
    trigger: Trigger,
    prio: u8,
    name: &'static str,
    handler: Handler,
}

각 Interrupt는 위와 같이 id, trigger, 우선순위, 이름, 핸들러의 정보를 가지고 있다.

  • Trigger: Edge Trigger / Level Trigger
  • 우선순위: 0x00(highest) ~ 0xff(lowest)

위와 같은 Interrupt Instance들을 INTERRUPTS 배열에 저장해두어, Interrupt Handling시에 이를 참조한다.

Timer Interrupt Handler

fn timer_handler() {
	// Concludes Timer Interrupt
	CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR);
	
	// (Optional) Set New TVAL
	CNTP_TVAL_EL0.set(target);
	
	// Enable Timer
	CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::CLEAR);
}

CVAL 혹은 TVAL 조건이 만족되어 Timer Interrupt가 발생하면 Interrupt를 Clear 해주고, 새로운 CVAL 혹은 TVAL을 선언해야 한다면 선언 후, 다시 타이머를 작동시키는 과정으로 진행된다.