rtic_macros/codegen/
pre_init.rs

1use super::bindings::{pre_init_checks, pre_init_enable_interrupts};
2use crate::analyze::Analysis;
3use crate::syntax::ast::App;
4use proc_macro2::TokenStream as TokenStream2;
5use quote::quote;
6
7/// Generates code that runs before `#[init]`
8pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
9    let mut stmts = vec![];
10
11    // Disable interrupts -- `init` must run with interrupts disabled
12    stmts.push(quote!(rtic::export::interrupt::disable();));
13
14    if app.args.core {
15        stmts.push(quote!(
16            // To set the variable in cortex_m so the peripherals cannot be taken multiple times
17            let mut core: rtic::export::Peripherals = rtic::export::Peripherals::steal().into();
18        ));
19    }
20
21    stmts.append(&mut pre_init_checks(app, analysis));
22
23    stmts.append(&mut pre_init_enable_interrupts(app, analysis));
24
25    stmts
26}