aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor-macros/src
diff options
context:
space:
mode:
authorFrostie314159 <[email protected]>2024-03-31 20:48:05 +0200
committerGitHub <[email protected]>2024-03-31 20:48:05 +0200
commit67c9cc2c4b886e6962ecdd6eff8794b14c1accdc (patch)
treef176ab269949d26f48e04c950cebc5489bae8c56 /embassy-executor-macros/src
parenta2f9aa592ec61beb247065003016515f0d423c13 (diff)
parent6634cc90bcd3eb25b64712688920f383584b2964 (diff)
Merge branch 'embassy-rs:main' into ticker_send_sync
Diffstat (limited to 'embassy-executor-macros/src')
-rw-r--r--embassy-executor-macros/src/lib.rs7
-rw-r--r--embassy-executor-macros/src/macros/main.rs14
-rw-r--r--embassy-executor-macros/src/macros/task.rs34
-rw-r--r--embassy-executor-macros/src/util/ctxt.rs1
4 files changed, 49 insertions, 7 deletions
diff --git a/embassy-executor-macros/src/lib.rs b/embassy-executor-macros/src/lib.rs
index c9d58746a..5461fe04c 100644
--- a/embassy-executor-macros/src/lib.rs
+++ b/embassy-executor-macros/src/lib.rs
@@ -62,6 +62,13 @@ pub fn task(args: TokenStream, item: TokenStream) -> TokenStream {
62 task::run(&args.meta, f).unwrap_or_else(|x| x).into() 62 task::run(&args.meta, f).unwrap_or_else(|x| x).into()
63} 63}
64 64
65#[proc_macro_attribute]
66pub fn main_avr(args: TokenStream, item: TokenStream) -> TokenStream {
67 let args = syn::parse_macro_input!(args as Args);
68 let f = syn::parse_macro_input!(item as syn::ItemFn);
69 main::run(&args.meta, f, main::avr()).unwrap_or_else(|x| x).into()
70}
71
65/// Creates a new `executor` instance and declares an application entry point for Cortex-M spawning the corresponding function body as an async task. 72/// Creates a new `executor` instance and declares an application entry point for Cortex-M spawning the corresponding function body as an async task.
66/// 73///
67/// The following restrictions apply: 74/// The following restrictions apply:
diff --git a/embassy-executor-macros/src/macros/main.rs b/embassy-executor-macros/src/macros/main.rs
index 3c0d58567..088e64d1c 100644
--- a/embassy-executor-macros/src/macros/main.rs
+++ b/embassy-executor-macros/src/macros/main.rs
@@ -12,6 +12,20 @@ struct Args {
12 entry: Option<String>, 12 entry: Option<String>,
13} 13}
14 14
15pub fn avr() -> TokenStream {
16 quote! {
17 #[avr_device::entry]
18 fn main() -> ! {
19 let mut executor = ::embassy_executor::Executor::new();
20 let executor = unsafe { __make_static(&mut executor) };
21
22 executor.run(|spawner| {
23 spawner.must_spawn(__embassy_main(spawner));
24 })
25 }
26 }
27}
28
15pub fn riscv(args: &[NestedMeta]) -> TokenStream { 29pub fn riscv(args: &[NestedMeta]) -> TokenStream {
16 let maybe_entry = match Args::from_list(args) { 30 let maybe_entry = match Args::from_list(args) {
17 Ok(args) => args.entry, 31 Ok(args) => args.entry,
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs
index 5161e1020..96c6267b2 100644
--- a/embassy-executor-macros/src/macros/task.rs
+++ b/embassy-executor-macros/src/macros/task.rs
@@ -49,7 +49,7 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
49 }, 49 },
50 } 50 }
51 51
52 let mut arg_names = Vec::new(); 52 let mut args = Vec::new();
53 let mut fargs = f.sig.inputs.clone(); 53 let mut fargs = f.sig.inputs.clone();
54 54
55 for arg in fargs.iter_mut() { 55 for arg in fargs.iter_mut() {
@@ -59,8 +59,8 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
59 } 59 }
60 syn::FnArg::Typed(t) => match t.pat.as_mut() { 60 syn::FnArg::Typed(t) => match t.pat.as_mut() {
61 syn::Pat::Ident(id) => { 61 syn::Pat::Ident(id) => {
62 arg_names.push(id.ident.clone());
63 id.mutability = None; 62 id.mutability = None;
63 args.push((id.clone(), t.attrs.clone()));
64 } 64 }
65 _ => { 65 _ => {
66 ctxt.error_spanned_by(arg, "pattern matching in task arguments is not yet supported"); 66 ctxt.error_spanned_by(arg, "pattern matching in task arguments is not yet supported");
@@ -79,13 +79,35 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
79 task_inner.vis = syn::Visibility::Inherited; 79 task_inner.vis = syn::Visibility::Inherited;
80 task_inner.sig.ident = task_inner_ident.clone(); 80 task_inner.sig.ident = task_inner_ident.clone();
81 81
82 // assemble the original input arguments,
83 // including any attributes that may have
84 // been applied previously
85 let mut full_args = Vec::new();
86 for (arg, cfgs) in args {
87 full_args.push(quote!(
88 #(#cfgs)*
89 #arg
90 ));
91 }
92
82 #[cfg(feature = "nightly")] 93 #[cfg(feature = "nightly")]
83 let mut task_outer: ItemFn = parse_quote! { 94 let mut task_outer: ItemFn = parse_quote! {
84 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> { 95 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> {
85 type Fut = impl ::core::future::Future + 'static; 96 trait _EmbassyInternalTaskTrait {
97 type Fut: ::core::future::Future + 'static;
98 fn construct(#fargs) -> Self::Fut;
99 }
100
101 impl _EmbassyInternalTaskTrait for () {
102 type Fut = impl core::future::Future + 'static;
103 fn construct(#fargs) -> Self::Fut {
104 #task_inner_ident(#(#full_args,)*)
105 }
106 }
107
86 const POOL_SIZE: usize = #pool_size; 108 const POOL_SIZE: usize = #pool_size;
87 static POOL: ::embassy_executor::raw::TaskPool<Fut, POOL_SIZE> = ::embassy_executor::raw::TaskPool::new(); 109 static POOL: ::embassy_executor::raw::TaskPool<<() as _EmbassyInternalTaskTrait>::Fut, POOL_SIZE> = ::embassy_executor::raw::TaskPool::new();
88 unsafe { POOL._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) } 110 unsafe { POOL._spawn_async_fn(move || <() as _EmbassyInternalTaskTrait>::construct(#(#full_args,)*)) }
89 } 111 }
90 }; 112 };
91 #[cfg(not(feature = "nightly"))] 113 #[cfg(not(feature = "nightly"))]
@@ -93,7 +115,7 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
93 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> { 115 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> {
94 const POOL_SIZE: usize = #pool_size; 116 const POOL_SIZE: usize = #pool_size;
95 static POOL: ::embassy_executor::_export::TaskPoolRef = ::embassy_executor::_export::TaskPoolRef::new(); 117 static POOL: ::embassy_executor::_export::TaskPoolRef = ::embassy_executor::_export::TaskPoolRef::new();
96 unsafe { POOL.get::<_, POOL_SIZE>()._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) } 118 unsafe { POOL.get::<_, POOL_SIZE>()._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) }
97 } 119 }
98 }; 120 };
99 121
diff --git a/embassy-executor-macros/src/util/ctxt.rs b/embassy-executor-macros/src/util/ctxt.rs
index 74c872c3c..9c78cda01 100644
--- a/embassy-executor-macros/src/util/ctxt.rs
+++ b/embassy-executor-macros/src/util/ctxt.rs
@@ -7,7 +7,6 @@ use std::thread;
7 7
8use proc_macro2::TokenStream; 8use proc_macro2::TokenStream;
9use quote::{quote, ToTokens}; 9use quote::{quote, ToTokens};
10use syn;
11 10
12/// A type to collect errors together and format them. 11/// A type to collect errors together and format them.
13/// 12///