// src/interrupt.rs
pub fn init() {
unsafe {
extern "C" {
fn __alltraps();
stvec::write(__alltraps as usize, stvec::TrapMode::Direct);
// 设置 sstatus 的 SIE 位
sstatus::set_sie();
}
println!("++++ setup interrupt! ++++");
}
让我们来更新 rust_trap
函数来让它能够处理多种不同的中断——当然事到如今也只有三种中断:
- 使用
ebreak
触发的断点中断; - 使用
ecall
触发的系统调用中断; - 时钟中断。
同时修改主函数 rust_main
:
// src/init.rs
#[no_mangle]
pub extern "C" fn rust_main() -> ! {
crate::interrupt::init();
crate::timer::init();
unsafe {
asm!("ebreak"::::"volatile");
}
panic!("end of rust_main");
loop {}
}
我们期望能够同时处理断点中断和时钟中断。断点中断会输出断点地址并返回,接下来就是 panic
,我们 panic
的处理函数定义如下:
最后的结果确实如我们所想:
breakpoint & timer interrupt handling
++++ setup interrupt! ++++
++++ setup timer! ++++
a breakpoint set @0x8020002c
panicked at 'end of rust_main', src/init.rs:11:5
* 100 ticks *
* 100 ticks *
...
如果出现问题的话,可以在这里找到目前的代码。