mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-27 14:04:56 +01:00
refactor: make binds
harder to misuse
This commit is contained in:
parent
2fd6ae69d1
commit
8eccef7d9c
3 changed files with 16 additions and 21 deletions
|
@ -106,12 +106,8 @@ pub fn app(app: &App) -> parse::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that free interrupts are not being used
|
// Check that free interrupts are not being used
|
||||||
for (name, interrupt) in &app.interrupts {
|
for (handler, interrupt) in &app.interrupts {
|
||||||
let name = if let Some(ref binds) = interrupt.args.binds {
|
let name = interrupt.args.binds(handler);
|
||||||
binds
|
|
||||||
} else {
|
|
||||||
name
|
|
||||||
};
|
|
||||||
|
|
||||||
if app.free_interrupts.contains_key(name) {
|
if app.free_interrupts.contains_key(name) {
|
||||||
return Err(parse::Error::new(
|
return Err(parse::Error::new(
|
||||||
|
|
|
@ -468,12 +468,8 @@ fn post_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Tok
|
||||||
// the device into compile errors
|
// the device into compile errors
|
||||||
let device = &app.args.device;
|
let device = &app.args.device;
|
||||||
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
|
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
|
||||||
for (name, exception) in &app.exceptions {
|
for (handler, exception) in &app.exceptions {
|
||||||
let name = if let Some(ref binds) = exception.args.binds {
|
let name = exception.args.binds(handler);
|
||||||
binds
|
|
||||||
} else {
|
|
||||||
name
|
|
||||||
};
|
|
||||||
let priority = exception.args.priority;
|
let priority = exception.args.priority;
|
||||||
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits))));
|
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits))));
|
||||||
exprs.push(quote!(p.SCB.set_priority(
|
exprs.push(quote!(p.SCB.set_priority(
|
||||||
|
@ -1128,7 +1124,7 @@ fn exceptions(ctxt: &mut Context, app: &App, analysis: &Analysis) -> Vec<proc_ma
|
||||||
};
|
};
|
||||||
|
|
||||||
let locals = mk_locals(&exception.statics, false);
|
let locals = mk_locals(&exception.statics, false);
|
||||||
let symbol = exception.args.binds.as_ref().unwrap_or(ident).to_string();
|
let symbol = exception.args.binds(ident).to_string();
|
||||||
let alias = ctxt.ident_gen.mk_ident(None, false);
|
let alias = ctxt.ident_gen.mk_ident(None, false);
|
||||||
let unsafety = &exception.unsafety;
|
let unsafety = &exception.unsafety;
|
||||||
quote!(
|
quote!(
|
||||||
|
@ -1214,7 +1210,7 @@ fn interrupts(
|
||||||
|
|
||||||
let locals = mk_locals(&interrupt.statics, false);
|
let locals = mk_locals(&interrupt.statics, false);
|
||||||
let alias = ctxt.ident_gen.mk_ident(None, false);
|
let alias = ctxt.ident_gen.mk_ident(None, false);
|
||||||
let symbol = interrupt.args.binds.as_ref().unwrap_or(ident).to_string();
|
let symbol = interrupt.args.binds(ident).to_string();
|
||||||
let unsafety = &interrupt.unsafety;
|
let unsafety = &interrupt.unsafety;
|
||||||
scoped.push(quote!(
|
scoped.push(quote!(
|
||||||
// unsafe trampoline to deter end-users from calling this non-reentrant function
|
// unsafe trampoline to deter end-users from calling this non-reentrant function
|
||||||
|
@ -1997,12 +1993,8 @@ fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Toke
|
||||||
// the device into compile errors
|
// the device into compile errors
|
||||||
let device = &app.args.device;
|
let device = &app.args.device;
|
||||||
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
|
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
|
||||||
for (name, interrupt) in &app.interrupts {
|
for (handler, interrupt) in &app.interrupts {
|
||||||
let name = if let Some(ref binds) = interrupt.args.binds {
|
let name = interrupt.args.binds(handler);
|
||||||
binds
|
|
||||||
} else {
|
|
||||||
name
|
|
||||||
};
|
|
||||||
let priority = interrupt.args.priority;
|
let priority = interrupt.args.priority;
|
||||||
exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);));
|
exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);));
|
||||||
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));));
|
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));));
|
||||||
|
|
|
@ -731,13 +731,20 @@ pub struct Exception {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ExceptionArgs {
|
pub struct ExceptionArgs {
|
||||||
pub binds: Option<Ident>,
|
binds: Option<Ident>,
|
||||||
pub priority: u8,
|
pub priority: u8,
|
||||||
pub resources: Idents,
|
pub resources: Idents,
|
||||||
pub schedule: Idents,
|
pub schedule: Idents,
|
||||||
pub spawn: Idents,
|
pub spawn: Idents,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ExceptionArgs {
|
||||||
|
/// Returns the name of the exception / interrupt this handler binds to
|
||||||
|
pub fn binds<'a>(&'a self, handler: &'a Ident) -> &'a Ident {
|
||||||
|
self.binds.as_ref().unwrap_or(handler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Parse for ExceptionArgs {
|
impl Parse for ExceptionArgs {
|
||||||
fn parse(input: ParseStream<'_>) -> parse::Result<Self> {
|
fn parse(input: ParseStream<'_>) -> parse::Result<Self> {
|
||||||
parse_args(input, /* binds */ true, /* capacity */ false).map(
|
parse_args(input, /* binds */ true, /* capacity */ false).map(
|
||||||
|
|
Loading…
Reference in a new issue