Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

backport: "you must enable the rt feature" compile time detection #493

Merged
merged 3 commits into from Jul 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion macros/src/codegen.rs
Expand Up @@ -120,6 +120,7 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {

let name = &app.name;
let device = extra.device;
let rt_err = util::rt_err_ident();
quote!(
#(#user)*

Expand All @@ -139,7 +140,7 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
// the user can't access the items within this `const` item
const #name: () = {
/// Always include the device crate which contains the vector table
use #device as _;
use #device as #rt_err;

#check_excess_cores

Expand Down
5 changes: 3 additions & 2 deletions macros/src/codegen/pre_init.rs
Expand Up @@ -52,6 +52,7 @@ pub fn codegen(
}

let device = extra.device;
let rt_err = util::rt_err_ident();
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);

// unmask interrupts and set their priorities
Expand All @@ -76,14 +77,14 @@ pub fn codegen(
let interrupt = util::interrupt_ident(core, app.args.cores);
stmts.push(quote!(
core.NVIC.set_priority(
#device::#interrupt::#name,
#rt_err::#interrupt::#name,
rtic::export::logical2hw(#priority, #nvic_prio_bits),
);
));

// NOTE unmask the interrupt *after* setting its priority: changing the priority of a pended
// interrupt is implementation defined
stmts.push(quote!(rtic::export::NVIC::unmask(#device::#interrupt::#name);));
stmts.push(quote!(rtic::export::NVIC::unmask(#rt_err::#interrupt::#name);));
}

// cross-spawn barriers: now that priorities have been set and the interrupts have been unmasked
Expand Down
8 changes: 4 additions & 4 deletions macros/src/codegen/spawn_body.rs
Expand Up @@ -10,7 +10,7 @@ pub fn codegen(
name: &Ident,
app: &App,
analysis: &Analysis,
extra: &Extra,
_extra: &Extra,
) -> TokenStream2 {
let sender = spawner.core(app);
let spawnee = &app.software_tasks[name];
Expand Down Expand Up @@ -44,16 +44,16 @@ pub fn codegen(
)
};

let device = extra.device;
let rt_err = util::rt_err_ident();
let enum_ = util::interrupt_ident(receiver, app.args.cores);
let interrupt = &analysis.interrupts[&receiver][&priority];
let pend = if sender != receiver {
quote!(
#device::xpend(#receiver, #device::#enum_::#interrupt);
#rt_err::xpend(#receiver, #rt_err::#enum_::#interrupt);
)
} else {
quote!(
rtic::pend(#device::#enum_::#interrupt);
rtic::pend(#rt_err::#enum_::#interrupt);
)
};

Expand Down
6 changes: 3 additions & 3 deletions macros/src/codegen/timer_queue.rs
Expand Up @@ -79,7 +79,7 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream

// Timer queue handler
{
let device = extra.device;
let rt_err = util::rt_err_ident();
let arms = timer_queue
.tasks
.iter()
Expand All @@ -96,11 +96,11 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream

let pend = if sender != receiver {
quote!(
#device::xpend(#receiver, #device::#enum_::#interrupt);
#rt_err::xpend(#receiver, #rt_err::#enum_::#interrupt);
)
} else {
quote!(
rtic::pend(#device::#enum_::#interrupt);
rtic::pend(#rt_err::#enum_::#interrupt);
)
};

Expand Down
9 changes: 8 additions & 1 deletion macros/src/codegen/util.rs
Expand Up @@ -109,7 +109,7 @@ pub fn instants_ident(task: &Ident, sender: Core) -> Ident {
pub fn interrupt_ident(core: Core, cores: u8) -> Ident {
let span = Span::call_site();
if cores == 1 {
Ident::new("Interrupt", span)
Ident::new("interrupt", span)
} else {
Ident::new(&format!("Interrupt_{}", core), span)
}
Expand Down Expand Up @@ -323,3 +323,10 @@ pub fn suffixed(name: &str, core: u8) -> Ident {
pub fn tq_ident(core: Core) -> Ident {
Ident::new(&format!("TQ{}", core), Span::call_site())
}

pub fn rt_err_ident() -> Ident {
Ident::new(
"you_must_enable_the_rt_feature_for_the_pac_in_your_cargo_toml",
Span::call_site(),
)
}