- 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을 선언해야 한다면 선언 후, 다시 타이머를 작동시키는 과정으로 진행된다.