Remove HAL initialization from #[embassy::main] macro.
This commit is contained in:
@ -5,11 +5,7 @@ use quote::quote;
|
||||
use crate::util::ctxt::Ctxt;
|
||||
|
||||
#[derive(Debug, FromMeta)]
|
||||
struct Args {
|
||||
#[allow(unused)]
|
||||
#[darling(default)]
|
||||
config: Option<syn::LitStr>,
|
||||
}
|
||||
struct Args {}
|
||||
|
||||
pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, TokenStream> {
|
||||
#[allow(unused_variables)]
|
||||
@ -20,26 +16,14 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, Toke
|
||||
let ctxt = Ctxt::new();
|
||||
|
||||
if f.sig.asyncness.is_none() {
|
||||
ctxt.error_spanned_by(&f.sig, "task functions must be async");
|
||||
ctxt.error_spanned_by(&f.sig, "main function must be async");
|
||||
}
|
||||
if !f.sig.generics.params.is_empty() {
|
||||
ctxt.error_spanned_by(&f.sig, "task functions must not be generic");
|
||||
ctxt.error_spanned_by(&f.sig, "main function must not be generic");
|
||||
}
|
||||
|
||||
#[cfg(feature = "stm32")]
|
||||
let hal = Some(quote!(::embassy_stm32));
|
||||
#[cfg(feature = "nrf")]
|
||||
let hal = Some(quote!(::embassy_nrf));
|
||||
#[cfg(feature = "rp")]
|
||||
let hal = Some(quote!(::embassy_rp));
|
||||
#[cfg(not(any(feature = "stm32", feature = "nrf", feature = "rp")))]
|
||||
let hal: Option<TokenStream> = None;
|
||||
|
||||
if hal.is_some() && fargs.len() != 2 {
|
||||
ctxt.error_spanned_by(&f.sig, "main function must have 2 arguments");
|
||||
}
|
||||
if hal.is_none() && fargs.len() != 1 {
|
||||
ctxt.error_spanned_by(&f.sig, "main function must have 1 argument");
|
||||
if fargs.len() != 1 {
|
||||
ctxt.error_spanned_by(&f.sig, "main function must have 1 argument: the spawner.");
|
||||
}
|
||||
|
||||
ctxt.check()?;
|
||||
@ -74,35 +58,15 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, Toke
|
||||
};
|
||||
|
||||
#[cfg(all(not(feature = "std"), not(feature = "wasm")))]
|
||||
let main = {
|
||||
let config = args.config.map(|s| s.parse::<syn::Expr>().unwrap()).unwrap_or_else(|| {
|
||||
syn::Expr::Verbatim(quote! {
|
||||
Default::default()
|
||||
let main = quote! {
|
||||
#[cortex_m_rt::entry]
|
||||
fn main() -> ! {
|
||||
let mut executor = ::embassy_executor::executor::Executor::new();
|
||||
let executor = unsafe { __make_static(&mut executor) };
|
||||
|
||||
executor.run(|spawner| {
|
||||
spawner.must_spawn(__embassy_main(spawner));
|
||||
})
|
||||
});
|
||||
|
||||
let (hal_setup, peris_arg) = match hal {
|
||||
Some(hal) => (
|
||||
quote!(
|
||||
let p = #hal::init(#config);
|
||||
),
|
||||
quote!(p),
|
||||
),
|
||||
None => (quote!(), quote!()),
|
||||
};
|
||||
|
||||
quote! {
|
||||
#[cortex_m_rt::entry]
|
||||
fn main() -> ! {
|
||||
#hal_setup
|
||||
|
||||
let mut executor = ::embassy_executor::executor::Executor::new();
|
||||
let executor = unsafe { __make_static(&mut executor) };
|
||||
|
||||
executor.run(|spawner| {
|
||||
spawner.must_spawn(__embassy_main(spawner, #peris_arg));
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user