Open
Description
In the cortex-m-rt
docs it recommends PACs create a Vector
type like so:
pub union Vector {
handler: unsafe extern "C" fn(),
reserved: usize,
}
and this is exactly what PACs do. I'm curious why it is like this? The reserved
variant being typed as usize
when it should always be 0
and constructed like:
Vector { reserved: 0 }
is very odd to me.
Why not define Vector
like this:
pub struct Vector(#[allow(unused)] *const ());
impl Vector {
/// Create a vector with the provided function pointer.
pub const fn handler(f: unsafe extern "C" fn()) -> Self {
Self(f as _)
}
/// Create a vector that is reserved.
pub const fn reserved() -> Self {
Self(core::ptr::null())
}
}
and use it like this:
pub static __INTERRUPTS: [Vector; 2] = [
Vector::handler(Foo),
Vector::reserved(),
];
and why is this type not provided by cortex-m-rt
so PACs don't have to redefine it every time?
I imagine there is some low-level issue with representing the function pointer as a unit pointer that I don't know of.
I am currently using my proposed Vector
implementation and it does work, I'm just not sure if it is correct.
Thanks!
Metadata
Metadata
Assignees
Labels
No labels