mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-27 14:04:56 +01:00
make task.$T.path mandatory
This commit is contained in:
parent
d396da5950
commit
b9f50e432e
2 changed files with 32 additions and 58 deletions
|
@ -49,7 +49,7 @@ pub enum Kind {
|
||||||
|
|
||||||
pub struct Task {
|
pub struct Task {
|
||||||
pub kind: Kind,
|
pub kind: Kind,
|
||||||
pub path: Option<Path>,
|
pub path: Path,
|
||||||
pub priority: u8,
|
pub priority: u8,
|
||||||
pub resources: Idents,
|
pub resources: Idents,
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ fn task(name: &str, task: syntax::check::Task) -> Result<Task> {
|
||||||
|
|
||||||
Ok(Task {
|
Ok(Task {
|
||||||
kind,
|
kind,
|
||||||
path: task.path,
|
path: task.path.ok_or("`path` field is missing")?,
|
||||||
priority: task.priority.unwrap_or(1),
|
priority: task.priority.unwrap_or(1),
|
||||||
resources: task.resources,
|
resources: task.resources,
|
||||||
})
|
})
|
||||||
|
|
|
@ -603,67 +603,41 @@ fn tasks(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(path) = task.path.as_ref() {
|
let mut tys = vec![];
|
||||||
let mut tys = vec![];
|
let mut exprs = vec![];
|
||||||
let mut exprs = vec![];
|
|
||||||
|
|
||||||
let priority = task.priority;
|
|
||||||
if needs_threshold {
|
|
||||||
tys.push(quote!(&mut #krate::Threshold));
|
|
||||||
exprs.push(quote! {
|
|
||||||
&mut if #priority == 1 << #device::NVIC_PRIO_BITS {
|
|
||||||
#krate::Threshold::new(::core::u8::MAX)
|
|
||||||
} else {
|
|
||||||
#krate::Threshold::new(#priority)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if has_resources {
|
|
||||||
tys.push(quote!(#name::Resources));
|
|
||||||
exprs.push(quote!(#name::Resources::new()));
|
|
||||||
}
|
|
||||||
|
|
||||||
let _name = Ident::new(format!("_{}", name));
|
|
||||||
let export_name =
|
|
||||||
Lit::Str(name.as_ref().to_owned(), StrStyle::Cooked);
|
|
||||||
root.push(quote! {
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
#[allow(unsafe_code)]
|
|
||||||
#[export_name = #export_name]
|
|
||||||
pub unsafe extern "C" fn #_name() {
|
|
||||||
let f: fn(#(#tys,)*) = #path;
|
|
||||||
|
|
||||||
f(#(#exprs,)*)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if !has_resources {
|
|
||||||
items.push(quote! {
|
|
||||||
pub struct Resources {
|
|
||||||
_0: (),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Resources {
|
|
||||||
pub unsafe fn new() -> Self {
|
|
||||||
Resources { _0: () }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// the `task!` macro will be used so the `#NAME::Resources` type
|
|
||||||
// must exist
|
|
||||||
}
|
|
||||||
|
|
||||||
let priority = task.priority;
|
let priority = task.priority;
|
||||||
if task.path.is_none() {
|
if needs_threshold {
|
||||||
// This `const`ant is mainly used to make sure the user doesn't
|
tys.push(quote!(&mut #krate::Threshold));
|
||||||
// forget to set a task handler using the `task!` macro. They'll get
|
exprs.push(quote! {
|
||||||
// an error if they do.
|
&mut if #priority == 1 << #device::NVIC_PRIO_BITS {
|
||||||
items.push(quote! {
|
#krate::Threshold::new(::core::u8::MAX)
|
||||||
#[deny(dead_code)]
|
} else {
|
||||||
pub const #name: u8 = #priority;
|
#krate::Threshold::new(#priority)
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if has_resources {
|
||||||
|
tys.push(quote!(#name::Resources));
|
||||||
|
exprs.push(quote!(#name::Resources::new()));
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = &task.path;
|
||||||
|
let _name = Ident::new(format!("_{}", name));
|
||||||
|
let export_name =
|
||||||
|
Lit::Str(name.as_ref().to_owned(), StrStyle::Cooked);
|
||||||
|
root.push(quote! {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
#[export_name = #export_name]
|
||||||
|
pub unsafe extern "C" fn #_name() {
|
||||||
|
let f: fn(#(#tys,)*) = #path;
|
||||||
|
|
||||||
|
f(#(#exprs,)*)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
root.push(quote!{
|
root.push(quote!{
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
|
Loading…
Reference in a new issue