aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-macros/src/macros/main.rs24
-rw-r--r--embassy-macros/src/macros/task.rs23
-rw-r--r--examples/stm32f4/src/bin/i2c.rs2
-rw-r--r--examples/stm32f4/src/bin/sdmmc.rs4
-rw-r--r--examples/stm32f7/src/bin/eth.rs2
-rw-r--r--examples/stm32f7/src/bin/sdmmc.rs4
-rw-r--r--examples/stm32h7/src/bin/eth.rs2
-rw-r--r--examples/stm32h7/src/bin/eth_client.rs2
-rw-r--r--examples/stm32h7/src/bin/i2c.rs2
-rw-r--r--examples/stm32l4/src/bin/i2c.rs2
-rw-r--r--examples/stm32l4/src/bin/i2c_blocking_async.rs2
-rw-r--r--examples/stm32l4/src/bin/i2c_dma.rs2
12 files changed, 55 insertions, 16 deletions
diff --git a/embassy-macros/src/macros/main.rs b/embassy-macros/src/macros/main.rs
index 18f7c36c4..6ae77398d 100644
--- a/embassy-macros/src/macros/main.rs
+++ b/embassy-macros/src/macros/main.rs
@@ -1,6 +1,7 @@
1use darling::FromMeta; 1use darling::FromMeta;
2use proc_macro2::TokenStream; 2use proc_macro2::TokenStream;
3use quote::quote; 3use quote::quote;
4use syn::{ReturnType, Type};
4 5
5use crate::util::ctxt::Ctxt; 6use crate::util::ctxt::Ctxt;
6 7
@@ -76,6 +77,26 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn, main: TokenStream) -> Resul
76 if !f.sig.generics.params.is_empty() { 77 if !f.sig.generics.params.is_empty() {
77 ctxt.error_spanned_by(&f.sig, "main function must not be generic"); 78 ctxt.error_spanned_by(&f.sig, "main function must not be generic");
78 } 79 }
80 if !f.sig.generics.where_clause.is_none() {
81 ctxt.error_spanned_by(&f.sig, "main function must not have `where` clauses");
82 }
83 if !f.sig.abi.is_none() {
84 ctxt.error_spanned_by(&f.sig, "main function must not have an ABI qualifier");
85 }
86 if !f.sig.variadic.is_none() {
87 ctxt.error_spanned_by(&f.sig, "main function must not be variadic");
88 }
89 match &f.sig.output {
90 ReturnType::Default => {}
91 ReturnType::Type(_, ty) => match &**ty {
92 Type::Tuple(tuple) if tuple.elems.is_empty() => {}
93 Type::Never(_) => {}
94 _ => ctxt.error_spanned_by(
95 &f.sig,
96 "main function must either not return a value, return `()` or return `!`",
97 ),
98 },
99 }
79 100
80 if fargs.len() != 1 { 101 if fargs.len() != 1 {
81 ctxt.error_spanned_by(&f.sig, "main function must have 1 argument: the spawner."); 102 ctxt.error_spanned_by(&f.sig, "main function must have 1 argument: the spawner.");
@@ -84,10 +105,11 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn, main: TokenStream) -> Resul
84 ctxt.check()?; 105 ctxt.check()?;
85 106
86 let f_body = f.block; 107 let f_body = f.block;
108 let out = &f.sig.output;
87 109
88 let result = quote! { 110 let result = quote! {
89 #[::embassy_executor::task()] 111 #[::embassy_executor::task()]
90 async fn __embassy_main(#fargs) { 112 async fn __embassy_main(#fargs) #out {
91 #f_body 113 #f_body
92 } 114 }
93 115
diff --git a/embassy-macros/src/macros/task.rs b/embassy-macros/src/macros/task.rs
index 90d2cd893..9f30cf43e 100644
--- a/embassy-macros/src/macros/task.rs
+++ b/embassy-macros/src/macros/task.rs
@@ -1,7 +1,7 @@
1use darling::FromMeta; 1use darling::FromMeta;
2use proc_macro2::TokenStream; 2use proc_macro2::TokenStream;
3use quote::{format_ident, quote}; 3use quote::{format_ident, quote};
4use syn::{parse_quote, ItemFn}; 4use syn::{parse_quote, ItemFn, ReturnType, Type};
5 5
6use crate::util::ctxt::Ctxt; 6use crate::util::ctxt::Ctxt;
7 7
@@ -24,6 +24,27 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, Toke
24 if !f.sig.generics.params.is_empty() { 24 if !f.sig.generics.params.is_empty() {
25 ctxt.error_spanned_by(&f.sig, "task functions must not be generic"); 25 ctxt.error_spanned_by(&f.sig, "task functions must not be generic");
26 } 26 }
27 if !f.sig.generics.where_clause.is_none() {
28 ctxt.error_spanned_by(&f.sig, "task functions must not have `where` clauses");
29 }
30 if !f.sig.abi.is_none() {
31 ctxt.error_spanned_by(&f.sig, "task functions must not have an ABI qualifier");
32 }
33 if !f.sig.variadic.is_none() {
34 ctxt.error_spanned_by(&f.sig, "task functions must not be variadic");
35 }
36 match &f.sig.output {
37 ReturnType::Default => {}
38 ReturnType::Type(_, ty) => match &**ty {
39 Type::Tuple(tuple) if tuple.elems.is_empty() => {}
40 Type::Never(_) => {}
41 _ => ctxt.error_spanned_by(
42 &f.sig,
43 "task functions must either not return a value, return `()` or return `!`",
44 ),
45 },
46 }
47
27 if pool_size < 1 { 48 if pool_size < 1 {
28 ctxt.error_spanned_by(&f.sig, "pool_size must be 1 or greater"); 49 ctxt.error_spanned_by(&f.sig, "pool_size must be 1 or greater");
29 } 50 }
diff --git a/examples/stm32f4/src/bin/i2c.rs b/examples/stm32f4/src/bin/i2c.rs
index 6e51c211d..f8ae0890c 100644
--- a/examples/stm32f4/src/bin/i2c.rs
+++ b/examples/stm32f4/src/bin/i2c.rs
@@ -15,7 +15,7 @@ const ADDRESS: u8 = 0x5F;
15const WHOAMI: u8 = 0x0F; 15const WHOAMI: u8 = 0x0F;
16 16
17#[embassy_executor::main] 17#[embassy_executor::main]
18async fn main(_spawner: Spawner) -> ! { 18async fn main(_spawner: Spawner) {
19 info!("Hello world!"); 19 info!("Hello world!");
20 let p = embassy_stm32::init(Default::default()); 20 let p = embassy_stm32::init(Default::default());
21 21
diff --git a/examples/stm32f4/src/bin/sdmmc.rs b/examples/stm32f4/src/bin/sdmmc.rs
index 1d0e60cb8..ebdfdb22d 100644
--- a/examples/stm32f4/src/bin/sdmmc.rs
+++ b/examples/stm32f4/src/bin/sdmmc.rs
@@ -14,7 +14,7 @@ use {defmt_rtt as _, panic_probe as _};
14const ALLOW_WRITES: bool = false; 14const ALLOW_WRITES: bool = false;
15 15
16#[embassy_executor::main] 16#[embassy_executor::main]
17async fn main(_spawner: Spawner) -> ! { 17async fn main(_spawner: Spawner) {
18 let mut config = Config::default(); 18 let mut config = Config::default();
19 config.rcc.sys_ck = Some(mhz(48)); 19 config.rcc.sys_ck = Some(mhz(48));
20 config.rcc.pll48 = true; 20 config.rcc.pll48 = true;
@@ -75,6 +75,4 @@ async fn main(_spawner: Spawner) -> ! {
75 75
76 sdmmc.read_block(block_idx, &mut block).await.unwrap(); 76 sdmmc.read_block(block_idx, &mut block).await.unwrap();
77 info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]); 77 info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]);
78
79 loop {}
80} 78}
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs
index 571a6c1b9..9febb14e6 100644
--- a/examples/stm32f7/src/bin/eth.rs
+++ b/examples/stm32f7/src/bin/eth.rs
@@ -106,7 +106,7 @@ async fn main(spawner: Spawner) -> ! {
106 let r = socket.write_all(&buf).await; 106 let r = socket.write_all(&buf).await;
107 if let Err(e) = r { 107 if let Err(e) = r {
108 info!("write error: {:?}", e); 108 info!("write error: {:?}", e);
109 return; 109 continue;
110 } 110 }
111 Timer::after(Duration::from_secs(1)).await; 111 Timer::after(Duration::from_secs(1)).await;
112 } 112 }
diff --git a/examples/stm32f7/src/bin/sdmmc.rs b/examples/stm32f7/src/bin/sdmmc.rs
index cf8128e27..c050a4002 100644
--- a/examples/stm32f7/src/bin/sdmmc.rs
+++ b/examples/stm32f7/src/bin/sdmmc.rs
@@ -10,7 +10,7 @@ use embassy_stm32::{interrupt, Config};
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
12#[embassy_executor::main] 12#[embassy_executor::main]
13async fn main(_spawner: Spawner) -> ! { 13async fn main(_spawner: Spawner) {
14 let mut config = Config::default(); 14 let mut config = Config::default();
15 config.rcc.sys_ck = Some(mhz(200)); 15 config.rcc.sys_ck = Some(mhz(200));
16 config.rcc.pll48 = true; 16 config.rcc.pll48 = true;
@@ -41,6 +41,4 @@ async fn main(_spawner: Spawner) -> ! {
41 let card = unwrap!(sdmmc.card()); 41 let card = unwrap!(sdmmc.card());
42 42
43 info!("Card: {:#?}", Debug2Format(card)); 43 info!("Card: {:#?}", Debug2Format(card));
44
45 loop {}
46} 44}
diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs
index cb245c325..541e49762 100644
--- a/examples/stm32h7/src/bin/eth.rs
+++ b/examples/stm32h7/src/bin/eth.rs
@@ -106,7 +106,7 @@ async fn main(spawner: Spawner) -> ! {
106 let r = socket.write_all(b"Hello\n").await; 106 let r = socket.write_all(b"Hello\n").await;
107 if let Err(e) = r { 107 if let Err(e) = r {
108 info!("write error: {:?}", e); 108 info!("write error: {:?}", e);
109 return; 109 continue;
110 } 110 }
111 Timer::after(Duration::from_secs(1)).await; 111 Timer::after(Duration::from_secs(1)).await;
112 } 112 }
diff --git a/examples/stm32h7/src/bin/eth_client.rs b/examples/stm32h7/src/bin/eth_client.rs
index cce85a083..b609fa5df 100644
--- a/examples/stm32h7/src/bin/eth_client.rs
+++ b/examples/stm32h7/src/bin/eth_client.rs
@@ -108,7 +108,7 @@ async fn main(spawner: Spawner) -> ! {
108 let r = connection.write_all(b"Hello\n").await; 108 let r = connection.write_all(b"Hello\n").await;
109 if let Err(e) = r { 109 if let Err(e) = r {
110 info!("write error: {:?}", e); 110 info!("write error: {:?}", e);
111 return; 111 continue;
112 } 112 }
113 Timer::after(Duration::from_secs(1)).await; 113 Timer::after(Duration::from_secs(1)).await;
114 } 114 }
diff --git a/examples/stm32h7/src/bin/i2c.rs b/examples/stm32h7/src/bin/i2c.rs
index d44319ae6..78e03f014 100644
--- a/examples/stm32h7/src/bin/i2c.rs
+++ b/examples/stm32h7/src/bin/i2c.rs
@@ -14,7 +14,7 @@ const ADDRESS: u8 = 0x5F;
14const WHOAMI: u8 = 0x0F; 14const WHOAMI: u8 = 0x0F;
15 15
16#[embassy_executor::main] 16#[embassy_executor::main]
17async fn main(_spawner: Spawner) -> ! { 17async fn main(_spawner: Spawner) {
18 info!("Hello world!"); 18 info!("Hello world!");
19 let p = embassy_stm32::init(Default::default()); 19 let p = embassy_stm32::init(Default::default());
20 20
diff --git a/examples/stm32l4/src/bin/i2c.rs b/examples/stm32l4/src/bin/i2c.rs
index d54c080c7..d40d6803d 100644
--- a/examples/stm32l4/src/bin/i2c.rs
+++ b/examples/stm32l4/src/bin/i2c.rs
@@ -14,7 +14,7 @@ const ADDRESS: u8 = 0x5F;
14const WHOAMI: u8 = 0x0F; 14const WHOAMI: u8 = 0x0F;
15 15
16#[embassy_executor::main] 16#[embassy_executor::main]
17async fn main(_spawner: Spawner) -> ! { 17async fn main(_spawner: Spawner) {
18 let p = embassy_stm32::init(Default::default()); 18 let p = embassy_stm32::init(Default::default());
19 let irq = interrupt::take!(I2C2_EV); 19 let irq = interrupt::take!(I2C2_EV);
20 let mut i2c = I2c::new( 20 let mut i2c = I2c::new(
diff --git a/examples/stm32l4/src/bin/i2c_blocking_async.rs b/examples/stm32l4/src/bin/i2c_blocking_async.rs
index 35a86660d..d868cac01 100644
--- a/examples/stm32l4/src/bin/i2c_blocking_async.rs
+++ b/examples/stm32l4/src/bin/i2c_blocking_async.rs
@@ -16,7 +16,7 @@ const ADDRESS: u8 = 0x5F;
16const WHOAMI: u8 = 0x0F; 16const WHOAMI: u8 = 0x0F;
17 17
18#[embassy_executor::main] 18#[embassy_executor::main]
19async fn main(_spawner: Spawner) -> ! { 19async fn main(_spawner: Spawner) {
20 let p = embassy_stm32::init(Default::default()); 20 let p = embassy_stm32::init(Default::default());
21 let irq = interrupt::take!(I2C2_EV); 21 let irq = interrupt::take!(I2C2_EV);
22 let i2c = I2c::new( 22 let i2c = I2c::new(
diff --git a/examples/stm32l4/src/bin/i2c_dma.rs b/examples/stm32l4/src/bin/i2c_dma.rs
index 3ce9398a4..7e62ee637 100644
--- a/examples/stm32l4/src/bin/i2c_dma.rs
+++ b/examples/stm32l4/src/bin/i2c_dma.rs
@@ -13,7 +13,7 @@ const ADDRESS: u8 = 0x5F;
13const WHOAMI: u8 = 0x0F; 13const WHOAMI: u8 = 0x0F;
14 14
15#[embassy_executor::main] 15#[embassy_executor::main]
16async fn main(_spawner: Spawner) -> ! { 16async fn main(_spawner: Spawner) {
17 let p = embassy_stm32::init(Default::default()); 17 let p = embassy_stm32::init(Default::default());
18 let irq = interrupt::take!(I2C2_EV); 18 let irq = interrupt::take!(I2C2_EV);
19 let mut i2c = I2c::new( 19 let mut i2c = I2c::new(