diff options
Diffstat (limited to 'embassy-executor-macros/src/macros')
| -rw-r--r-- | embassy-executor-macros/src/macros/main.rs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/embassy-executor-macros/src/macros/main.rs b/embassy-executor-macros/src/macros/main.rs index 26dfa2397..66a3965d0 100644 --- a/embassy-executor-macros/src/macros/main.rs +++ b/embassy-executor-macros/src/macros/main.rs | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | use darling::export::NestedMeta; | 1 | use darling::export::NestedMeta; |
| 2 | use darling::FromMeta; | 2 | use darling::{Error, FromMeta}; |
| 3 | use proc_macro2::TokenStream; | 3 | use proc_macro2::TokenStream; |
| 4 | use quote::quote; | 4 | use quote::quote; |
| 5 | use syn::{Expr, ReturnType, Type}; | 5 | use syn::{Expr, ReturnType, Type}; |
| @@ -50,6 +50,33 @@ pub fn riscv(args: &[NestedMeta]) -> TokenStream { | |||
| 50 | } | 50 | } |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | pub fn spin(args: &[NestedMeta]) -> TokenStream { | ||
| 54 | let maybe_entry = match Args::from_list(args) { | ||
| 55 | Ok(args) => args.entry, | ||
| 56 | Err(e) => return e.write_errors(), | ||
| 57 | }; | ||
| 58 | |||
| 59 | let entry = match maybe_entry { | ||
| 60 | Some(str) => str, | ||
| 61 | None => return Error::missing_field("entry").write_errors(), | ||
| 62 | }; | ||
| 63 | let entry = match Expr::from_string(&entry) { | ||
| 64 | Ok(expr) => expr, | ||
| 65 | Err(e) => return e.write_errors(), | ||
| 66 | }; | ||
| 67 | |||
| 68 | quote! { | ||
| 69 | #[#entry] | ||
| 70 | fn main() -> ! { | ||
| 71 | let mut executor = ::embassy_executor::Executor::new(); | ||
| 72 | let executor = unsafe { __make_static(&mut executor) }; | ||
| 73 | executor.run(|spawner| { | ||
| 74 | spawner.must_spawn(__embassy_main(spawner)); | ||
| 75 | }) | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 53 | pub fn cortex_m() -> TokenStream { | 80 | pub fn cortex_m() -> TokenStream { |
| 54 | quote! { | 81 | quote! { |
| 55 | #[cortex_m_rt::entry] | 82 | #[cortex_m_rt::entry] |
