-
Notifications
You must be signed in to change notification settings - Fork 176
Open
@AdinAck
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