#[derive(Clone, Copy)]
union Vector {
handler: extern "C" fn(),
reserved: usize,
}
#[repr(C, align(128))]
pub struct VectorTable {
table: [Vector; 68],
}
impl Default for VectorTable {
fn default() -> Self {
Self::new()
}
}
impl VectorTable {
pub const fn new() -> VectorTable {
VectorTable {
table: [Vector { reserved: 0 }; 68],
}
}
#[allow(unknown_lints)]
#[allow(clippy::needless_pass_by_ref_mut)]
pub fn init(&mut self, ppb: &mut crate::pac::PPB) {
let mut vector_table = ppb.vtor().read().bits() as *const usize;
for entry in self.table.iter_mut() {
*entry = Vector {
reserved: unsafe { vector_table.read() },
};
unsafe {
vector_table = vector_table.add(1);
}
}
}
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;
}
#[allow(unknown_lints)]
#[allow(clippy::needless_pass_by_ref_mut)]
pub unsafe fn activate(&mut self, ppb: &mut crate::pac::PPB) {
ppb.vtor()
.write(|w| w.bits(&mut self.table as *mut _ as *mut u32 as u32));
}
}