#[derive(Clone, Copy)]
union Vector {
handler: extern "C" fn(),
reserved: usize,
}
#[repr(C, align(256))]
pub struct VectorTable {
table: [Vector; 48],
}
impl VectorTable {
pub const fn new() -> VectorTable {
VectorTable {
table: [Vector { reserved: 0 }; 48],
}
}
pub fn init(&mut self, ppb: &mut pac::PPB) {
let vector_table = ppb.vtor.read().bits();
unsafe {
crate::rom_data::memcpy44(
&mut self.table as *mut _ as *mut u32,
vector_table as *const u32,
192,
)
};
}
pub fn register_handler(&mut self, interrupt_idx: usize, interrupt_fn: extern "C" fn()) {
self.table[16 + interrupt_idx].handler = interrupt_fn;
}
pub unsafe fn set_sp(&mut self, stack_pointer_address: usize) {
self.table[0].reserved = stack_pointer_address;
}
pub unsafe fn set_entry(&mut self, entry_address: usize) {
self.table[1].reserved = entry_address;
}
pub unsafe fn activate(&mut self, ppb: &mut pac::PPB) {
ppb.vtor
.write(|w| w.bits(&mut self.table as *mut _ as *mut u32 as u32));
}
}