aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-08-29 12:04:29 +0000
committerGitHub <[email protected]>2025-08-29 12:04:29 +0000
commitf86cf87f2f20f723e2ba2fe7d83908a2b3bac2d1 (patch)
tree57f9200ed729746ef5f077af6c79863c37e824ae
parentdf10e8a6bc407544d29c234ed00bdec3e9caf837 (diff)
parente2c34ac735888d25d57d3ea07e8915c2e112048c (diff)
Merge pull request #4606 from diondokter/taskmeta-update-2
Taskmeta update
-rwxr-xr-x.github/ci/test.sh2
-rw-r--r--README.md2
-rwxr-xr-xci.sh3
-rw-r--r--docs/examples/basic/src/main.rs2
-rw-r--r--docs/pages/sharing_peripherals.adoc8
-rw-r--r--embassy-executor-macros/src/macros/main.rs4
-rw-r--r--embassy-executor-macros/src/macros/task.rs4
-rw-r--r--embassy-executor/CHANGELOG.md2
-rw-r--r--embassy-executor/Cargo.toml28
-rw-r--r--embassy-executor/src/lib.rs3
-rw-r--r--embassy-executor/src/metadata.rs55
-rw-r--r--embassy-executor/src/raw/mod.rs62
-rw-r--r--embassy-executor/src/raw/trace.rs77
-rw-r--r--embassy-executor/src/spawner.rs117
-rw-r--r--embassy-executor/tests/test.rs50
-rw-r--r--embassy-executor/tests/ui/return_impl_future_nonsend.rs2
-rw-r--r--embassy-executor/tests/ui/return_impl_future_nonsend.stderr6
-rw-r--r--embassy-executor/tests/ui/return_impl_send.stderr2
-rw-r--r--embassy-executor/tests/ui/spawn_nonsend.rs2
-rw-r--r--embassy-executor/tests/ui/spawn_nonsend.stderr10
-rw-r--r--embassy-net/src/lib.rs2
-rw-r--r--embassy-rp/src/multicore.rs4
-rw-r--r--embassy-stm32/src/low_power.rs2
-rw-r--r--examples/mimxrt6/src/bin/uart-async.rs4
-rw-r--r--examples/mimxrt6/src/bin/uart.rs4
-rw-r--r--examples/nrf-rtos-trace/src/bin/rtos_trace.rs6
-rw-r--r--examples/nrf52840/src/bin/channel.rs2
-rw-r--r--examples/nrf52840/src/bin/channel_sender_receiver.rs4
-rw-r--r--examples/nrf52840/src/bin/ethernet_enc28j60.rs2
-rw-r--r--examples/nrf52840/src/bin/executor_fairness_test.rs6
-rw-r--r--examples/nrf52840/src/bin/gpiote_port.rs8
-rw-r--r--examples/nrf52840/src/bin/manually_create_executor.rs4
-rw-r--r--examples/nrf52840/src/bin/multiprio.rs6
-rw-r--r--examples/nrf52840/src/bin/mutex.rs2
-rw-r--r--examples/nrf52840/src/bin/pubsub.rs6
-rw-r--r--examples/nrf52840/src/bin/raw_spawn.rs4
-rw-r--r--examples/nrf52840/src/bin/self_spawn.rs4
-rw-r--r--examples/nrf52840/src/bin/self_spawn_current_executor.rs4
-rw-r--r--examples/nrf52840/src/bin/timer.rs4
-rw-r--r--examples/nrf52840/src/bin/uart_split.rs2
-rw-r--r--examples/nrf52840/src/bin/usb_ethernet.rs6
-rw-r--r--examples/nrf52840/src/bin/usb_serial_multitask.rs4
-rw-r--r--examples/nrf52840/src/bin/wifi_esp_hosted.rs4
-rw-r--r--examples/nrf9160/src/bin/modem_tcp_client.rs10
-rw-r--r--examples/rp/src/bin/assign_resources.rs6
-rw-r--r--examples/rp/src/bin/blinky_two_channels.rs4
-rw-r--r--examples/rp/src/bin/blinky_two_tasks.rs4
-rw-r--r--examples/rp/src/bin/ethernet_w5500_icmp.rs4
-rw-r--r--examples/rp/src/bin/ethernet_w5500_icmp_ping.rs4
-rw-r--r--examples/rp/src/bin/ethernet_w5500_multisocket.rs8
-rw-r--r--examples/rp/src/bin/ethernet_w5500_tcp_client.rs4
-rw-r--r--examples/rp/src/bin/ethernet_w5500_tcp_server.rs4
-rw-r--r--examples/rp/src/bin/ethernet_w5500_udp.rs4
-rw-r--r--examples/rp/src/bin/i2c_slave.rs4
-rw-r--r--examples/rp/src/bin/interrupt.rs2
-rw-r--r--examples/rp/src/bin/multicore.rs4
-rw-r--r--examples/rp/src/bin/multiprio.rs6
-rw-r--r--examples/rp/src/bin/orchestrate_tasks.rs14
-rw-r--r--examples/rp/src/bin/pio_async.rs6
-rw-r--r--examples/rp/src/bin/pio_rotary_encoder.rs4
-rw-r--r--examples/rp/src/bin/pwm.rs4
-rw-r--r--examples/rp/src/bin/shared_bus.rs8
-rw-r--r--examples/rp/src/bin/sharing.rs6
-rw-r--r--examples/rp/src/bin/uart_buffered_split.rs2
-rw-r--r--examples/rp/src/bin/uart_unidir.rs2
-rw-r--r--examples/rp/src/bin/usb_ethernet.rs6
-rw-r--r--examples/rp/src/bin/usb_logger.rs2
-rw-r--r--examples/rp/src/bin/usb_serial.rs2
-rw-r--r--examples/rp/src/bin/usb_serial_with_handler.rs2
-rw-r--r--examples/rp/src/bin/wifi_ap_tcp_server.rs4
-rw-r--r--examples/rp/src/bin/wifi_blinky.rs2
-rw-r--r--examples/rp/src/bin/wifi_scan.rs2
-rw-r--r--examples/rp/src/bin/wifi_tcp_server.rs4
-rw-r--r--examples/rp/src/bin/wifi_webrequest.rs4
-rw-r--r--examples/rp/src/bin/zerocopy.rs4
-rw-r--r--examples/rp235x/src/bin/assign_resources.rs6
-rw-r--r--examples/rp235x/src/bin/blinky_two_channels.rs4
-rw-r--r--examples/rp235x/src/bin/blinky_two_tasks.rs4
-rw-r--r--examples/rp235x/src/bin/blinky_wifi.rs2
-rw-r--r--examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs2
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_icmp.rs4
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs4
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_multisocket.rs8
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs4
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs4
-rw-r--r--examples/rp235x/src/bin/ethernet_w5500_udp.rs4
-rw-r--r--examples/rp235x/src/bin/i2c_slave.rs4
-rw-r--r--examples/rp235x/src/bin/interrupt.rs2
-rw-r--r--examples/rp235x/src/bin/multicore.rs4
-rw-r--r--examples/rp235x/src/bin/multiprio.rs6
-rw-r--r--examples/rp235x/src/bin/pio_async.rs6
-rw-r--r--examples/rp235x/src/bin/pio_rotary_encoder.rs4
-rw-r--r--examples/rp235x/src/bin/pwm.rs4
-rw-r--r--examples/rp235x/src/bin/shared_bus.rs8
-rw-r--r--examples/rp235x/src/bin/sharing.rs6
-rw-r--r--examples/rp235x/src/bin/uart_buffered_split.rs2
-rw-r--r--examples/rp235x/src/bin/uart_unidir.rs2
-rw-r--r--examples/rp235x/src/bin/zerocopy.rs4
-rw-r--r--examples/std/src/bin/net.rs4
-rw-r--r--examples/std/src/bin/net_dns.rs4
-rw-r--r--examples/std/src/bin/net_ppp.rs6
-rw-r--r--examples/std/src/bin/net_udp.rs4
-rw-r--r--examples/std/src/bin/serial.rs2
-rw-r--r--examples/std/src/bin/tcp_accept.rs4
-rw-r--r--examples/std/src/bin/tick.rs2
-rw-r--r--examples/stm32f0/src/bin/button_controlled_blink.rs2
-rw-r--r--examples/stm32f0/src/bin/multiprio.rs6
-rw-r--r--examples/stm32f1/src/bin/input_capture.rs2
-rw-r--r--examples/stm32f1/src/bin/pwm_input.rs2
-rw-r--r--examples/stm32f3/src/bin/button_events.rs4
-rw-r--r--examples/stm32f3/src/bin/multiprio.rs6
-rw-r--r--examples/stm32f4/src/bin/adc_dma.rs2
-rw-r--r--examples/stm32f4/src/bin/eth.rs2
-rw-r--r--examples/stm32f4/src/bin/eth_w5500.rs4
-rw-r--r--examples/stm32f4/src/bin/flash_async.rs2
-rw-r--r--examples/stm32f4/src/bin/input_capture.rs2
-rw-r--r--examples/stm32f4/src/bin/multiprio.rs6
-rw-r--r--examples/stm32f4/src/bin/pwm_input.rs2
-rw-r--r--examples/stm32f4/src/bin/usb_ethernet.rs6
-rw-r--r--examples/stm32f4/src/bin/usb_uac_speaker.rs10
-rw-r--r--examples/stm32f7/src/bin/can.rs2
-rw-r--r--examples/stm32f7/src/bin/eth.rs2
-rw-r--r--examples/stm32g0/src/bin/input_capture.rs2
-rw-r--r--examples/stm32g0/src/bin/pwm_input.rs2
-rw-r--r--examples/stm32g4/src/bin/i2c_slave.rs4
-rw-r--r--examples/stm32h5/src/bin/adc_dma.rs4
-rw-r--r--examples/stm32h5/src/bin/eth.rs2
-rw-r--r--examples/stm32h5/src/bin/stop.rs6
-rw-r--r--examples/stm32h5/src/bin/usart.rs2
-rw-r--r--examples/stm32h5/src/bin/usart_dma.rs2
-rw-r--r--examples/stm32h5/src/bin/usart_split.rs2
-rw-r--r--examples/stm32h5/src/bin/usb_uac_speaker.rs10
-rw-r--r--examples/stm32h7/src/bin/dac_dma.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/eth_client_mii.rs2
-rw-r--r--examples/stm32h7/src/bin/i2c_shared.rs4
-rw-r--r--examples/stm32h7/src/bin/multiprio.rs6
-rw-r--r--examples/stm32h7/src/bin/signal.rs2
-rw-r--r--examples/stm32h7/src/bin/spi.rs2
-rw-r--r--examples/stm32h7/src/bin/spi_bdma.rs2
-rw-r--r--examples/stm32h7/src/bin/spi_dma.rs2
-rw-r--r--examples/stm32h7/src/bin/usart.rs2
-rw-r--r--examples/stm32h7/src/bin/usart_dma.rs2
-rw-r--r--examples/stm32h7/src/bin/usart_split.rs2
-rw-r--r--examples/stm32h735/src/bin/ltdc.rs2
-rw-r--r--examples/stm32h755cm4/src/bin/intercore.rs2
-rw-r--r--examples/stm32h7rs/src/bin/eth.rs2
-rw-r--r--examples/stm32h7rs/src/bin/multiprio.rs6
-rw-r--r--examples/stm32h7rs/src/bin/signal.rs2
-rw-r--r--examples/stm32h7rs/src/bin/spi.rs2
-rw-r--r--examples/stm32h7rs/src/bin/spi_dma.rs2
-rw-r--r--examples/stm32h7rs/src/bin/usart.rs2
-rw-r--r--examples/stm32h7rs/src/bin/usart_dma.rs2
-rw-r--r--examples/stm32h7rs/src/bin/usart_split.rs2
-rw-r--r--examples/stm32l0/src/bin/raw_spawn.rs4
-rw-r--r--examples/stm32l4/src/bin/dac_dma.rs4
-rw-r--r--examples/stm32l4/src/bin/spe_adin1110_http_server.rs8
-rw-r--r--examples/stm32l5/src/bin/stop.rs6
-rw-r--r--examples/stm32l5/src/bin/usb_ethernet.rs6
-rw-r--r--examples/stm32u5/src/bin/ltdc.rs2
-rw-r--r--examples/stm32wb/src/bin/gatt_server.rs2
-rw-r--r--examples/stm32wb/src/bin/mac_ffd.rs2
-rw-r--r--examples/stm32wb/src/bin/mac_ffd_net.rs4
-rw-r--r--examples/stm32wb/src/bin/mac_rfd.rs2
-rw-r--r--examples/stm32wb/src/bin/tl_mbox_mac.rs2
-rw-r--r--examples/wasm/src/lib.rs2
-rw-r--r--tests/nrf/src/bin/ethernet_enc28j60_perf.rs2
-rw-r--r--tests/nrf/src/bin/wifi_esp_hosted_perf.rs4
-rw-r--r--tests/rp/src/bin/cyw43-perf.rs4
-rw-r--r--tests/rp/src/bin/ethernet_w5100s_perf.rs4
-rw-r--r--tests/rp/src/bin/gpio_multicore.rs4
-rw-r--r--tests/rp/src/bin/i2c.rs2
-rw-r--r--tests/rp/src/bin/multicore.rs4
-rw-r--r--tests/rp/src/bin/spinlock_mutex_multicore.rs4
-rw-r--r--tests/stm32/src/bin/eth.rs2
-rw-r--r--tests/stm32/src/bin/stop.rs6
-rw-r--r--tests/stm32/src/bin/usart_rx_ringbuffered.rs4
-rw-r--r--tests/stm32/src/bin/wpan_ble.rs2
-rw-r--r--tests/stm32/src/bin/wpan_mac.rs2
180 files changed, 520 insertions, 529 deletions
diff --git a/.github/ci/test.sh b/.github/ci/test.sh
index c9b332cf8..33dfa48c9 100755
--- a/.github/ci/test.sh
+++ b/.github/ci/test.sh
@@ -12,7 +12,7 @@ export CARGO_TARGET_DIR=/ci/cache/target
12# used when pointing stm32-metapac to a CI-built one. 12# used when pointing stm32-metapac to a CI-built one.
13export CARGO_NET_GIT_FETCH_WITH_CLI=true 13export CARGO_NET_GIT_FETCH_WITH_CLI=true
14 14
15cargo test --manifest-path ./embassy-executor/Cargo.toml 15cargo test --manifest-path ./embassy-executor/Cargo.toml --features metadata-name
16cargo test --manifest-path ./embassy-futures/Cargo.toml 16cargo test --manifest-path ./embassy-futures/Cargo.toml
17cargo test --manifest-path ./embassy-sync/Cargo.toml 17cargo test --manifest-path ./embassy-sync/Cargo.toml
18cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml 18cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml
diff --git a/README.md b/README.md
index 68d8460d3..de6b3bb59 100644
--- a/README.md
+++ b/README.md
@@ -80,7 +80,7 @@ async fn main(spawner: Spawner) {
80 let p = embassy_nrf::init(Default::default()); 80 let p = embassy_nrf::init(Default::default());
81 81
82 // Spawned tasks run in the background, concurrently. 82 // Spawned tasks run in the background, concurrently.
83 spawner.spawn(blink(p.P0_13.into())).unwrap(); 83 spawner.spawn(blink(p.P0_13.into()).unwrap());
84 84
85 let mut button = Input::new(p.P0_11, Pull::Up); 85 let mut button = Input::new(p.P0_11, Pull::Up);
86 loop { 86 loop {
diff --git a/ci.sh b/ci.sh
index 94bf83675..a585a3ab8 100755
--- a/ci.sh
+++ b/ci.sh
@@ -31,7 +31,10 @@ cargo batch \
31 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \ 31 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \
32 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt \ 32 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt \
33 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \ 33 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \
34 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,metadata-name \
35 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,trace \
34 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,rtos-trace \ 36 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,rtos-trace \
37 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,trace,rtos-trace \
35 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \ 38 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \
36 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \ 39 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \
37 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \ 40 --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \
diff --git a/docs/examples/basic/src/main.rs b/docs/examples/basic/src/main.rs
index 4412712c8..6e274bacb 100644
--- a/docs/examples/basic/src/main.rs
+++ b/docs/examples/basic/src/main.rs
@@ -22,5 +22,5 @@ async fn main(spawner: Spawner) {
22 let p = embassy_nrf::init(Default::default()); 22 let p = embassy_nrf::init(Default::default());
23 23
24 let led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard); 24 let led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard);
25 unwrap!(spawner.spawn(blinker(led, Duration::from_millis(300)))); 25 spawner.spawn(unwrap!(blinker(led, Duration::from_millis(300))));
26} 26}
diff --git a/docs/pages/sharing_peripherals.adoc b/docs/pages/sharing_peripherals.adoc
index dfb8c1ffe..70b4210e6 100644
--- a/docs/pages/sharing_peripherals.adoc
+++ b/docs/pages/sharing_peripherals.adoc
@@ -36,8 +36,8 @@ async fn main(spawner: Spawner) {
36 let dt = 100 * 1_000_000; 36 let dt = 100 * 1_000_000;
37 let k = 1.003; 37 let k = 1.003;
38 38
39 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); 39 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos(dt))));
40 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); 40 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64))));
41} 41}
42 42
43// A pool size of 2 means you can spawn two instances of this task. 43// A pool size of 2 means you can spawn two instances of this task.
@@ -103,8 +103,8 @@ async fn main(spawner: Spawner) {
103 let dt = 100 * 1_000_000; 103 let dt = 100 * 1_000_000;
104 let k = 1.003; 104 let k = 1.003;
105 105
106 unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); 106 spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt))));
107 unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64)))); 107 spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64))));
108 108
109 loop { 109 loop {
110 match CHANNEL.receive().await { 110 match CHANNEL.receive().await {
diff --git a/embassy-executor-macros/src/macros/main.rs b/embassy-executor-macros/src/macros/main.rs
index a0e7b3401..fcc04d9c0 100644
--- a/embassy-executor-macros/src/macros/main.rs
+++ b/embassy-executor-macros/src/macros/main.rs
@@ -181,7 +181,7 @@ For example: `#[embassy_executor::main(entry = ..., executor = \"some_crate::Exe
181 let mut executor = #executor::new(); 181 let mut executor = #executor::new();
182 let executor = unsafe { __make_static(&mut executor) }; 182 let executor = unsafe { __make_static(&mut executor) };
183 executor.run(|spawner| { 183 executor.run(|spawner| {
184 spawner.must_spawn(__embassy_main(spawner)); 184 spawner.spawn(__embassy_main(spawner).unwrap());
185 }) 185 })
186 }, 186 },
187 ), 187 ),
@@ -191,7 +191,7 @@ For example: `#[embassy_executor::main(entry = ..., executor = \"some_crate::Exe
191 let executor = ::std::boxed::Box::leak(::std::boxed::Box::new(#executor::new())); 191 let executor = ::std::boxed::Box::leak(::std::boxed::Box::new(#executor::new()));
192 192
193 executor.start(|spawner| { 193 executor.start(|spawner| {
194 spawner.must_spawn(__embassy_main(spawner)); 194 spawner.spawn(__embassy_main(spawner).unwrap());
195 }); 195 });
196 196
197 Ok(()) 197 Ok(())
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs
index fc8673743..755948882 100644
--- a/embassy-executor-macros/src/macros/task.rs
+++ b/embassy-executor-macros/src/macros/task.rs
@@ -234,7 +234,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream {
234 if !errors.is_empty() { 234 if !errors.is_empty() {
235 task_outer_body = quote! { 235 task_outer_body = quote! {
236 #![allow(unused_variables, unreachable_code)] 236 #![allow(unused_variables, unreachable_code)]
237 let _x: #embassy_executor::SpawnToken<()> = ::core::todo!(); 237 let _x: ::core::result::Result<#embassy_executor::SpawnToken<()>, #embassy_executor::SpawnError> = ::core::todo!();
238 _x 238 _x
239 }; 239 };
240 } 240 }
@@ -248,7 +248,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream {
248 #task_inner 248 #task_inner
249 249
250 #(#task_outer_attrs)* 250 #(#task_outer_attrs)*
251 #visibility #unsafety fn #task_ident #generics (#fargs) -> #embassy_executor::SpawnToken<impl Sized> #where_clause{ 251 #visibility #unsafety fn #task_ident #generics (#fargs) -> ::core::result::Result<#embassy_executor::SpawnToken<impl Sized>, #embassy_executor::SpawnError> #where_clause{
252 #task_outer_body 252 #task_outer_body
253 } 253 }
254 254
diff --git a/embassy-executor/CHANGELOG.md b/embassy-executor/CHANGELOG.md
index f301429c0..f2db46ef9 100644
--- a/embassy-executor/CHANGELOG.md
+++ b/embassy-executor/CHANGELOG.md
@@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8<!-- next-header --> 8<!-- next-header -->
9## Unreleased - ReleaseDate 9## Unreleased - ReleaseDate
10 10
11- Added new metadata API for tasks
12
11## 0.9.0 - 2025-08-26 13## 0.9.0 - 2025-08-26
12 14
13- Added `extern "Rust" fn __embassy_time_queue_item_from_waker` 15- Added `extern "Rust" fn __embassy_time_queue_item_from_waker`
diff --git a/embassy-executor/Cargo.toml b/embassy-executor/Cargo.toml
index d89e85cb7..79680ae74 100644
--- a/embassy-executor/Cargo.toml
+++ b/embassy-executor/Cargo.toml
@@ -109,13 +109,35 @@ arch-avr = ["_arch", "dep:portable-atomic", "dep:avr-device"]
109## spin (architecture agnostic; never sleeps) 109## spin (architecture agnostic; never sleeps)
110arch-spin = ["_arch"] 110arch-spin = ["_arch"]
111 111
112#! ### Metadata
113
114## Enable the `name` field in task metadata.
115metadata-name = []
116
112#! ### Executor 117#! ### Executor
113 118
114## Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs) 119## Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs)
115executor-thread = [] 120executor-thread = []
116## Enable the interrupt-mode executor (available in Cortex-M only) 121## Enable the interrupt-mode executor (available in Cortex-M only)
117executor-interrupt = [] 122executor-interrupt = []
118## Enable tracing support (adds some overhead) 123## Enable tracing hooks
119trace = [] 124trace = ["_any_trace"]
120## Enable support for rtos-trace framework 125## Enable support for rtos-trace framework
121rtos-trace = ["dep:rtos-trace", "trace", "dep:embassy-time-driver"] 126rtos-trace = ["_any_trace", "metadata-name", "dep:rtos-trace", "dep:embassy-time-driver"]
127_any_trace = []
128
129#! ### Timer Item Payload Size
130#! Sets the size of the payload for timer items, allowing integrated timer implementors to store
131#! additional data in the timer item. The payload field will be aligned to this value as well.
132#! If these features are not defined, the timer item will contain no payload field.
133
134_timer-item-payload = [] # A size was picked
135
136## 1 bytes
137timer-item-payload-size-1 = ["_timer-item-payload"]
138## 2 bytes
139timer-item-payload-size-2 = ["_timer-item-payload"]
140## 4 bytes
141timer-item-payload-size-4 = ["_timer-item-payload"]
142## 8 bytes
143timer-item-payload-size-8 = ["_timer-item-payload"]
diff --git a/embassy-executor/src/lib.rs b/embassy-executor/src/lib.rs
index 0747db032..e47b8eb9f 100644
--- a/embassy-executor/src/lib.rs
+++ b/embassy-executor/src/lib.rs
@@ -54,6 +54,9 @@ pub mod raw;
54mod spawner; 54mod spawner;
55pub use spawner::*; 55pub use spawner::*;
56 56
57mod metadata;
58pub use metadata::*;
59
57/// Implementation details for embassy macros. 60/// Implementation details for embassy macros.
58/// Do not use. Used for macros and HALs only. Not covered by semver guarantees. 61/// Do not use. Used for macros and HALs only. Not covered by semver guarantees.
59#[doc(hidden)] 62#[doc(hidden)]
diff --git a/embassy-executor/src/metadata.rs b/embassy-executor/src/metadata.rs
new file mode 100644
index 000000000..f92c9b37c
--- /dev/null
+++ b/embassy-executor/src/metadata.rs
@@ -0,0 +1,55 @@
1#[cfg(feature = "metadata-name")]
2use core::cell::Cell;
3use core::future::{poll_fn, Future};
4use core::task::Poll;
5
6#[cfg(feature = "metadata-name")]
7use critical_section::Mutex;
8
9use crate::raw;
10
11/// Metadata associated with a task.
12pub struct Metadata {
13 #[cfg(feature = "metadata-name")]
14 name: Mutex<Cell<Option<&'static str>>>,
15}
16
17impl Metadata {
18 pub(crate) const fn new() -> Self {
19 Self {
20 #[cfg(feature = "metadata-name")]
21 name: Mutex::new(Cell::new(None)),
22 }
23 }
24
25 pub(crate) fn reset(&self) {
26 #[cfg(feature = "metadata-name")]
27 critical_section::with(|cs| self.name.borrow(cs).set(None));
28 }
29
30 /// Get the metadata for the current task.
31 ///
32 /// You can use this to read or modify the current task's metadata.
33 ///
34 /// This function is `async` just to get access to the current async
35 /// context. It returns instantly, it does not block/yield.
36 pub fn for_current_task() -> impl Future<Output = &'static Self> {
37 poll_fn(|cx| Poll::Ready(raw::task_from_waker(cx.waker()).metadata()))
38 }
39
40 /// Get this task's name
41 ///
42 /// NOTE: this takes a critical section.
43 #[cfg(feature = "metadata-name")]
44 pub fn name(&self) -> Option<&'static str> {
45 critical_section::with(|cs| self.name.borrow(cs).get())
46 }
47
48 /// Set this task's name
49 ///
50 /// NOTE: this takes a critical section.
51 #[cfg(feature = "metadata-name")]
52 pub fn set_name(&self, name: &'static str) {
53 critical_section::with(|cs| self.name.borrow(cs).set(Some(name)))
54 }
55}
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs
index 4b17d4982..bdaa32951 100644
--- a/embassy-executor/src/raw/mod.rs
+++ b/embassy-executor/src/raw/mod.rs
@@ -16,7 +16,7 @@ mod run_queue;
16#[cfg_attr(not(target_has_atomic = "8"), path = "state_critical_section.rs")] 16#[cfg_attr(not(target_has_atomic = "8"), path = "state_critical_section.rs")]
17mod state; 17mod state;
18 18
19#[cfg(feature = "trace")] 19#[cfg(feature = "_any_trace")]
20pub mod trace; 20pub mod trace;
21pub(crate) mod util; 21pub(crate) mod util;
22#[cfg_attr(feature = "turbowakers", path = "waker_turbo.rs")] 22#[cfg_attr(feature = "turbowakers", path = "waker_turbo.rs")]
@@ -41,6 +41,7 @@ use self::state::State;
41use self::util::{SyncUnsafeCell, UninitCell}; 41use self::util::{SyncUnsafeCell, UninitCell};
42pub use self::waker::task_from_waker; 42pub use self::waker::task_from_waker;
43use super::SpawnToken; 43use super::SpawnToken;
44use crate::{Metadata, SpawnError};
44 45
45#[no_mangle] 46#[no_mangle]
46extern "Rust" fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static mut TimerQueueItem { 47extern "Rust" fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static mut TimerQueueItem {
@@ -94,11 +95,10 @@ pub(crate) struct TaskHeader {
94 95
95 /// Integrated timer queue storage. This field should not be accessed outside of the timer queue. 96 /// Integrated timer queue storage. This field should not be accessed outside of the timer queue.
96 pub(crate) timer_queue_item: TimerQueueItem, 97 pub(crate) timer_queue_item: TimerQueueItem,
97 #[cfg(feature = "trace")] 98
98 pub(crate) name: Option<&'static str>, 99 pub(crate) metadata: Metadata,
99 #[cfg(feature = "trace")] 100
100 pub(crate) id: u32, 101 #[cfg(feature = "rtos-trace")]
101 #[cfg(feature = "trace")]
102 all_tasks_next: AtomicPtr<TaskHeader>, 102 all_tasks_next: AtomicPtr<TaskHeader>,
103} 103}
104 104
@@ -129,6 +129,10 @@ impl TaskRef {
129 unsafe { self.ptr.as_ref() } 129 unsafe { self.ptr.as_ref() }
130 } 130 }
131 131
132 pub(crate) fn metadata(self) -> &'static Metadata {
133 unsafe { &self.ptr.as_ref().metadata }
134 }
135
132 /// Returns a reference to the executor that the task is currently running on. 136 /// Returns a reference to the executor that the task is currently running on.
133 pub unsafe fn executor(self) -> Option<&'static Executor> { 137 pub unsafe fn executor(self) -> Option<&'static Executor> {
134 let executor = self.header().executor.load(Ordering::Relaxed); 138 let executor = self.header().executor.load(Ordering::Relaxed);
@@ -148,6 +152,12 @@ impl TaskRef {
148 pub(crate) fn as_ptr(self) -> *const TaskHeader { 152 pub(crate) fn as_ptr(self) -> *const TaskHeader {
149 self.ptr.as_ptr() 153 self.ptr.as_ptr()
150 } 154 }
155
156 /// Returns the task ID.
157 /// This can be used in combination with rtos-trace to match task names with IDs
158 pub fn id(&self) -> u32 {
159 self.as_ptr() as u32
160 }
151} 161}
152 162
153/// Raw storage in which a task can be spawned. 163/// Raw storage in which a task can be spawned.
@@ -189,11 +199,8 @@ impl<F: Future + 'static> TaskStorage<F> {
189 poll_fn: SyncUnsafeCell::new(None), 199 poll_fn: SyncUnsafeCell::new(None),
190 200
191 timer_queue_item: TimerQueueItem::new(), 201 timer_queue_item: TimerQueueItem::new(),
192 #[cfg(feature = "trace")] 202 metadata: Metadata::new(),
193 name: None, 203 #[cfg(feature = "rtos-trace")]
194 #[cfg(feature = "trace")]
195 id: 0,
196 #[cfg(feature = "trace")]
197 all_tasks_next: AtomicPtr::new(core::ptr::null_mut()), 204 all_tasks_next: AtomicPtr::new(core::ptr::null_mut()),
198 }, 205 },
199 future: UninitCell::uninit(), 206 future: UninitCell::uninit(),
@@ -213,11 +220,11 @@ impl<F: Future + 'static> TaskStorage<F> {
213 /// 220 ///
214 /// Once the task has finished running, you may spawn it again. It is allowed to spawn it 221 /// Once the task has finished running, you may spawn it again. It is allowed to spawn it
215 /// on a different executor. 222 /// on a different executor.
216 pub fn spawn(&'static self, future: impl FnOnce() -> F) -> SpawnToken<impl Sized> { 223 pub fn spawn(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<impl Sized>, SpawnError> {
217 let task = AvailableTask::claim(self); 224 let task = AvailableTask::claim(self);
218 match task { 225 match task {
219 Some(task) => task.initialize(future), 226 Some(task) => Ok(task.initialize(future)),
220 None => SpawnToken::new_failed(), 227 None => Err(SpawnError::Busy),
221 } 228 }
222 } 229 }
223 230
@@ -229,7 +236,7 @@ impl<F: Future + 'static> TaskStorage<F> {
229 let mut cx = Context::from_waker(&waker); 236 let mut cx = Context::from_waker(&waker);
230 match future.poll(&mut cx) { 237 match future.poll(&mut cx) {
231 Poll::Ready(_) => { 238 Poll::Ready(_) => {
232 #[cfg(feature = "trace")] 239 #[cfg(feature = "_any_trace")]
233 let exec_ptr: *const SyncExecutor = this.raw.executor.load(Ordering::Relaxed); 240 let exec_ptr: *const SyncExecutor = this.raw.executor.load(Ordering::Relaxed);
234 241
235 // As the future has finished and this function will not be called 242 // As the future has finished and this function will not be called
@@ -244,7 +251,7 @@ impl<F: Future + 'static> TaskStorage<F> {
244 // after we're done with it. 251 // after we're done with it.
245 this.raw.state.despawn(); 252 this.raw.state.despawn();
246 253
247 #[cfg(feature = "trace")] 254 #[cfg(feature = "_any_trace")]
248 trace::task_end(exec_ptr, &p); 255 trace::task_end(exec_ptr, &p);
249 } 256 }
250 Poll::Pending => {} 257 Poll::Pending => {}
@@ -279,6 +286,7 @@ impl<F: Future + 'static> AvailableTask<F> {
279 286
280 fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> { 287 fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> {
281 unsafe { 288 unsafe {
289 self.task.raw.metadata.reset();
282 self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll)); 290 self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll));
283 self.task.future.write_in_place(future); 291 self.task.future.write_in_place(future);
284 292
@@ -345,10 +353,10 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
345 } 353 }
346 } 354 }
347 355
348 fn spawn_impl<T>(&'static self, future: impl FnOnce() -> F) -> SpawnToken<T> { 356 fn spawn_impl<T>(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<T>, SpawnError> {
349 match self.pool.iter().find_map(AvailableTask::claim) { 357 match self.pool.iter().find_map(AvailableTask::claim) {
350 Some(task) => task.initialize_impl::<T>(future), 358 Some(task) => Ok(task.initialize_impl::<T>(future)),
351 None => SpawnToken::new_failed(), 359 None => Err(SpawnError::Busy),
352 } 360 }
353 } 361 }
354 362
@@ -359,7 +367,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
359 /// This will loop over the pool and spawn the task in the first storage that 367 /// This will loop over the pool and spawn the task in the first storage that
360 /// is currently free. If none is free, a "poisoned" SpawnToken is returned, 368 /// is currently free. If none is free, a "poisoned" SpawnToken is returned,
361 /// which will cause [`Spawner::spawn()`](super::Spawner::spawn) to return the error. 369 /// which will cause [`Spawner::spawn()`](super::Spawner::spawn) to return the error.
362 pub fn spawn(&'static self, future: impl FnOnce() -> F) -> SpawnToken<impl Sized> { 370 pub fn spawn(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<impl Sized>, SpawnError> {
363 self.spawn_impl::<F>(future) 371 self.spawn_impl::<F>(future)
364 } 372 }
365 373
@@ -372,7 +380,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
372 /// SAFETY: `future` must be a closure of the form `move || my_async_fn(args)`, where `my_async_fn` 380 /// SAFETY: `future` must be a closure of the form `move || my_async_fn(args)`, where `my_async_fn`
373 /// is an `async fn`, NOT a hand-written `Future`. 381 /// is an `async fn`, NOT a hand-written `Future`.
374 #[doc(hidden)] 382 #[doc(hidden)]
375 pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> SpawnToken<impl Sized> 383 pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> Result<SpawnToken<impl Sized>, SpawnError>
376 where 384 where
377 FutFn: FnOnce() -> F, 385 FutFn: FnOnce() -> F,
378 { 386 {
@@ -417,7 +425,7 @@ impl SyncExecutor {
417 /// - `task` must NOT be already enqueued (in this executor or another one). 425 /// - `task` must NOT be already enqueued (in this executor or another one).
418 #[inline(always)] 426 #[inline(always)]
419 unsafe fn enqueue(&self, task: TaskRef, l: state::Token) { 427 unsafe fn enqueue(&self, task: TaskRef, l: state::Token) {
420 #[cfg(feature = "trace")] 428 #[cfg(feature = "_any_trace")]
421 trace::task_ready_begin(self, &task); 429 trace::task_ready_begin(self, &task);
422 430
423 if self.run_queue.enqueue(task, l) { 431 if self.run_queue.enqueue(task, l) {
@@ -430,7 +438,7 @@ impl SyncExecutor {
430 .executor 438 .executor
431 .store((self as *const Self).cast_mut(), Ordering::Relaxed); 439 .store((self as *const Self).cast_mut(), Ordering::Relaxed);
432 440
433 #[cfg(feature = "trace")] 441 #[cfg(feature = "_any_trace")]
434 trace::task_new(self, &task); 442 trace::task_new(self, &task);
435 443
436 state::locked(|l| { 444 state::locked(|l| {
@@ -442,23 +450,23 @@ impl SyncExecutor {
442 /// 450 ///
443 /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created. 451 /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created.
444 pub(crate) unsafe fn poll(&'static self) { 452 pub(crate) unsafe fn poll(&'static self) {
445 #[cfg(feature = "trace")] 453 #[cfg(feature = "_any_trace")]
446 trace::poll_start(self); 454 trace::poll_start(self);
447 455
448 self.run_queue.dequeue_all(|p| { 456 self.run_queue.dequeue_all(|p| {
449 let task = p.header(); 457 let task = p.header();
450 458
451 #[cfg(feature = "trace")] 459 #[cfg(feature = "_any_trace")]
452 trace::task_exec_begin(self, &p); 460 trace::task_exec_begin(self, &p);
453 461
454 // Run the task 462 // Run the task
455 task.poll_fn.get().unwrap_unchecked()(p); 463 task.poll_fn.get().unwrap_unchecked()(p);
456 464
457 #[cfg(feature = "trace")] 465 #[cfg(feature = "_any_trace")]
458 trace::task_exec_end(self, &p); 466 trace::task_exec_end(self, &p);
459 }); 467 });
460 468
461 #[cfg(feature = "trace")] 469 #[cfg(feature = "_any_trace")]
462 trace::executor_idle(self) 470 trace::executor_idle(self)
463 } 471 }
464} 472}
diff --git a/embassy-executor/src/raw/trace.rs b/embassy-executor/src/raw/trace.rs
index f484abf58..b3086948c 100644
--- a/embassy-executor/src/raw/trace.rs
+++ b/embassy-executor/src/raw/trace.rs
@@ -95,17 +95,20 @@ use crate::spawner::{SpawnError, SpawnToken, Spawner};
95/// This static provides access to the global task tracker which maintains 95/// This static provides access to the global task tracker which maintains
96/// a list of all tasks in the system. It's automatically updated by the 96/// a list of all tasks in the system. It's automatically updated by the
97/// task lifecycle hooks in the trace module. 97/// task lifecycle hooks in the trace module.
98pub static TASK_TRACKER: TaskTracker = TaskTracker::new(); 98#[cfg(feature = "rtos-trace")]
99pub(crate) static TASK_TRACKER: TaskTracker = TaskTracker::new();
99 100
100/// A thread-safe tracker for all tasks in the system 101/// A thread-safe tracker for all tasks in the system
101/// 102///
102/// This struct uses an intrusive linked list approach to track all tasks 103/// This struct uses an intrusive linked list approach to track all tasks
103/// without additional memory allocations. It maintains a global list of 104/// without additional memory allocations. It maintains a global list of
104/// tasks that can be traversed to find all currently existing tasks. 105/// tasks that can be traversed to find all currently existing tasks.
105pub struct TaskTracker { 106#[cfg(feature = "rtos-trace")]
107pub(crate) struct TaskTracker {
106 head: AtomicPtr<TaskHeader>, 108 head: AtomicPtr<TaskHeader>,
107} 109}
108 110
111#[cfg(feature = "rtos-trace")]
109impl TaskTracker { 112impl TaskTracker {
110 /// Creates a new empty task tracker 113 /// Creates a new empty task tracker
111 /// 114 ///
@@ -125,7 +128,7 @@ impl TaskTracker {
125 /// # Arguments 128 /// # Arguments
126 /// * `task` - The task reference to add to the tracker 129 /// * `task` - The task reference to add to the tracker
127 pub fn add(&self, task: TaskRef) { 130 pub fn add(&self, task: TaskRef) {
128 let task_ptr = task.as_ptr() as *mut TaskHeader; 131 let task_ptr = task.as_ptr();
129 132
130 loop { 133 loop {
131 let current_head = self.head.load(Ordering::Acquire); 134 let current_head = self.head.load(Ordering::Acquire);
@@ -135,7 +138,7 @@ impl TaskTracker {
135 138
136 if self 139 if self
137 .head 140 .head
138 .compare_exchange(current_head, task_ptr, Ordering::Release, Ordering::Relaxed) 141 .compare_exchange(current_head, task_ptr.cast_mut(), Ordering::Release, Ordering::Relaxed)
139 .is_ok() 142 .is_ok()
140 { 143 {
141 break; 144 break;
@@ -165,50 +168,7 @@ impl TaskTracker {
165 } 168 }
166} 169}
167 170
168/// Extension trait for `TaskRef` that provides tracing functionality. 171#[cfg(feature = "trace")]
169///
170/// This trait is only available when the `trace` feature is enabled.
171/// It extends `TaskRef` with methods for accessing and modifying task identifiers
172/// and names, which are useful for debugging, logging, and performance analysis.
173pub trait TaskRefTrace {
174 /// Get the name for a task
175 fn name(&self) -> Option<&'static str>;
176
177 /// Set the name for a task
178 fn set_name(&self, name: Option<&'static str>);
179
180 /// Get the ID for a task
181 fn id(&self) -> u32;
182
183 /// Set the ID for a task
184 fn set_id(&self, id: u32);
185}
186
187impl TaskRefTrace for TaskRef {
188 fn name(&self) -> Option<&'static str> {
189 self.header().name
190 }
191
192 fn set_name(&self, name: Option<&'static str>) {
193 unsafe {
194 let header_ptr = self.ptr.as_ptr() as *mut TaskHeader;
195 (*header_ptr).name = name;
196 }
197 }
198
199 fn id(&self) -> u32 {
200 self.header().id
201 }
202
203 fn set_id(&self, id: u32) {
204 unsafe {
205 let header_ptr = self.ptr.as_ptr() as *mut TaskHeader;
206 (*header_ptr).id = id;
207 }
208 }
209}
210
211#[cfg(not(feature = "rtos-trace"))]
212extern "Rust" { 172extern "Rust" {
213 /// This callback is called when the executor begins polling. This will always 173 /// This callback is called when the executor begins polling. This will always
214 /// be paired with a later call to `_embassy_trace_executor_idle`. 174 /// be paired with a later call to `_embassy_trace_executor_idle`.
@@ -270,7 +230,7 @@ extern "Rust" {
270 230
271#[inline] 231#[inline]
272pub(crate) fn poll_start(executor: &SyncExecutor) { 232pub(crate) fn poll_start(executor: &SyncExecutor) {
273 #[cfg(not(feature = "rtos-trace"))] 233 #[cfg(feature = "trace")]
274 unsafe { 234 unsafe {
275 _embassy_trace_poll_start(executor as *const _ as u32) 235 _embassy_trace_poll_start(executor as *const _ as u32)
276 } 236 }
@@ -278,7 +238,7 @@ pub(crate) fn poll_start(executor: &SyncExecutor) {
278 238
279#[inline] 239#[inline]
280pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) { 240pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) {
281 #[cfg(not(feature = "rtos-trace"))] 241 #[cfg(feature = "trace")]
282 unsafe { 242 unsafe {
283 _embassy_trace_task_new(executor as *const _ as u32, task.as_ptr() as u32) 243 _embassy_trace_task_new(executor as *const _ as u32, task.as_ptr() as u32)
284 } 244 }
@@ -286,7 +246,7 @@ pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) {
286 #[cfg(feature = "rtos-trace")] 246 #[cfg(feature = "rtos-trace")]
287 { 247 {
288 rtos_trace::trace::task_new(task.as_ptr() as u32); 248 rtos_trace::trace::task_new(task.as_ptr() as u32);
289 let name = task.name().unwrap_or("unnamed task\0"); 249 let name = task.metadata().name().unwrap_or("unnamed task\0");
290 let info = rtos_trace::TaskInfo { 250 let info = rtos_trace::TaskInfo {
291 name, 251 name,
292 priority: 0, 252 priority: 0,
@@ -302,7 +262,7 @@ pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) {
302 262
303#[inline] 263#[inline]
304pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) { 264pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) {
305 #[cfg(not(feature = "rtos-trace"))] 265 #[cfg(feature = "trace")]
306 unsafe { 266 unsafe {
307 _embassy_trace_task_end(executor as u32, task.as_ptr() as u32) 267 _embassy_trace_task_end(executor as u32, task.as_ptr() as u32)
308 } 268 }
@@ -310,7 +270,7 @@ pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) {
310 270
311#[inline] 271#[inline]
312pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) { 272pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) {
313 #[cfg(not(feature = "rtos-trace"))] 273 #[cfg(feature = "trace")]
314 unsafe { 274 unsafe {
315 _embassy_trace_task_ready_begin(executor as *const _ as u32, task.as_ptr() as u32) 275 _embassy_trace_task_ready_begin(executor as *const _ as u32, task.as_ptr() as u32)
316 } 276 }
@@ -320,7 +280,7 @@ pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) {
320 280
321#[inline] 281#[inline]
322pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) { 282pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) {
323 #[cfg(not(feature = "rtos-trace"))] 283 #[cfg(feature = "trace")]
324 unsafe { 284 unsafe {
325 _embassy_trace_task_exec_begin(executor as *const _ as u32, task.as_ptr() as u32) 285 _embassy_trace_task_exec_begin(executor as *const _ as u32, task.as_ptr() as u32)
326 } 286 }
@@ -330,7 +290,7 @@ pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) {
330 290
331#[inline] 291#[inline]
332pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) { 292pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) {
333 #[cfg(not(feature = "rtos-trace"))] 293 #[cfg(feature = "trace")]
334 unsafe { 294 unsafe {
335 _embassy_trace_task_exec_end(executor as *const _ as u32, task.as_ptr() as u32) 295 _embassy_trace_task_exec_end(executor as *const _ as u32, task.as_ptr() as u32)
336 } 296 }
@@ -340,7 +300,7 @@ pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) {
340 300
341#[inline] 301#[inline]
342pub(crate) fn executor_idle(executor: &SyncExecutor) { 302pub(crate) fn executor_idle(executor: &SyncExecutor) {
343 #[cfg(not(feature = "rtos-trace"))] 303 #[cfg(feature = "trace")]
344 unsafe { 304 unsafe {
345 _embassy_trace_executor_idle(executor as *const _ as u32) 305 _embassy_trace_executor_idle(executor as *const _ as u32)
346 } 306 }
@@ -356,6 +316,7 @@ pub(crate) fn executor_idle(executor: &SyncExecutor) {
356/// 316///
357/// # Returns 317/// # Returns
358/// An iterator that yields `TaskRef` items for each task 318/// An iterator that yields `TaskRef` items for each task
319#[cfg(feature = "rtos-trace")]
359fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static { 320fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static {
360 struct TaskIterator<'a> { 321 struct TaskIterator<'a> {
361 tracker: &'a TaskTracker, 322 tracker: &'a TaskTracker,
@@ -384,6 +345,7 @@ fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static {
384} 345}
385 346
386/// Perform an action on each active task 347/// Perform an action on each active task
348#[cfg(feature = "rtos-trace")]
387fn with_all_active_tasks<F>(f: F) 349fn with_all_active_tasks<F>(f: F)
388where 350where
389 F: FnMut(TaskRef), 351 F: FnMut(TaskRef),
@@ -395,9 +357,8 @@ where
395impl rtos_trace::RtosTraceOSCallbacks for crate::raw::SyncExecutor { 357impl rtos_trace::RtosTraceOSCallbacks for crate::raw::SyncExecutor {
396 fn task_list() { 358 fn task_list() {
397 with_all_active_tasks(|task| { 359 with_all_active_tasks(|task| {
398 let name = task.name().unwrap_or("unnamed task\0");
399 let info = rtos_trace::TaskInfo { 360 let info = rtos_trace::TaskInfo {
400 name, 361 name: task.metadata().name().unwrap_or("unnamed task\0"),
401 priority: 0, 362 priority: 0,
402 stack_base: 0, 363 stack_base: 0,
403 stack_size: 0, 364 stack_size: 0,
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs
index 2909d19a0..83d896b76 100644
--- a/embassy-executor/src/spawner.rs
+++ b/embassy-executor/src/spawner.rs
@@ -5,8 +5,7 @@ use core::sync::atomic::Ordering;
5use core::task::Poll; 5use core::task::Poll;
6 6
7use super::raw; 7use super::raw;
8#[cfg(feature = "trace")] 8use crate::Metadata;
9use crate::raw::trace::TaskRefTrace;
10 9
11/// Token to spawn a newly-created task in an executor. 10/// Token to spawn a newly-created task in an executor.
12/// 11///
@@ -24,33 +23,28 @@ use crate::raw::trace::TaskRefTrace;
24/// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it. 23/// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it.
25#[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"] 24#[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"]
26pub struct SpawnToken<S> { 25pub struct SpawnToken<S> {
27 pub(crate) raw_task: Option<raw::TaskRef>, 26 pub(crate) raw_task: raw::TaskRef,
28 phantom: PhantomData<*mut S>, 27 phantom: PhantomData<*mut S>,
29} 28}
30 29
31impl<S> SpawnToken<S> { 30impl<S> SpawnToken<S> {
32 pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self { 31 pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self {
33 Self { 32 Self {
34 raw_task: Some(raw_task), 33 raw_task,
35 phantom: PhantomData, 34 phantom: PhantomData,
36 } 35 }
37 } 36 }
38 37
39 /// Returns the task id if available, otherwise 0 38 /// Returns the task ID.
40 /// This can be used in combination with rtos-trace to match task names with id's 39 /// This can be used in combination with rtos-trace to match task names with IDs
41 pub fn id(&self) -> u32 { 40 pub fn id(&self) -> u32 {
42 match self.raw_task { 41 self.raw_task.id()
43 None => 0,
44 Some(t) => t.as_ptr() as u32,
45 }
46 } 42 }
47 43
48 /// Return a SpawnToken that represents a failed spawn. 44 /// Get the metadata for this task. You can use this to set metadata fields
49 pub fn new_failed() -> Self { 45 /// prior to spawning it.
50 Self { 46 pub fn metadata(&self) -> &Metadata {
51 raw_task: None, 47 self.raw_task.metadata()
52 phantom: PhantomData,
53 }
54 } 48 }
55} 49}
56 50
@@ -159,30 +153,10 @@ impl Spawner {
159 /// Spawn a task into an executor. 153 /// Spawn a task into an executor.
160 /// 154 ///
161 /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). 155 /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`).
162 pub fn spawn<S>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 156 pub fn spawn<S>(&self, token: SpawnToken<S>) {
163 let task = token.raw_task; 157 let task = token.raw_task;
164 mem::forget(token); 158 mem::forget(token);
165 159 unsafe { self.executor.spawn(task) }
166 match task {
167 Some(task) => {
168 unsafe { self.executor.spawn(task) };
169 Ok(())
170 }
171 None => Err(SpawnError::Busy),
172 }
173 }
174
175 // Used by the `embassy_executor_macros::main!` macro to throw an error when spawn
176 // fails. This is here to allow conditional use of `defmt::unwrap!`
177 // without introducing a `defmt` feature in the `embassy_executor_macros` package,
178 // which would require use of `-Z namespaced-features`.
179 /// Spawn a task into an executor, panicking on failure.
180 ///
181 /// # Panics
182 ///
183 /// Panics if the spawning fails.
184 pub fn must_spawn<S>(&self, token: SpawnToken<S>) {
185 unwrap!(self.spawn(token));
186 } 160 }
187 161
188 /// Convert this Spawner to a SendSpawner. This allows you to send the 162 /// Convert this Spawner to a SendSpawner. This allows you to send the
@@ -198,53 +172,6 @@ impl Spawner {
198 } 172 }
199} 173}
200 174
201/// Extension trait adding tracing capabilities to the Spawner
202///
203/// This trait provides an additional method to spawn tasks with an associated name,
204/// which can be useful for debugging and tracing purposes.
205pub trait SpawnerTraceExt {
206 /// Spawns a new task with a specified name.
207 ///
208 /// # Arguments
209 /// * `name` - Static string name to associate with the task
210 /// * `token` - Token representing the task to spawn
211 ///
212 /// # Returns
213 /// Result indicating whether the spawn was successful
214 fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError>;
215}
216
217/// Implementation of the SpawnerTraceExt trait for Spawner when trace is enabled
218#[cfg(feature = "trace")]
219impl SpawnerTraceExt for Spawner {
220 fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> {
221 let task = token.raw_task;
222 core::mem::forget(token);
223
224 match task {
225 Some(task) => {
226 // Set the name and ID when trace is enabled
227 task.set_name(Some(name));
228 let task_id = task.as_ptr() as u32;
229 task.set_id(task_id);
230
231 unsafe { self.executor.spawn(task) };
232 Ok(())
233 }
234 None => Err(SpawnError::Busy),
235 }
236 }
237}
238
239/// Implementation of the SpawnerTraceExt trait for Spawner when trace is disabled
240#[cfg(not(feature = "trace"))]
241impl SpawnerTraceExt for Spawner {
242 fn spawn_named<S>(&self, _name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> {
243 // When trace is disabled, just forward to regular spawn and ignore the name
244 self.spawn(token)
245 }
246}
247
248/// Handle to spawn tasks into an executor from any thread. 175/// Handle to spawn tasks into an executor from any thread.
249/// 176///
250/// This Spawner can be used from any thread (it is Send), but it can 177/// This Spawner can be used from any thread (it is Send), but it can
@@ -287,25 +214,9 @@ impl SendSpawner {
287 /// Spawn a task into an executor. 214 /// Spawn a task into an executor.
288 /// 215 ///
289 /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). 216 /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`).
290 pub fn spawn<S: Send>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 217 pub fn spawn<S: Send>(&self, token: SpawnToken<S>) {
291 let header = token.raw_task; 218 let header = token.raw_task;
292 mem::forget(token); 219 mem::forget(token);
293 220 unsafe { self.executor.spawn(header) }
294 match header {
295 Some(header) => {
296 unsafe { self.executor.spawn(header) };
297 Ok(())
298 }
299 None => Err(SpawnError::Busy),
300 }
301 }
302
303 /// Spawn a task into an executor, panicking on failure.
304 ///
305 /// # Panics
306 ///
307 /// Panics if the spawning fails.
308 pub fn must_spawn<S: Send>(&self, token: SpawnToken<S>) {
309 unwrap!(self.spawn(token));
310 } 221 }
311} 222}
diff --git a/embassy-executor/tests/test.rs b/embassy-executor/tests/test.rs
index b84d3785a..6baf3dc21 100644
--- a/embassy-executor/tests/test.rs
+++ b/embassy-executor/tests/test.rs
@@ -65,7 +65,7 @@ fn executor_task() {
65 } 65 }
66 66
67 let (executor, trace) = setup(); 67 let (executor, trace) = setup();
68 executor.spawner().spawn(task1(trace.clone())).unwrap(); 68 executor.spawner().spawn(task1(trace.clone()).unwrap());
69 69
70 unsafe { executor.poll() }; 70 unsafe { executor.poll() };
71 unsafe { executor.poll() }; 71 unsafe { executor.poll() };
@@ -93,7 +93,7 @@ fn executor_task_rpit() {
93 } 93 }
94 94
95 let (executor, trace) = setup(); 95 let (executor, trace) = setup();
96 executor.spawner().spawn(task1(trace.clone())).unwrap(); 96 executor.spawner().spawn(task1(trace.clone()).unwrap());
97 97
98 unsafe { executor.poll() }; 98 unsafe { executor.poll() };
99 unsafe { executor.poll() }; 99 unsafe { executor.poll() };
@@ -120,7 +120,7 @@ fn executor_task_self_wake() {
120 } 120 }
121 121
122 let (executor, trace) = setup(); 122 let (executor, trace) = setup();
123 executor.spawner().spawn(task1(trace.clone())).unwrap(); 123 executor.spawner().spawn(task1(trace.clone()).unwrap());
124 124
125 unsafe { executor.poll() }; 125 unsafe { executor.poll() };
126 unsafe { executor.poll() }; 126 unsafe { executor.poll() };
@@ -152,7 +152,7 @@ fn executor_task_self_wake_twice() {
152 } 152 }
153 153
154 let (executor, trace) = setup(); 154 let (executor, trace) = setup();
155 executor.spawner().spawn(task1(trace.clone())).unwrap(); 155 executor.spawner().spawn(task1(trace.clone()).unwrap());
156 156
157 unsafe { executor.poll() }; 157 unsafe { executor.poll() };
158 unsafe { executor.poll() }; 158 unsafe { executor.poll() };
@@ -188,7 +188,7 @@ fn waking_after_completion_does_not_poll() {
188 let waker = Box::leak(Box::new(AtomicWaker::new())); 188 let waker = Box::leak(Box::new(AtomicWaker::new()));
189 189
190 let (executor, trace) = setup(); 190 let (executor, trace) = setup();
191 executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); 191 executor.spawner().spawn(task1(trace.clone(), waker).unwrap());
192 192
193 unsafe { executor.poll() }; 193 unsafe { executor.poll() };
194 waker.wake(); 194 waker.wake();
@@ -200,7 +200,7 @@ fn waking_after_completion_does_not_poll() {
200 unsafe { executor.poll() }; // Clears running status 200 unsafe { executor.poll() }; // Clears running status
201 201
202 // Can respawn waken-but-dead task 202 // Can respawn waken-but-dead task
203 executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); 203 executor.spawner().spawn(task1(trace.clone(), waker).unwrap());
204 204
205 unsafe { executor.poll() }; 205 unsafe { executor.poll() };
206 206
@@ -250,7 +250,7 @@ fn waking_with_old_waker_after_respawn() {
250 let waker = Box::leak(Box::new(AtomicWaker::new())); 250 let waker = Box::leak(Box::new(AtomicWaker::new()));
251 251
252 let (executor, trace) = setup(); 252 let (executor, trace) = setup();
253 executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); 253 executor.spawner().spawn(task1(trace.clone(), waker).unwrap());
254 254
255 unsafe { executor.poll() }; 255 unsafe { executor.poll() };
256 unsafe { executor.poll() }; // progress to registering the waker 256 unsafe { executor.poll() }; // progress to registering the waker
@@ -273,8 +273,7 @@ fn waking_with_old_waker_after_respawn() {
273 let (other_executor, other_trace) = setup(); 273 let (other_executor, other_trace) = setup();
274 other_executor 274 other_executor
275 .spawner() 275 .spawner()
276 .spawn(task1(other_trace.clone(), waker)) 276 .spawn(task1(other_trace.clone(), waker).unwrap());
277 .unwrap();
278 277
279 unsafe { other_executor.poll() }; // just run to the yield_now 278 unsafe { other_executor.poll() }; // just run to the yield_now
280 waker.wake(); // trigger old waker registration 279 waker.wake(); // trigger old waker registration
@@ -323,6 +322,37 @@ fn recursive_task() {
323 #[embassy_executor::task(pool_size = 2)] 322 #[embassy_executor::task(pool_size = 2)]
324 async fn task1() { 323 async fn task1() {
325 let spawner = unsafe { Spawner::for_current_executor().await }; 324 let spawner = unsafe { Spawner::for_current_executor().await };
326 spawner.spawn(task1()); 325 spawner.spawn(task1().unwrap());
327 } 326 }
328} 327}
328
329#[cfg(feature = "metadata-name")]
330#[test]
331fn task_metadata() {
332 #[task]
333 async fn task1(expected_name: Option<&'static str>) {
334 use embassy_executor::Metadata;
335 assert_eq!(Metadata::for_current_task().await.name(), expected_name);
336 }
337
338 // check no task name
339 let (executor, _) = setup();
340 executor.spawner().spawn(task1(None).unwrap());
341 unsafe { executor.poll() };
342
343 // check setting task name
344 let token = task1(Some("foo")).unwrap();
345 token.metadata().set_name("foo");
346 executor.spawner().spawn(token);
347 unsafe { executor.poll() };
348
349 let token = task1(Some("bar")).unwrap();
350 token.metadata().set_name("bar");
351 executor.spawner().spawn(token);
352 unsafe { executor.poll() };
353
354 // check name is cleared if the task pool slot is recycled.
355 let (executor, _) = setup();
356 executor.spawner().spawn(task1(None).unwrap());
357 unsafe { executor.poll() };
358}
diff --git a/embassy-executor/tests/ui/return_impl_future_nonsend.rs b/embassy-executor/tests/ui/return_impl_future_nonsend.rs
index b8c184b21..77b3119d6 100644
--- a/embassy-executor/tests/ui/return_impl_future_nonsend.rs
+++ b/embassy-executor/tests/ui/return_impl_future_nonsend.rs
@@ -15,7 +15,7 @@ fn task() -> impl Future<Output = ()> {
15} 15}
16 16
17fn send_spawn(s: SendSpawner) { 17fn send_spawn(s: SendSpawner) {
18 s.spawn(task()).unwrap(); 18 s.spawn(task().unwrap());
19} 19}
20 20
21fn main() {} 21fn main() {}
diff --git a/embassy-executor/tests/ui/return_impl_future_nonsend.stderr b/embassy-executor/tests/ui/return_impl_future_nonsend.stderr
index 8aeb9738a..51944ad65 100644
--- a/embassy-executor/tests/ui/return_impl_future_nonsend.stderr
+++ b/embassy-executor/tests/ui/return_impl_future_nonsend.stderr
@@ -1,8 +1,8 @@
1error: future cannot be sent between threads safely 1error: future cannot be sent between threads safely
2 --> tests/ui/return_impl_future_nonsend.rs:18:13 2 --> tests/ui/return_impl_future_nonsend.rs:18:13
3 | 3 |
418 | s.spawn(task()).unwrap(); 418 | s.spawn(task().unwrap());
5 | ^^^^^^ future created by async block is not `Send` 5 | ^^^^^^^^^^^^^^^ future created by async block is not `Send`
6 | 6 |
7 = help: within `impl Sized`, the trait `Send` is not implemented for `*mut ()` 7 = help: within `impl Sized`, the trait `Send` is not implemented for `*mut ()`
8note: captured value is not `Send` 8note: captured value is not `Send`
@@ -13,5 +13,5 @@ note: captured value is not `Send`
13note: required by a bound in `SendSpawner::spawn` 13note: required by a bound in `SendSpawner::spawn`
14 --> src/spawner.rs 14 --> src/spawner.rs
15 | 15 |
16 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 16 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) {
17 | ^^^^ required by this bound in `SendSpawner::spawn` 17 | ^^^^ required by this bound in `SendSpawner::spawn`
diff --git a/embassy-executor/tests/ui/return_impl_send.stderr b/embassy-executor/tests/ui/return_impl_send.stderr
index 759be1cde..5d19465ec 100644
--- a/embassy-executor/tests/ui/return_impl_send.stderr
+++ b/embassy-executor/tests/ui/return_impl_send.stderr
@@ -97,7 +97,7 @@ note: required by a bound in `TaskPool::<F, N>::spawn`
97 | impl<F: Future + 'static, const N: usize> TaskPool<F, N> { 97 | impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
98 | ^^^^^^ required by this bound in `TaskPool::<F, N>::spawn` 98 | ^^^^^^ required by this bound in `TaskPool::<F, N>::spawn`
99... 99...
100 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> SpawnToken<impl Sized> { 100 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<impl Sized>, SpawnError> {
101 | ----- required by a bound in this associated function 101 | ----- required by a bound in this associated function
102 = note: this error originates in the attribute macro `embassy_executor::task` (in Nightly builds, run with -Z macro-backtrace for more info) 102 = note: this error originates in the attribute macro `embassy_executor::task` (in Nightly builds, run with -Z macro-backtrace for more info)
103 103
diff --git a/embassy-executor/tests/ui/spawn_nonsend.rs b/embassy-executor/tests/ui/spawn_nonsend.rs
index 4c4cc7697..601041941 100644
--- a/embassy-executor/tests/ui/spawn_nonsend.rs
+++ b/embassy-executor/tests/ui/spawn_nonsend.rs
@@ -10,7 +10,7 @@ async fn task(non_send: *mut ()) {
10} 10}
11 11
12fn send_spawn(s: SendSpawner) { 12fn send_spawn(s: SendSpawner) {
13 s.spawn(task(core::ptr::null_mut())).unwrap(); 13 s.spawn(task(core::ptr::null_mut()).unwrap());
14} 14}
15 15
16fn main() {} 16fn main() {}
diff --git a/embassy-executor/tests/ui/spawn_nonsend.stderr b/embassy-executor/tests/ui/spawn_nonsend.stderr
index 2a06c8b94..25bd7d78d 100644
--- a/embassy-executor/tests/ui/spawn_nonsend.stderr
+++ b/embassy-executor/tests/ui/spawn_nonsend.stderr
@@ -12,8 +12,8 @@ error[E0277]: `*mut ()` cannot be sent between threads safely
127 | #[embassy_executor::task] 127 | #[embassy_executor::task]
13 | ------------------------- within this `impl Sized` 13 | ------------------------- within this `impl Sized`
14... 14...
1513 | s.spawn(task(core::ptr::null_mut())).unwrap(); 1513 | s.spawn(task(core::ptr::null_mut()).unwrap());
16 | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be sent between threads safely 16 | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `*mut ()` cannot be sent between threads safely
17 | | 17 | |
18 | required by a bound introduced by this call 18 | required by a bound introduced by this call
19 | 19 |
@@ -26,8 +26,8 @@ note: required because it's used within this closure
26note: required because it appears within the type `impl Sized` 26note: required because it appears within the type `impl Sized`
27 --> src/raw/mod.rs 27 --> src/raw/mod.rs
28 | 28 |
29 | pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> SpawnToken<impl Sized> 29 | pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> Result<SpawnToken<impl Sized>, SpawnError>
30 | ^^^^^^^^^^ 30 | ^^^^^^^^^^
31note: required because it appears within the type `impl Sized` 31note: required because it appears within the type `impl Sized`
32 --> tests/ui/spawn_nonsend.rs:7:1 32 --> tests/ui/spawn_nonsend.rs:7:1
33 | 33 |
@@ -36,6 +36,6 @@ note: required because it appears within the type `impl Sized`
36note: required by a bound in `SendSpawner::spawn` 36note: required by a bound in `SendSpawner::spawn`
37 --> src/spawner.rs 37 --> src/spawner.rs
38 | 38 |
39 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 39 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) {
40 | ^^^^ required by this bound in `SendSpawner::spawn` 40 | ^^^^ required by this bound in `SendSpawner::spawn`
41 = note: this error originates in the attribute macro `embassy_executor::task` (in Nightly builds, run with -Z macro-backtrace for more info) 41 = note: this error originates in the attribute macro `embassy_executor::task` (in Nightly builds, run with -Z macro-backtrace for more info)
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index 0bc6ffe6c..3f0634849 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -464,7 +464,7 @@ impl<'d> Stack<'d> {
464 /// seed 464 /// seed
465 /// ); 465 /// );
466 /// // Launch network task that runs `runner.run().await` 466 /// // Launch network task that runs `runner.run().await`
467 /// spawner.spawn(net_task(runner)).unwrap(); 467 /// spawner.spawn(net_task(runner).unwrap());
468 /// // Wait for DHCP config 468 /// // Wait for DHCP config
469 /// stack.wait_config_up().await; 469 /// stack.wait_config_up().await;
470 /// // use the network stack 470 /// // use the network stack
diff --git a/embassy-rp/src/multicore.rs b/embassy-rp/src/multicore.rs
index 64065fcba..adedc98ad 100644
--- a/embassy-rp/src/multicore.rs
+++ b/embassy-rp/src/multicore.rs
@@ -38,11 +38,11 @@
38//! 38//!
39//! embassy_rp::multicore::spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || { 39//! embassy_rp::multicore::spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || {
40//! let executor1 = EXECUTOR1.init(Executor::new()); 40//! let executor1 = EXECUTOR1.init(Executor::new());
41//! executor1.run(|spawner| spawner.spawn(core1_task()).unwrap()); 41//! executor1.run(|spawner| spawner.spawn(core1_task().unwrap()));
42//! }); 42//! });
43//! 43//!
44//! let executor0 = EXECUTOR0.init(Executor::new()); 44//! let executor0 = EXECUTOR0.init(Executor::new());
45//! executor0.run(|spawner| spawner.spawn(core0_task()).unwrap()) 45//! executor0.run(|spawner| spawner.spawn(core0_task().unwrap()))
46//! } 46//! }
47//! ``` 47//! ```
48 48
diff --git a/embassy-stm32/src/low_power.rs b/embassy-stm32/src/low_power.rs
index d13df5a6b..342f73bc8 100644
--- a/embassy-stm32/src/low_power.rs
+++ b/embassy-stm32/src/low_power.rs
@@ -29,7 +29,7 @@
29//! #[cortex_m_rt::entry] 29//! #[cortex_m_rt::entry]
30//! fn main() -> ! { 30//! fn main() -> ! {
31//! Executor::take().run(|spawner| { 31//! Executor::take().run(|spawner| {
32//! unwrap!(spawner.spawn(async_main(spawner))); 32//! spawner.spawn(unwrap!(async_main(spawner)));
33//! }); 33//! });
34//! } 34//! }
35//! 35//!
diff --git a/examples/mimxrt6/src/bin/uart-async.rs b/examples/mimxrt6/src/bin/uart-async.rs
index 58e31f379..d808d755c 100644
--- a/examples/mimxrt6/src/bin/uart-async.rs
+++ b/examples/mimxrt6/src/bin/uart-async.rs
@@ -69,7 +69,7 @@ async fn main(spawner: Spawner) {
69 Default::default(), 69 Default::default(),
70 ) 70 )
71 .unwrap(); 71 .unwrap();
72 spawner.must_spawn(usart4_task(usart4)); 72 spawner.spawn(usart4_task(usart4).unwrap());
73 73
74 let usart2 = Uart::new_with_rtscts( 74 let usart2 = Uart::new_with_rtscts(
75 p.FLEXCOMM2, 75 p.FLEXCOMM2,
@@ -83,5 +83,5 @@ async fn main(spawner: Spawner) {
83 Default::default(), 83 Default::default(),
84 ) 84 )
85 .unwrap(); 85 .unwrap();
86 spawner.must_spawn(usart2_task(usart2)); 86 spawner.spawn(usart2_task(usart2).unwrap());
87} 87}
diff --git a/examples/mimxrt6/src/bin/uart.rs b/examples/mimxrt6/src/bin/uart.rs
index d6a75f85d..1636c958f 100644
--- a/examples/mimxrt6/src/bin/uart.rs
+++ b/examples/mimxrt6/src/bin/uart.rs
@@ -48,8 +48,8 @@ async fn main(spawner: Spawner) {
48 let usart4 = Uart::new_blocking(p.FLEXCOMM4, p.PIO0_29, p.PIO0_30, Default::default()).unwrap(); 48 let usart4 = Uart::new_blocking(p.FLEXCOMM4, p.PIO0_29, p.PIO0_30, Default::default()).unwrap();
49 49
50 let (_, usart4) = usart4.split(); 50 let (_, usart4) = usart4.split();
51 spawner.must_spawn(usart4_task(usart4)); 51 spawner.spawn(usart4_task(usart4).unwrap());
52 52
53 let usart2 = UartTx::new_blocking(p.FLEXCOMM2, p.PIO0_15, Default::default()).unwrap(); 53 let usart2 = UartTx::new_blocking(p.FLEXCOMM2, p.PIO0_15, Default::default()).unwrap();
54 spawner.must_spawn(usart2_task(usart2)); 54 spawner.spawn(usart2_task(usart2).unwrap());
55} 55}
diff --git a/examples/nrf-rtos-trace/src/bin/rtos_trace.rs b/examples/nrf-rtos-trace/src/bin/rtos_trace.rs
index 41cc06417..c1e7f8f58 100644
--- a/examples/nrf-rtos-trace/src/bin/rtos_trace.rs
+++ b/examples/nrf-rtos-trace/src/bin/rtos_trace.rs
@@ -63,7 +63,7 @@ async fn main(spawner: Spawner) {
63 ::log::set_max_level(::log::LevelFilter::Trace); 63 ::log::set_max_level(::log::LevelFilter::Trace);
64 } 64 }
65 65
66 spawner.spawn(run1()).unwrap(); 66 spawner.spawn(run1().unwrap());
67 spawner.spawn(run2()).unwrap(); 67 spawner.spawn(run2().unwrap());
68 spawner.spawn(run3()).unwrap(); 68 spawner.spawn(run3().unwrap());
69} 69}
diff --git a/examples/nrf52840/src/bin/channel.rs b/examples/nrf52840/src/bin/channel.rs
index e06ba1c73..ffa539808 100644
--- a/examples/nrf52840/src/bin/channel.rs
+++ b/examples/nrf52840/src/bin/channel.rs
@@ -31,7 +31,7 @@ async fn main(spawner: Spawner) {
31 let p = embassy_nrf::init(Default::default()); 31 let p = embassy_nrf::init(Default::default());
32 let mut led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard); 32 let mut led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard);
33 33
34 unwrap!(spawner.spawn(my_task())); 34 spawner.spawn(unwrap!(my_task()));
35 35
36 loop { 36 loop {
37 match CHANNEL.receive().await { 37 match CHANNEL.receive().await {
diff --git a/examples/nrf52840/src/bin/channel_sender_receiver.rs b/examples/nrf52840/src/bin/channel_sender_receiver.rs
index 74c62ca20..09050db68 100644
--- a/examples/nrf52840/src/bin/channel_sender_receiver.rs
+++ b/examples/nrf52840/src/bin/channel_sender_receiver.rs
@@ -45,6 +45,6 @@ async fn main(spawner: Spawner) {
45 let p = embassy_nrf::init(Default::default()); 45 let p = embassy_nrf::init(Default::default());
46 let channel = CHANNEL.init(Channel::new()); 46 let channel = CHANNEL.init(Channel::new());
47 47
48 unwrap!(spawner.spawn(send_task(channel.sender()))); 48 spawner.spawn(unwrap!(send_task(channel.sender())));
49 unwrap!(spawner.spawn(recv_task(p.P0_13.into(), channel.receiver()))); 49 spawner.spawn(unwrap!(recv_task(p.P0_13.into(), channel.receiver())));
50} 50}
diff --git a/examples/nrf52840/src/bin/ethernet_enc28j60.rs b/examples/nrf52840/src/bin/ethernet_enc28j60.rs
index 0946492fe..3bb255a72 100644
--- a/examples/nrf52840/src/bin/ethernet_enc28j60.rs
+++ b/examples/nrf52840/src/bin/ethernet_enc28j60.rs
@@ -70,7 +70,7 @@ async fn main(spawner: Spawner) {
70 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 70 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
71 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 71 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
72 72
73 unwrap!(spawner.spawn(net_task(runner))); 73 spawner.spawn(unwrap!(net_task(runner)));
74 74
75 // And now we can use it! 75 // And now we can use it!
76 76
diff --git a/examples/nrf52840/src/bin/executor_fairness_test.rs b/examples/nrf52840/src/bin/executor_fairness_test.rs
index df6e7af3f..70c9405f0 100644
--- a/examples/nrf52840/src/bin/executor_fairness_test.rs
+++ b/examples/nrf52840/src/bin/executor_fairness_test.rs
@@ -36,7 +36,7 @@ async fn run3() {
36#[embassy_executor::main] 36#[embassy_executor::main]
37async fn main(spawner: Spawner) { 37async fn main(spawner: Spawner) {
38 let _p = embassy_nrf::init(Default::default()); 38 let _p = embassy_nrf::init(Default::default());
39 unwrap!(spawner.spawn(run1())); 39 spawner.spawn(unwrap!(run1()));
40 unwrap!(spawner.spawn(run2())); 40 spawner.spawn(unwrap!(run2()));
41 unwrap!(spawner.spawn(run3())); 41 spawner.spawn(unwrap!(run3()));
42} 42}
diff --git a/examples/nrf52840/src/bin/gpiote_port.rs b/examples/nrf52840/src/bin/gpiote_port.rs
index 0dddb1a97..66dbd32dc 100644
--- a/examples/nrf52840/src/bin/gpiote_port.rs
+++ b/examples/nrf52840/src/bin/gpiote_port.rs
@@ -26,8 +26,8 @@ async fn main(spawner: Spawner) {
26 let btn3 = Input::new(p.P0_24, Pull::Up); 26 let btn3 = Input::new(p.P0_24, Pull::Up);
27 let btn4 = Input::new(p.P0_25, Pull::Up); 27 let btn4 = Input::new(p.P0_25, Pull::Up);
28 28
29 unwrap!(spawner.spawn(button_task(1, btn1))); 29 spawner.spawn(unwrap!(button_task(1, btn1)));
30 unwrap!(spawner.spawn(button_task(2, btn2))); 30 spawner.spawn(unwrap!(button_task(2, btn2)));
31 unwrap!(spawner.spawn(button_task(3, btn3))); 31 spawner.spawn(unwrap!(button_task(3, btn3)));
32 unwrap!(spawner.spawn(button_task(4, btn4))); 32 spawner.spawn(unwrap!(button_task(4, btn4)));
33} 33}
diff --git a/examples/nrf52840/src/bin/manually_create_executor.rs b/examples/nrf52840/src/bin/manually_create_executor.rs
index 7ca39348e..f0639eb23 100644
--- a/examples/nrf52840/src/bin/manually_create_executor.rs
+++ b/examples/nrf52840/src/bin/manually_create_executor.rs
@@ -42,7 +42,7 @@ fn main() -> ! {
42 // `run` calls the closure then runs the executor forever. It never returns. 42 // `run` calls the closure then runs the executor forever. It never returns.
43 executor.run(|spawner| { 43 executor.run(|spawner| {
44 // Here we get access to a spawner to spawn the initial tasks. 44 // Here we get access to a spawner to spawn the initial tasks.
45 unwrap!(spawner.spawn(run1())); 45 spawner.spawn(unwrap!(run1()));
46 unwrap!(spawner.spawn(run2())); 46 spawner.spawn(unwrap!(run2()));
47 }); 47 });
48} 48}
diff --git a/examples/nrf52840/src/bin/multiprio.rs b/examples/nrf52840/src/bin/multiprio.rs
index d58613da4..4d9b986d4 100644
--- a/examples/nrf52840/src/bin/multiprio.rs
+++ b/examples/nrf52840/src/bin/multiprio.rs
@@ -130,16 +130,16 @@ fn main() -> ! {
130 // High-priority executor: EGU1_SWI1, priority level 6 130 // High-priority executor: EGU1_SWI1, priority level 6
131 interrupt::EGU1_SWI1.set_priority(Priority::P6); 131 interrupt::EGU1_SWI1.set_priority(Priority::P6);
132 let spawner = EXECUTOR_HIGH.start(interrupt::EGU1_SWI1); 132 let spawner = EXECUTOR_HIGH.start(interrupt::EGU1_SWI1);
133 unwrap!(spawner.spawn(run_high())); 133 spawner.spawn(unwrap!(run_high()));
134 134
135 // Medium-priority executor: EGU0_SWI0, priority level 7 135 // Medium-priority executor: EGU0_SWI0, priority level 7
136 interrupt::EGU0_SWI0.set_priority(Priority::P7); 136 interrupt::EGU0_SWI0.set_priority(Priority::P7);
137 let spawner = EXECUTOR_MED.start(interrupt::EGU0_SWI0); 137 let spawner = EXECUTOR_MED.start(interrupt::EGU0_SWI0);
138 unwrap!(spawner.spawn(run_med())); 138 spawner.spawn(unwrap!(run_med()));
139 139
140 // Low priority executor: runs in thread mode, using WFE/SEV 140 // Low priority executor: runs in thread mode, using WFE/SEV
141 let executor = EXECUTOR_LOW.init(Executor::new()); 141 let executor = EXECUTOR_LOW.init(Executor::new());
142 executor.run(|spawner| { 142 executor.run(|spawner| {
143 unwrap!(spawner.spawn(run_low())); 143 spawner.spawn(unwrap!(run_low()));
144 }); 144 });
145} 145}
diff --git a/examples/nrf52840/src/bin/mutex.rs b/examples/nrf52840/src/bin/mutex.rs
index 5c22279b5..a8e9a82cc 100644
--- a/examples/nrf52840/src/bin/mutex.rs
+++ b/examples/nrf52840/src/bin/mutex.rs
@@ -30,7 +30,7 @@ async fn my_task() {
30#[embassy_executor::main] 30#[embassy_executor::main]
31async fn main(spawner: Spawner) { 31async fn main(spawner: Spawner) {
32 let _p = embassy_nrf::init(Default::default()); 32 let _p = embassy_nrf::init(Default::default());
33 unwrap!(spawner.spawn(my_task())); 33 spawner.spawn(unwrap!(my_task()));
34 34
35 loop { 35 loop {
36 Timer::after_millis(300).await; 36 Timer::after_millis(300).await;
diff --git a/examples/nrf52840/src/bin/pubsub.rs b/examples/nrf52840/src/bin/pubsub.rs
index 5ebea9220..c0392b18c 100644
--- a/examples/nrf52840/src/bin/pubsub.rs
+++ b/examples/nrf52840/src/bin/pubsub.rs
@@ -26,9 +26,9 @@ async fn main(spawner: Spawner) {
26 // It's good to set up the subscribers before publishing anything. 26 // It's good to set up the subscribers before publishing anything.
27 // A subscriber will only yield messages that have been published after its creation. 27 // A subscriber will only yield messages that have been published after its creation.
28 28
29 spawner.must_spawn(fast_logger(unwrap!(MESSAGE_BUS.subscriber()))); 29 spawner.spawn(fast_logger(unwrap!(MESSAGE_BUS.subscriber())).unwrap());
30 spawner.must_spawn(slow_logger(unwrap!(MESSAGE_BUS.dyn_subscriber()))); 30 spawner.spawn(slow_logger(unwrap!(MESSAGE_BUS.dyn_subscriber())).unwrap());
31 spawner.must_spawn(slow_logger_pure(unwrap!(MESSAGE_BUS.dyn_subscriber()))); 31 spawner.spawn(slow_logger_pure(unwrap!(MESSAGE_BUS.dyn_subscriber())).unwrap());
32 32
33 // Get a publisher 33 // Get a publisher
34 let message_publisher = unwrap!(MESSAGE_BUS.publisher()); 34 let message_publisher = unwrap!(MESSAGE_BUS.publisher());
diff --git a/examples/nrf52840/src/bin/raw_spawn.rs b/examples/nrf52840/src/bin/raw_spawn.rs
index 717b0faa6..b80954408 100644
--- a/examples/nrf52840/src/bin/raw_spawn.rs
+++ b/examples/nrf52840/src/bin/raw_spawn.rs
@@ -42,8 +42,8 @@ fn main() -> ! {
42 let run2_task = unsafe { make_static(&run2_task) }; 42 let run2_task = unsafe { make_static(&run2_task) };
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(run1_task.spawn(|| run1()))); 45 spawner.spawn(unwrap!(run1_task.spawn(|| run1())));
46 unwrap!(spawner.spawn(run2_task.spawn(|| run2()))); 46 spawner.spawn(unwrap!(run2_task.spawn(|| run2())));
47 }); 47 });
48} 48}
49 49
diff --git a/examples/nrf52840/src/bin/self_spawn.rs b/examples/nrf52840/src/bin/self_spawn.rs
index 5bfefc2af..acb44f98b 100644
--- a/examples/nrf52840/src/bin/self_spawn.rs
+++ b/examples/nrf52840/src/bin/self_spawn.rs
@@ -14,12 +14,12 @@ mod config {
14async fn my_task(spawner: Spawner, n: u32) { 14async fn my_task(spawner: Spawner, n: u32) {
15 Timer::after_secs(1).await; 15 Timer::after_secs(1).await;
16 info!("Spawning self! {}", n); 16 info!("Spawning self! {}", n);
17 unwrap!(spawner.spawn(my_task(spawner, n + 1))); 17 spawner.spawn(unwrap!(my_task(spawner, n + 1)));
18} 18}
19 19
20#[embassy_executor::main] 20#[embassy_executor::main]
21async fn main(spawner: Spawner) { 21async fn main(spawner: Spawner) {
22 let _p = embassy_nrf::init(Default::default()); 22 let _p = embassy_nrf::init(Default::default());
23 info!("Hello World!"); 23 info!("Hello World!");
24 unwrap!(spawner.spawn(my_task(spawner, 0))); 24 spawner.spawn(unwrap!(my_task(spawner, 0)));
25} 25}
diff --git a/examples/nrf52840/src/bin/self_spawn_current_executor.rs b/examples/nrf52840/src/bin/self_spawn_current_executor.rs
index ddb40dc53..d93067592 100644
--- a/examples/nrf52840/src/bin/self_spawn_current_executor.rs
+++ b/examples/nrf52840/src/bin/self_spawn_current_executor.rs
@@ -11,12 +11,12 @@ async fn my_task(n: u32) {
11 Timer::after_secs(1).await; 11 Timer::after_secs(1).await;
12 info!("Spawning self! {}", n); 12 info!("Spawning self! {}", n);
13 let spawner = unsafe { Spawner::for_current_executor().await }; 13 let spawner = unsafe { Spawner::for_current_executor().await };
14 unwrap!(spawner.spawn(my_task(n + 1))); 14 spawner.spawn(unwrap!(my_task(n + 1)));
15} 15}
16 16
17#[embassy_executor::main] 17#[embassy_executor::main]
18async fn main(spawner: Spawner) { 18async fn main(spawner: Spawner) {
19 let _p = embassy_nrf::init(Default::default()); 19 let _p = embassy_nrf::init(Default::default());
20 info!("Hello World!"); 20 info!("Hello World!");
21 unwrap!(spawner.spawn(my_task(0))); 21 spawner.spawn(unwrap!(my_task(0)));
22} 22}
diff --git a/examples/nrf52840/src/bin/timer.rs b/examples/nrf52840/src/bin/timer.rs
index 365695a20..5331ac246 100644
--- a/examples/nrf52840/src/bin/timer.rs
+++ b/examples/nrf52840/src/bin/timer.rs
@@ -25,6 +25,6 @@ async fn run2() {
25#[embassy_executor::main] 25#[embassy_executor::main]
26async fn main(spawner: Spawner) { 26async fn main(spawner: Spawner) {
27 let _p = embassy_nrf::init(Default::default()); 27 let _p = embassy_nrf::init(Default::default());
28 unwrap!(spawner.spawn(run1())); 28 spawner.spawn(unwrap!(run1()));
29 unwrap!(spawner.spawn(run2())); 29 spawner.spawn(unwrap!(run2()));
30} 30}
diff --git a/examples/nrf52840/src/bin/uart_split.rs b/examples/nrf52840/src/bin/uart_split.rs
index 46be8f636..51af90727 100644
--- a/examples/nrf52840/src/bin/uart_split.rs
+++ b/examples/nrf52840/src/bin/uart_split.rs
@@ -30,7 +30,7 @@ async fn main(spawner: Spawner) {
30 30
31 // Spawn a task responsible purely for reading 31 // Spawn a task responsible purely for reading
32 32
33 unwrap!(spawner.spawn(reader(rx))); 33 spawner.spawn(unwrap!(reader(rx)));
34 34
35 // Message must be in SRAM 35 // Message must be in SRAM
36 { 36 {
diff --git a/examples/nrf52840/src/bin/usb_ethernet.rs b/examples/nrf52840/src/bin/usb_ethernet.rs
index 49856012d..87aa4c6c5 100644
--- a/examples/nrf52840/src/bin/usb_ethernet.rs
+++ b/examples/nrf52840/src/bin/usb_ethernet.rs
@@ -86,11 +86,11 @@ async fn main(spawner: Spawner) {
86 // Build the builder. 86 // Build the builder.
87 let usb = builder.build(); 87 let usb = builder.build();
88 88
89 unwrap!(spawner.spawn(usb_task(usb))); 89 spawner.spawn(unwrap!(usb_task(usb)));
90 90
91 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); 91 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new();
92 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); 92 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr);
93 unwrap!(spawner.spawn(usb_ncm_task(runner))); 93 spawner.spawn(unwrap!(usb_ncm_task(runner)));
94 94
95 let config = embassy_net::Config::dhcpv4(Default::default()); 95 let config = embassy_net::Config::dhcpv4(Default::default());
96 // let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { 96 // let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
@@ -109,7 +109,7 @@ async fn main(spawner: Spawner) {
109 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 109 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
110 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 110 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
111 111
112 unwrap!(spawner.spawn(net_task(runner))); 112 spawner.spawn(unwrap!(net_task(runner)));
113 113
114 // And now we can use it! 114 // And now we can use it!
115 115
diff --git a/examples/nrf52840/src/bin/usb_serial_multitask.rs b/examples/nrf52840/src/bin/usb_serial_multitask.rs
index 5e5b4de35..00a91a233 100644
--- a/examples/nrf52840/src/bin/usb_serial_multitask.rs
+++ b/examples/nrf52840/src/bin/usb_serial_multitask.rs
@@ -76,8 +76,8 @@ async fn main(spawner: Spawner) {
76 // Build the builder. 76 // Build the builder.
77 let usb = builder.build(); 77 let usb = builder.build();
78 78
79 unwrap!(spawner.spawn(usb_task(usb))); 79 spawner.spawn(unwrap!(usb_task(usb)));
80 unwrap!(spawner.spawn(echo_task(class))); 80 spawner.spawn(unwrap!(echo_task(class)));
81} 81}
82 82
83struct Disconnected {} 83struct Disconnected {}
diff --git a/examples/nrf52840/src/bin/wifi_esp_hosted.rs b/examples/nrf52840/src/bin/wifi_esp_hosted.rs
index 26eaf485e..2dd9abfaa 100644
--- a/examples/nrf52840/src/bin/wifi_esp_hosted.rs
+++ b/examples/nrf52840/src/bin/wifi_esp_hosted.rs
@@ -70,7 +70,7 @@ async fn main(spawner: Spawner) {
70 ) 70 )
71 .await; 71 .await;
72 72
73 unwrap!(spawner.spawn(wifi_task(runner))); 73 spawner.spawn(unwrap!(wifi_task(runner)));
74 74
75 unwrap!(control.init().await); 75 unwrap!(control.init().await);
76 unwrap!(control.connect(WIFI_NETWORK, WIFI_PASSWORD).await); 76 unwrap!(control.connect(WIFI_NETWORK, WIFI_PASSWORD).await);
@@ -92,7 +92,7 @@ async fn main(spawner: Spawner) {
92 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 92 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
93 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 93 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
94 94
95 unwrap!(spawner.spawn(net_task(runner))); 95 spawner.spawn(unwrap!(net_task(runner)));
96 96
97 // And now we can use it! 97 // And now we can use it!
98 98
diff --git a/examples/nrf9160/src/bin/modem_tcp_client.rs b/examples/nrf9160/src/bin/modem_tcp_client.rs
index a36b14626..7d4815699 100644
--- a/examples/nrf9160/src/bin/modem_tcp_client.rs
+++ b/examples/nrf9160/src/bin/modem_tcp_client.rs
@@ -112,7 +112,7 @@ async fn main(spawner: Spawner) {
112 112
113 info!("Hello World!"); 113 info!("Hello World!");
114 114
115 unwrap!(spawner.spawn(blink_task(p.P0_02.into()))); 115 spawner.spawn(unwrap!(blink_task(p.P0_02.into())));
116 116
117 let ipc_mem = unsafe { 117 let ipc_mem = unsafe {
118 let ipc_start = &__start_ipc as *const u8 as *mut MaybeUninit<u8>; 118 let ipc_start = &__start_ipc as *const u8 as *mut MaybeUninit<u8>;
@@ -138,8 +138,8 @@ async fn main(spawner: Spawner) {
138 static TRACE: StaticCell<TraceBuffer> = StaticCell::new(); 138 static TRACE: StaticCell<TraceBuffer> = StaticCell::new();
139 let (device, control, runner, tracer) = 139 let (device, control, runner, tracer) =
140 embassy_net_nrf91::new_with_trace(STATE.init(State::new()), ipc_mem, TRACE.init(TraceBuffer::new())).await; 140 embassy_net_nrf91::new_with_trace(STATE.init(State::new()), ipc_mem, TRACE.init(TraceBuffer::new())).await;
141 unwrap!(spawner.spawn(modem_task(runner))); 141 spawner.spawn(unwrap!(modem_task(runner)));
142 unwrap!(spawner.spawn(trace_task(uart, tracer))); 142 spawner.spawn(unwrap!(trace_task(uart, tracer)));
143 143
144 let config = embassy_net::Config::default(); 144 let config = embassy_net::Config::default();
145 145
@@ -150,12 +150,12 @@ async fn main(spawner: Spawner) {
150 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new(); 150 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new();
151 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::<2>::new()), seed); 151 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::<2>::new()), seed);
152 152
153 unwrap!(spawner.spawn(net_task(runner))); 153 spawner.spawn(unwrap!(net_task(runner)));
154 154
155 static CONTROL: StaticCell<context::Control<'static>> = StaticCell::new(); 155 static CONTROL: StaticCell<context::Control<'static>> = StaticCell::new();
156 let control = CONTROL.init(context::Control::new(control, 0).await); 156 let control = CONTROL.init(context::Control::new(control, 0).await);
157 157
158 unwrap!(spawner.spawn(control_task( 158 spawner.spawn(unwrap!(control_task(
159 control, 159 control,
160 context::Config { 160 context::Config {
161 apn: b"iot.nat.es", 161 apn: b"iot.nat.es",
diff --git a/examples/rp/src/bin/assign_resources.rs b/examples/rp/src/bin/assign_resources.rs
index 341f54d22..4ee4278b5 100644
--- a/examples/rp/src/bin/assign_resources.rs
+++ b/examples/rp/src/bin/assign_resources.rs
@@ -26,15 +26,13 @@ async fn main(spawner: Spawner) {
26 let p = embassy_rp::init(Default::default()); 26 let p = embassy_rp::init(Default::default());
27 27
28 // 1) Assigning a resource to a task by passing parts of the peripherals. 28 // 1) Assigning a resource to a task by passing parts of the peripherals.
29 spawner 29 spawner.spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21).unwrap());
30 .spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21))
31 .unwrap();
32 30
33 // 2) Using the assign-resources macro to assign resources to a task. 31 // 2) Using the assign-resources macro to assign resources to a task.
34 // we perform the split, see further below for the definition of the resources struct 32 // we perform the split, see further below for the definition of the resources struct
35 let r = split_resources!(p); 33 let r = split_resources!(p);
36 // and then we can use them 34 // and then we can use them
37 spawner.spawn(double_blinky_macro_assigned(spawner, r.leds)).unwrap(); 35 spawner.spawn(double_blinky_macro_assigned(spawner, r.leds).unwrap());
38} 36}
39 37
40// 1) Assigning a resource to a task by passing parts of the peripherals. 38// 1) Assigning a resource to a task by passing parts of the peripherals.
diff --git a/examples/rp/src/bin/blinky_two_channels.rs b/examples/rp/src/bin/blinky_two_channels.rs
index 51e139e94..87f3a3545 100644
--- a/examples/rp/src/bin/blinky_two_channels.rs
+++ b/examples/rp/src/bin/blinky_two_channels.rs
@@ -27,8 +27,8 @@ async fn main(spawner: Spawner) {
27 let dt = 100 * 1_000_000; 27 let dt = 100 * 1_000_000;
28 let k = 1.003; 28 let k = 1.003;
29 29
30 unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); 30 spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt))));
31 unwrap!(spawner.spawn(toggle_led( 31 spawner.spawn(unwrap!(toggle_led(
32 CHANNEL.sender(), 32 CHANNEL.sender(),
33 Duration::from_nanos((dt as f64 * k) as u64) 33 Duration::from_nanos((dt as f64 * k) as u64)
34 ))); 34 )));
diff --git a/examples/rp/src/bin/blinky_two_tasks.rs b/examples/rp/src/bin/blinky_two_tasks.rs
index 67a9108c0..aac7d928b 100644
--- a/examples/rp/src/bin/blinky_two_tasks.rs
+++ b/examples/rp/src/bin/blinky_two_tasks.rs
@@ -30,8 +30,8 @@ async fn main(spawner: Spawner) {
30 let dt = 100 * 1_000_000; 30 let dt = 100 * 1_000_000;
31 let k = 1.003; 31 let k = 1.003;
32 32
33 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); 33 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos(dt))));
34 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); 34 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64))));
35} 35}
36 36
37#[embassy_executor::task(pool_size = 2)] 37#[embassy_executor::task(pool_size = 2)]
diff --git a/examples/rp/src/bin/ethernet_w5500_icmp.rs b/examples/rp/src/bin/ethernet_w5500_icmp.rs
index e434b3bbc..8c684a791 100644
--- a/examples/rp/src/bin/ethernet_w5500_icmp.rs
+++ b/examples/rp/src/bin/ethernet_w5500_icmp.rs
@@ -61,7 +61,7 @@ async fn main(spawner: Spawner) {
61 ) 61 )
62 .await 62 .await
63 .unwrap(); 63 .unwrap();
64 unwrap!(spawner.spawn(ethernet_task(runner))); 64 spawner.spawn(unwrap!(ethernet_task(runner)));
65 65
66 // Generate random seed 66 // Generate random seed
67 let seed = rng.next_u64(); 67 let seed = rng.next_u64();
@@ -76,7 +76,7 @@ async fn main(spawner: Spawner) {
76 ); 76 );
77 77
78 // Launch network task 78 // Launch network task
79 unwrap!(spawner.spawn(net_task(runner))); 79 spawner.spawn(unwrap!(net_task(runner)));
80 80
81 info!("Waiting for DHCP..."); 81 info!("Waiting for DHCP...");
82 let cfg = wait_for_config(stack).await; 82 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp/src/bin/ethernet_w5500_icmp_ping.rs b/examples/rp/src/bin/ethernet_w5500_icmp_ping.rs
index 0ec594fd5..49d28071a 100644
--- a/examples/rp/src/bin/ethernet_w5500_icmp_ping.rs
+++ b/examples/rp/src/bin/ethernet_w5500_icmp_ping.rs
@@ -63,7 +63,7 @@ async fn main(spawner: Spawner) {
63 ) 63 )
64 .await 64 .await
65 .unwrap(); 65 .unwrap();
66 unwrap!(spawner.spawn(ethernet_task(runner))); 66 spawner.spawn(unwrap!(ethernet_task(runner)));
67 67
68 // Generate random seed 68 // Generate random seed
69 let seed = rng.next_u64(); 69 let seed = rng.next_u64();
@@ -78,7 +78,7 @@ async fn main(spawner: Spawner) {
78 ); 78 );
79 79
80 // Launch network task 80 // Launch network task
81 unwrap!(spawner.spawn(net_task(runner))); 81 spawner.spawn(unwrap!(net_task(runner)));
82 82
83 info!("Waiting for DHCP..."); 83 info!("Waiting for DHCP...");
84 let cfg = wait_for_config(stack).await; 84 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp/src/bin/ethernet_w5500_multisocket.rs b/examples/rp/src/bin/ethernet_w5500_multisocket.rs
index 27e2f3c30..5c049ddca 100644
--- a/examples/rp/src/bin/ethernet_w5500_multisocket.rs
+++ b/examples/rp/src/bin/ethernet_w5500_multisocket.rs
@@ -64,7 +64,7 @@ async fn main(spawner: Spawner) {
64 ) 64 )
65 .await 65 .await
66 .unwrap(); 66 .unwrap();
67 unwrap!(spawner.spawn(ethernet_task(runner))); 67 spawner.spawn(unwrap!(ethernet_task(runner)));
68 68
69 // Generate random seed 69 // Generate random seed
70 let seed = rng.next_u64(); 70 let seed = rng.next_u64();
@@ -79,7 +79,7 @@ async fn main(spawner: Spawner) {
79 ); 79 );
80 80
81 // Launch network task 81 // Launch network task
82 unwrap!(spawner.spawn(net_task(runner))); 82 spawner.spawn(unwrap!(net_task(runner)));
83 83
84 info!("Waiting for DHCP..."); 84 info!("Waiting for DHCP...");
85 let cfg = wait_for_config(stack).await; 85 let cfg = wait_for_config(stack).await;
@@ -87,8 +87,8 @@ async fn main(spawner: Spawner) {
87 info!("IP address: {:?}", local_addr); 87 info!("IP address: {:?}", local_addr);
88 88
89 // Create two sockets listening to the same port, to handle simultaneous connections 89 // Create two sockets listening to the same port, to handle simultaneous connections
90 unwrap!(spawner.spawn(listen_task(stack, 0, 1234))); 90 spawner.spawn(unwrap!(listen_task(stack, 0, 1234)));
91 unwrap!(spawner.spawn(listen_task(stack, 1, 1234))); 91 spawner.spawn(unwrap!(listen_task(stack, 1, 1234)));
92} 92}
93 93
94#[embassy_executor::task(pool_size = 2)] 94#[embassy_executor::task(pool_size = 2)]
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs
index ba82f2a60..7552e4f9b 100644
--- a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs
+++ b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs
@@ -67,7 +67,7 @@ async fn main(spawner: Spawner) {
67 ) 67 )
68 .await 68 .await
69 .unwrap(); 69 .unwrap();
70 unwrap!(spawner.spawn(ethernet_task(runner))); 70 spawner.spawn(unwrap!(ethernet_task(runner)));
71 71
72 // Generate random seed 72 // Generate random seed
73 let seed = rng.next_u64(); 73 let seed = rng.next_u64();
@@ -82,7 +82,7 @@ async fn main(spawner: Spawner) {
82 ); 82 );
83 83
84 // Launch network task 84 // Launch network task
85 unwrap!(spawner.spawn(net_task(runner))); 85 spawner.spawn(unwrap!(net_task(runner)));
86 86
87 info!("Waiting for DHCP..."); 87 info!("Waiting for DHCP...");
88 let cfg = wait_for_config(stack).await; 88 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs
index 5c56dcafa..7b6fecad4 100644
--- a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs
+++ b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs
@@ -66,7 +66,7 @@ async fn main(spawner: Spawner) {
66 ) 66 )
67 .await 67 .await
68 .unwrap(); 68 .unwrap();
69 unwrap!(spawner.spawn(ethernet_task(runner))); 69 spawner.spawn(unwrap!(ethernet_task(runner)));
70 70
71 // Generate random seed 71 // Generate random seed
72 let seed = rng.next_u64(); 72 let seed = rng.next_u64();
@@ -81,7 +81,7 @@ async fn main(spawner: Spawner) {
81 ); 81 );
82 82
83 // Launch network task 83 // Launch network task
84 unwrap!(spawner.spawn(net_task(runner))); 84 spawner.spawn(unwrap!(net_task(runner)));
85 85
86 info!("Waiting for DHCP..."); 86 info!("Waiting for DHCP...");
87 let cfg = wait_for_config(stack).await; 87 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp/src/bin/ethernet_w5500_udp.rs b/examples/rp/src/bin/ethernet_w5500_udp.rs
index c5fc8de1d..f099490f5 100644
--- a/examples/rp/src/bin/ethernet_w5500_udp.rs
+++ b/examples/rp/src/bin/ethernet_w5500_udp.rs
@@ -64,7 +64,7 @@ async fn main(spawner: Spawner) {
64 ) 64 )
65 .await 65 .await
66 .unwrap(); 66 .unwrap();
67 unwrap!(spawner.spawn(ethernet_task(runner))); 67 spawner.spawn(unwrap!(ethernet_task(runner)));
68 68
69 // Generate random seed 69 // Generate random seed
70 let seed = rng.next_u64(); 70 let seed = rng.next_u64();
@@ -79,7 +79,7 @@ async fn main(spawner: Spawner) {
79 ); 79 );
80 80
81 // Launch network task 81 // Launch network task
82 unwrap!(spawner.spawn(net_task(runner))); 82 spawner.spawn(unwrap!(net_task(runner)));
83 83
84 info!("Waiting for DHCP..."); 84 info!("Waiting for DHCP...");
85 let cfg = wait_for_config(stack).await; 85 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp/src/bin/i2c_slave.rs b/examples/rp/src/bin/i2c_slave.rs
index 08f31001b..e2b8b0d06 100644
--- a/examples/rp/src/bin/i2c_slave.rs
+++ b/examples/rp/src/bin/i2c_slave.rs
@@ -105,7 +105,7 @@ async fn main(spawner: Spawner) {
105 config.addr = DEV_ADDR as u16; 105 config.addr = DEV_ADDR as u16;
106 let device = i2c_slave::I2cSlave::new(p.I2C1, d_scl, d_sda, Irqs, config); 106 let device = i2c_slave::I2cSlave::new(p.I2C1, d_scl, d_sda, Irqs, config);
107 107
108 unwrap!(spawner.spawn(device_task(device))); 108 spawner.spawn(unwrap!(device_task(device)));
109 109
110 let c_sda = p.PIN_0; 110 let c_sda = p.PIN_0;
111 let c_scl = p.PIN_1; 111 let c_scl = p.PIN_1;
@@ -113,5 +113,5 @@ async fn main(spawner: Spawner) {
113 config.frequency = 1_000_000; 113 config.frequency = 1_000_000;
114 let controller = i2c::I2c::new_async(p.I2C0, c_scl, c_sda, Irqs, config); 114 let controller = i2c::I2c::new_async(p.I2C0, c_scl, c_sda, Irqs, config);
115 115
116 unwrap!(spawner.spawn(controller_task(controller))); 116 spawner.spawn(unwrap!(controller_task(controller)));
117} 117}
diff --git a/examples/rp/src/bin/interrupt.rs b/examples/rp/src/bin/interrupt.rs
index 787cdc112..2748f778a 100644
--- a/examples/rp/src/bin/interrupt.rs
+++ b/examples/rp/src/bin/interrupt.rs
@@ -51,7 +51,7 @@ async fn main(spawner: Spawner) {
51 // No Mutex needed when sharing within the same executor/prio level 51 // No Mutex needed when sharing within the same executor/prio level
52 static AVG: StaticCell<Cell<u32>> = StaticCell::new(); 52 static AVG: StaticCell<Cell<u32>> = StaticCell::new();
53 let avg = AVG.init(Default::default()); 53 let avg = AVG.init(Default::default());
54 spawner.must_spawn(processing(avg)); 54 spawner.spawn(processing(avg).unwrap());
55 55
56 let mut ticker = Ticker::every(Duration::from_secs(1)); 56 let mut ticker = Ticker::every(Duration::from_secs(1));
57 loop { 57 loop {
diff --git a/examples/rp/src/bin/multicore.rs b/examples/rp/src/bin/multicore.rs
index 7cb546c91..3a6367420 100644
--- a/examples/rp/src/bin/multicore.rs
+++ b/examples/rp/src/bin/multicore.rs
@@ -35,12 +35,12 @@ fn main() -> ! {
35 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, 35 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) },
36 move || { 36 move || {
37 let executor1 = EXECUTOR1.init(Executor::new()); 37 let executor1 = EXECUTOR1.init(Executor::new());
38 executor1.run(|spawner| unwrap!(spawner.spawn(core1_task(led)))); 38 executor1.run(|spawner| spawner.spawn(unwrap!(core1_task(led))));
39 }, 39 },
40 ); 40 );
41 41
42 let executor0 = EXECUTOR0.init(Executor::new()); 42 let executor0 = EXECUTOR0.init(Executor::new());
43 executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); 43 executor0.run(|spawner| spawner.spawn(unwrap!(core0_task())));
44} 44}
45 45
46#[embassy_executor::task] 46#[embassy_executor::task]
diff --git a/examples/rp/src/bin/multiprio.rs b/examples/rp/src/bin/multiprio.rs
index 2b397f97d..96cdf8fb1 100644
--- a/examples/rp/src/bin/multiprio.rs
+++ b/examples/rp/src/bin/multiprio.rs
@@ -130,16 +130,16 @@ fn main() -> ! {
130 // High-priority executor: SWI_IRQ_1, priority level 2 130 // High-priority executor: SWI_IRQ_1, priority level 2
131 interrupt::SWI_IRQ_1.set_priority(Priority::P2); 131 interrupt::SWI_IRQ_1.set_priority(Priority::P2);
132 let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1); 132 let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1);
133 unwrap!(spawner.spawn(run_high())); 133 spawner.spawn(unwrap!(run_high()));
134 134
135 // Medium-priority executor: SWI_IRQ_0, priority level 3 135 // Medium-priority executor: SWI_IRQ_0, priority level 3
136 interrupt::SWI_IRQ_0.set_priority(Priority::P3); 136 interrupt::SWI_IRQ_0.set_priority(Priority::P3);
137 let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0); 137 let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0);
138 unwrap!(spawner.spawn(run_med())); 138 spawner.spawn(unwrap!(run_med()));
139 139
140 // Low priority executor: runs in thread mode, using WFE/SEV 140 // Low priority executor: runs in thread mode, using WFE/SEV
141 let executor = EXECUTOR_LOW.init(Executor::new()); 141 let executor = EXECUTOR_LOW.init(Executor::new());
142 executor.run(|spawner| { 142 executor.run(|spawner| {
143 unwrap!(spawner.spawn(run_low())); 143 spawner.spawn(unwrap!(run_low()));
144 }); 144 });
145} 145}
diff --git a/examples/rp/src/bin/orchestrate_tasks.rs b/examples/rp/src/bin/orchestrate_tasks.rs
index c35679251..9f25e1087 100644
--- a/examples/rp/src/bin/orchestrate_tasks.rs
+++ b/examples/rp/src/bin/orchestrate_tasks.rs
@@ -129,13 +129,13 @@ async fn main(spawner: Spawner) {
129 let p = embassy_rp::init(Default::default()); 129 let p = embassy_rp::init(Default::default());
130 let r = split_resources! {p}; 130 let r = split_resources! {p};
131 131
132 spawner.spawn(orchestrate(spawner)).unwrap(); 132 spawner.spawn(orchestrate(spawner).unwrap());
133 spawner.spawn(random_60s(spawner)).unwrap(); 133 spawner.spawn(random_60s(spawner).unwrap());
134 spawner.spawn(random_90s(spawner)).unwrap(); 134 spawner.spawn(random_90s(spawner).unwrap());
135 // `random_30s` is not spawned here, butin the orchestrate task depending on state 135 // `random_30s` is not spawned here, butin the orchestrate task depending on state
136 spawner.spawn(usb_power(spawner, r.vbus)).unwrap(); 136 spawner.spawn(usb_power(spawner, r.vbus).unwrap());
137 spawner.spawn(vsys_voltage(spawner, r.vsys)).unwrap(); 137 spawner.spawn(vsys_voltage(spawner, r.vsys).unwrap());
138 spawner.spawn(consumer(spawner)).unwrap(); 138 spawner.spawn(consumer(spawner).unwrap());
139} 139}
140 140
141/// Main task that processes all events and updates system state. 141/// Main task that processes all events and updates system state.
@@ -198,7 +198,7 @@ async fn orchestrate(spawner: Spawner) {
198 drop(state); 198 drop(state);
199 if respawn_first_random_seed_task { 199 if respawn_first_random_seed_task {
200 info!("(Re)-Starting the first random signal task"); 200 info!("(Re)-Starting the first random signal task");
201 spawner.spawn(random_30s(spawner)).unwrap(); 201 spawner.spawn(random_30s(spawner).unwrap());
202 } 202 }
203 } 203 }
204 _ => {} 204 _ => {}
diff --git a/examples/rp/src/bin/pio_async.rs b/examples/rp/src/bin/pio_async.rs
index bf6dbee69..1743a417e 100644
--- a/examples/rp/src/bin/pio_async.rs
+++ b/examples/rp/src/bin/pio_async.rs
@@ -125,7 +125,7 @@ async fn main(spawner: Spawner) {
125 setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0); 125 setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0);
126 setup_pio_task_sm1(&mut common, &mut sm1); 126 setup_pio_task_sm1(&mut common, &mut sm1);
127 setup_pio_task_sm2(&mut common, &mut sm2); 127 setup_pio_task_sm2(&mut common, &mut sm2);
128 spawner.spawn(pio_task_sm0(sm0)).unwrap(); 128 spawner.spawn(pio_task_sm0(sm0).unwrap());
129 spawner.spawn(pio_task_sm1(sm1)).unwrap(); 129 spawner.spawn(pio_task_sm1(sm1).unwrap());
130 spawner.spawn(pio_task_sm2(irq3, sm2)).unwrap(); 130 spawner.spawn(pio_task_sm2(irq3, sm2).unwrap());
131} 131}
diff --git a/examples/rp/src/bin/pio_rotary_encoder.rs b/examples/rp/src/bin/pio_rotary_encoder.rs
index 2750f61ae..2fc19970b 100644
--- a/examples/rp/src/bin/pio_rotary_encoder.rs
+++ b/examples/rp/src/bin/pio_rotary_encoder.rs
@@ -50,6 +50,6 @@ async fn main(spawner: Spawner) {
50 let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg); 50 let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg);
51 let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg); 51 let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg);
52 52
53 spawner.must_spawn(encoder_0(encoder0)); 53 spawner.spawn(encoder_0(encoder0).unwrap());
54 spawner.must_spawn(encoder_1(encoder1)); 54 spawner.spawn(encoder_1(encoder1).unwrap());
55} 55}
diff --git a/examples/rp/src/bin/pwm.rs b/examples/rp/src/bin/pwm.rs
index 04374323d..9dd07ab6e 100644
--- a/examples/rp/src/bin/pwm.rs
+++ b/examples/rp/src/bin/pwm.rs
@@ -18,8 +18,8 @@ use {defmt_rtt as _, panic_probe as _};
18#[embassy_executor::main] 18#[embassy_executor::main]
19async fn main(spawner: Spawner) { 19async fn main(spawner: Spawner) {
20 let p = embassy_rp::init(Default::default()); 20 let p = embassy_rp::init(Default::default());
21 spawner.spawn(pwm_set_config(p.PWM_SLICE4, p.PIN_25)).unwrap(); 21 spawner.spawn(pwm_set_config(p.PWM_SLICE4, p.PIN_25).unwrap());
22 spawner.spawn(pwm_set_dutycycle(p.PWM_SLICE2, p.PIN_4)).unwrap(); 22 spawner.spawn(pwm_set_dutycycle(p.PWM_SLICE2, p.PIN_4).unwrap());
23} 23}
24 24
25/// Demonstrate PWM by modifying & applying the config 25/// Demonstrate PWM by modifying & applying the config
diff --git a/examples/rp/src/bin/shared_bus.rs b/examples/rp/src/bin/shared_bus.rs
index 9267dfccb..db7566b1a 100644
--- a/examples/rp/src/bin/shared_bus.rs
+++ b/examples/rp/src/bin/shared_bus.rs
@@ -35,8 +35,8 @@ async fn main(spawner: Spawner) {
35 static I2C_BUS: StaticCell<I2c1Bus> = StaticCell::new(); 35 static I2C_BUS: StaticCell<I2c1Bus> = StaticCell::new();
36 let i2c_bus = I2C_BUS.init(Mutex::new(i2c)); 36 let i2c_bus = I2C_BUS.init(Mutex::new(i2c));
37 37
38 spawner.must_spawn(i2c_task_a(i2c_bus)); 38 spawner.spawn(i2c_task_a(i2c_bus).unwrap());
39 spawner.must_spawn(i2c_task_b(i2c_bus)); 39 spawner.spawn(i2c_task_b(i2c_bus).unwrap());
40 40
41 // Shared SPI bus 41 // Shared SPI bus
42 let spi_cfg = spi::Config::default(); 42 let spi_cfg = spi::Config::default();
@@ -48,8 +48,8 @@ async fn main(spawner: Spawner) {
48 let cs_a = Output::new(p.PIN_0, Level::High); 48 let cs_a = Output::new(p.PIN_0, Level::High);
49 let cs_b = Output::new(p.PIN_1, Level::High); 49 let cs_b = Output::new(p.PIN_1, Level::High);
50 50
51 spawner.must_spawn(spi_task_a(spi_bus, cs_a)); 51 spawner.spawn(spi_task_a(spi_bus, cs_a).unwrap());
52 spawner.must_spawn(spi_task_b(spi_bus, cs_b)); 52 spawner.spawn(spi_task_b(spi_bus, cs_b).unwrap());
53} 53}
54 54
55#[embassy_executor::task] 55#[embassy_executor::task]
diff --git a/examples/rp/src/bin/sharing.rs b/examples/rp/src/bin/sharing.rs
index 856be6ace..d4c89946b 100644
--- a/examples/rp/src/bin/sharing.rs
+++ b/examples/rp/src/bin/sharing.rs
@@ -68,7 +68,7 @@ fn main() -> ! {
68 // High-priority executor: runs in interrupt mode 68 // High-priority executor: runs in interrupt mode
69 interrupt::SWI_IRQ_0.set_priority(Priority::P3); 69 interrupt::SWI_IRQ_0.set_priority(Priority::P3);
70 let spawner = EXECUTOR_HI.start(interrupt::SWI_IRQ_0); 70 let spawner = EXECUTOR_HI.start(interrupt::SWI_IRQ_0);
71 spawner.must_spawn(task_a(uart)); 71 spawner.spawn(task_a(uart).unwrap());
72 72
73 // Low priority executor: runs in thread mode 73 // Low priority executor: runs in thread mode
74 let executor = EXECUTOR_LOW.init(Executor::new()); 74 let executor = EXECUTOR_LOW.init(Executor::new());
@@ -83,8 +83,8 @@ fn main() -> ! {
83 static REF_CELL: ConstStaticCell<RefCell<MyType>> = ConstStaticCell::new(RefCell::new(MyType { inner: 0 })); 83 static REF_CELL: ConstStaticCell<RefCell<MyType>> = ConstStaticCell::new(RefCell::new(MyType { inner: 0 }));
84 let ref_cell = REF_CELL.take(); 84 let ref_cell = REF_CELL.take();
85 85
86 spawner.must_spawn(task_b(uart, cell, ref_cell)); 86 spawner.spawn(task_b(uart, cell, ref_cell).unwrap());
87 spawner.must_spawn(task_c(cell, ref_cell)); 87 spawner.spawn(task_c(cell, ref_cell).unwrap());
88 }); 88 });
89} 89}
90 90
diff --git a/examples/rp/src/bin/uart_buffered_split.rs b/examples/rp/src/bin/uart_buffered_split.rs
index 3adbc18ab..820daed96 100644
--- a/examples/rp/src/bin/uart_buffered_split.rs
+++ b/examples/rp/src/bin/uart_buffered_split.rs
@@ -33,7 +33,7 @@ async fn main(spawner: Spawner) {
33 let uart = BufferedUart::new(uart, tx_pin, rx_pin, Irqs, tx_buf, rx_buf, Config::default()); 33 let uart = BufferedUart::new(uart, tx_pin, rx_pin, Irqs, tx_buf, rx_buf, Config::default());
34 let (mut tx, rx) = uart.split(); 34 let (mut tx, rx) = uart.split();
35 35
36 unwrap!(spawner.spawn(reader(rx))); 36 spawner.spawn(unwrap!(reader(rx)));
37 37
38 info!("Writing..."); 38 info!("Writing...");
39 loop { 39 loop {
diff --git a/examples/rp/src/bin/uart_unidir.rs b/examples/rp/src/bin/uart_unidir.rs
index c2c8dfad8..573b45b51 100644
--- a/examples/rp/src/bin/uart_unidir.rs
+++ b/examples/rp/src/bin/uart_unidir.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) {
27 let mut uart_tx = UartTx::new(p.UART0, p.PIN_0, p.DMA_CH0, Config::default()); 27 let mut uart_tx = UartTx::new(p.UART0, p.PIN_0, p.DMA_CH0, Config::default());
28 let uart_rx = UartRx::new(p.UART1, p.PIN_5, Irqs, p.DMA_CH1, Config::default()); 28 let uart_rx = UartRx::new(p.UART1, p.PIN_5, Irqs, p.DMA_CH1, Config::default());
29 29
30 unwrap!(spawner.spawn(reader(uart_rx))); 30 spawner.spawn(unwrap!(reader(uart_rx)));
31 31
32 info!("Writing..."); 32 info!("Writing...");
33 loop { 33 loop {
diff --git a/examples/rp/src/bin/usb_ethernet.rs b/examples/rp/src/bin/usb_ethernet.rs
index 171f21a75..912e52e96 100644
--- a/examples/rp/src/bin/usb_ethernet.rs
+++ b/examples/rp/src/bin/usb_ethernet.rs
@@ -84,11 +84,11 @@ async fn main(spawner: Spawner) {
84 // Build the builder. 84 // Build the builder.
85 let usb = builder.build(); 85 let usb = builder.build();
86 86
87 unwrap!(spawner.spawn(usb_task(usb))); 87 spawner.spawn(unwrap!(usb_task(usb)));
88 88
89 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); 89 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new();
90 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); 90 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr);
91 unwrap!(spawner.spawn(usb_ncm_task(runner))); 91 spawner.spawn(unwrap!(usb_ncm_task(runner)));
92 92
93 let config = embassy_net::Config::dhcpv4(Default::default()); 93 let config = embassy_net::Config::dhcpv4(Default::default());
94 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { 94 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
@@ -104,7 +104,7 @@ async fn main(spawner: Spawner) {
104 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 104 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
105 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 105 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
106 106
107 unwrap!(spawner.spawn(net_task(runner))); 107 spawner.spawn(unwrap!(net_task(runner)));
108 108
109 // And now we can use it! 109 // And now we can use it!
110 110
diff --git a/examples/rp/src/bin/usb_logger.rs b/examples/rp/src/bin/usb_logger.rs
index af401ed63..ed2333efc 100644
--- a/examples/rp/src/bin/usb_logger.rs
+++ b/examples/rp/src/bin/usb_logger.rs
@@ -25,7 +25,7 @@ async fn logger_task(driver: Driver<'static, USB>) {
25async fn main(spawner: Spawner) { 25async fn main(spawner: Spawner) {
26 let p = embassy_rp::init(Default::default()); 26 let p = embassy_rp::init(Default::default());
27 let driver = Driver::new(p.USB, Irqs); 27 let driver = Driver::new(p.USB, Irqs);
28 spawner.spawn(logger_task(driver)).unwrap(); 28 spawner.spawn(logger_task(driver).unwrap());
29 29
30 let mut counter = 0; 30 let mut counter = 0;
31 loop { 31 loop {
diff --git a/examples/rp/src/bin/usb_serial.rs b/examples/rp/src/bin/usb_serial.rs
index 5e3f0f378..b79012acb 100644
--- a/examples/rp/src/bin/usb_serial.rs
+++ b/examples/rp/src/bin/usb_serial.rs
@@ -69,7 +69,7 @@ async fn main(spawner: Spawner) {
69 let usb = builder.build(); 69 let usb = builder.build();
70 70
71 // Run the USB device. 71 // Run the USB device.
72 unwrap!(spawner.spawn(usb_task(usb))); 72 spawner.spawn(unwrap!(usb_task(usb)));
73 73
74 // Do stuff with the class! 74 // Do stuff with the class!
75 loop { 75 loop {
diff --git a/examples/rp/src/bin/usb_serial_with_handler.rs b/examples/rp/src/bin/usb_serial_with_handler.rs
index a9e65be70..b85c9029b 100644
--- a/examples/rp/src/bin/usb_serial_with_handler.rs
+++ b/examples/rp/src/bin/usb_serial_with_handler.rs
@@ -53,7 +53,7 @@ async fn logger_task(driver: Driver<'static, USB>) {
53async fn main(spawner: Spawner) { 53async fn main(spawner: Spawner) {
54 let p = embassy_rp::init(Default::default()); 54 let p = embassy_rp::init(Default::default());
55 let driver = Driver::new(p.USB, Irqs); 55 let driver = Driver::new(p.USB, Irqs);
56 spawner.spawn(logger_task(driver)).unwrap(); 56 spawner.spawn(logger_task(driver).unwrap());
57 57
58 let mut counter = 0; 58 let mut counter = 0;
59 loop { 59 loop {
diff --git a/examples/rp/src/bin/wifi_ap_tcp_server.rs b/examples/rp/src/bin/wifi_ap_tcp_server.rs
index 856838a8c..128599e0d 100644
--- a/examples/rp/src/bin/wifi_ap_tcp_server.rs
+++ b/examples/rp/src/bin/wifi_ap_tcp_server.rs
@@ -70,7 +70,7 @@ async fn main(spawner: Spawner) {
70 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 70 static STATE: StaticCell<cyw43::State> = StaticCell::new();
71 let state = STATE.init(cyw43::State::new()); 71 let state = STATE.init(cyw43::State::new());
72 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 72 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
73 unwrap!(spawner.spawn(cyw43_task(runner))); 73 spawner.spawn(unwrap!(cyw43_task(runner)));
74 74
75 control.init(clm).await; 75 control.init(clm).await;
76 control 76 control
@@ -91,7 +91,7 @@ async fn main(spawner: Spawner) {
91 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 91 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
92 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); 92 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed);
93 93
94 unwrap!(spawner.spawn(net_task(runner))); 94 spawner.spawn(unwrap!(net_task(runner)));
95 95
96 //control.start_ap_open("cyw43", 5).await; 96 //control.start_ap_open("cyw43", 5).await;
97 control.start_ap_wpa2("cyw43", "password", 5).await; 97 control.start_ap_wpa2("cyw43", "password", 5).await;
diff --git a/examples/rp/src/bin/wifi_blinky.rs b/examples/rp/src/bin/wifi_blinky.rs
index 6e91ce167..b2e08c517 100644
--- a/examples/rp/src/bin/wifi_blinky.rs
+++ b/examples/rp/src/bin/wifi_blinky.rs
@@ -55,7 +55,7 @@ async fn main(spawner: Spawner) {
55 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 55 static STATE: StaticCell<cyw43::State> = StaticCell::new();
56 let state = STATE.init(cyw43::State::new()); 56 let state = STATE.init(cyw43::State::new());
57 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 57 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
58 unwrap!(spawner.spawn(cyw43_task(runner))); 58 spawner.spawn(unwrap!(cyw43_task(runner)));
59 59
60 control.init(clm).await; 60 control.init(clm).await;
61 control 61 control
diff --git a/examples/rp/src/bin/wifi_scan.rs b/examples/rp/src/bin/wifi_scan.rs
index fe9c363d9..c884aa2ba 100644
--- a/examples/rp/src/bin/wifi_scan.rs
+++ b/examples/rp/src/bin/wifi_scan.rs
@@ -59,7 +59,7 @@ async fn main(spawner: Spawner) {
59 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 59 static STATE: StaticCell<cyw43::State> = StaticCell::new();
60 let state = STATE.init(cyw43::State::new()); 60 let state = STATE.init(cyw43::State::new());
61 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 61 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
62 unwrap!(spawner.spawn(cyw43_task(runner))); 62 spawner.spawn(unwrap!(cyw43_task(runner)));
63 63
64 control.init(clm).await; 64 control.init(clm).await;
65 control 65 control
diff --git a/examples/rp/src/bin/wifi_tcp_server.rs b/examples/rp/src/bin/wifi_tcp_server.rs
index ed1a03fcf..126475779 100644
--- a/examples/rp/src/bin/wifi_tcp_server.rs
+++ b/examples/rp/src/bin/wifi_tcp_server.rs
@@ -74,7 +74,7 @@ async fn main(spawner: Spawner) {
74 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 74 static STATE: StaticCell<cyw43::State> = StaticCell::new();
75 let state = STATE.init(cyw43::State::new()); 75 let state = STATE.init(cyw43::State::new());
76 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 76 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
77 unwrap!(spawner.spawn(cyw43_task(runner))); 77 spawner.spawn(unwrap!(cyw43_task(runner)));
78 78
79 control.init(clm).await; 79 control.init(clm).await;
80 control 80 control
@@ -95,7 +95,7 @@ async fn main(spawner: Spawner) {
95 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 95 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
96 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); 96 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed);
97 97
98 unwrap!(spawner.spawn(net_task(runner))); 98 spawner.spawn(unwrap!(net_task(runner)));
99 99
100 while let Err(err) = control 100 while let Err(err) = control
101 .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) 101 .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes()))
diff --git a/examples/rp/src/bin/wifi_webrequest.rs b/examples/rp/src/bin/wifi_webrequest.rs
index a75253bb0..079def370 100644
--- a/examples/rp/src/bin/wifi_webrequest.rs
+++ b/examples/rp/src/bin/wifi_webrequest.rs
@@ -76,7 +76,7 @@ async fn main(spawner: Spawner) {
76 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 76 static STATE: StaticCell<cyw43::State> = StaticCell::new();
77 let state = STATE.init(cyw43::State::new()); 77 let state = STATE.init(cyw43::State::new());
78 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 78 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
79 unwrap!(spawner.spawn(cyw43_task(runner))); 79 spawner.spawn(unwrap!(cyw43_task(runner)));
80 80
81 control.init(clm).await; 81 control.init(clm).await;
82 control 82 control
@@ -98,7 +98,7 @@ async fn main(spawner: Spawner) {
98 static RESOURCES: StaticCell<StackResources<5>> = StaticCell::new(); 98 static RESOURCES: StaticCell<StackResources<5>> = StaticCell::new();
99 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); 99 let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed);
100 100
101 unwrap!(spawner.spawn(net_task(runner))); 101 spawner.spawn(unwrap!(net_task(runner)));
102 102
103 while let Err(err) = control 103 while let Err(err) = control
104 .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) 104 .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes()))
diff --git a/examples/rp/src/bin/zerocopy.rs b/examples/rp/src/bin/zerocopy.rs
index d1fb0eb00..d603e1ed3 100644
--- a/examples/rp/src/bin/zerocopy.rs
+++ b/examples/rp/src/bin/zerocopy.rs
@@ -52,8 +52,8 @@ async fn main(spawner: Spawner) {
52 let channel = CHANNEL.init(Channel::new(buf)); 52 let channel = CHANNEL.init(Channel::new(buf));
53 let (sender, receiver) = channel.split(); 53 let (sender, receiver) = channel.split();
54 54
55 spawner.must_spawn(consumer(receiver)); 55 spawner.spawn(consumer(receiver).unwrap());
56 spawner.must_spawn(producer(sender, adc_parts)); 56 spawner.spawn(producer(sender, adc_parts).unwrap());
57 57
58 let mut ticker = Ticker::every(Duration::from_secs(1)); 58 let mut ticker = Ticker::every(Duration::from_secs(1));
59 loop { 59 loop {
diff --git a/examples/rp235x/src/bin/assign_resources.rs b/examples/rp235x/src/bin/assign_resources.rs
index 341f54d22..4ee4278b5 100644
--- a/examples/rp235x/src/bin/assign_resources.rs
+++ b/examples/rp235x/src/bin/assign_resources.rs
@@ -26,15 +26,13 @@ async fn main(spawner: Spawner) {
26 let p = embassy_rp::init(Default::default()); 26 let p = embassy_rp::init(Default::default());
27 27
28 // 1) Assigning a resource to a task by passing parts of the peripherals. 28 // 1) Assigning a resource to a task by passing parts of the peripherals.
29 spawner 29 spawner.spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21).unwrap());
30 .spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21))
31 .unwrap();
32 30
33 // 2) Using the assign-resources macro to assign resources to a task. 31 // 2) Using the assign-resources macro to assign resources to a task.
34 // we perform the split, see further below for the definition of the resources struct 32 // we perform the split, see further below for the definition of the resources struct
35 let r = split_resources!(p); 33 let r = split_resources!(p);
36 // and then we can use them 34 // and then we can use them
37 spawner.spawn(double_blinky_macro_assigned(spawner, r.leds)).unwrap(); 35 spawner.spawn(double_blinky_macro_assigned(spawner, r.leds).unwrap());
38} 36}
39 37
40// 1) Assigning a resource to a task by passing parts of the peripherals. 38// 1) Assigning a resource to a task by passing parts of the peripherals.
diff --git a/examples/rp235x/src/bin/blinky_two_channels.rs b/examples/rp235x/src/bin/blinky_two_channels.rs
index 51e139e94..87f3a3545 100644
--- a/examples/rp235x/src/bin/blinky_two_channels.rs
+++ b/examples/rp235x/src/bin/blinky_two_channels.rs
@@ -27,8 +27,8 @@ async fn main(spawner: Spawner) {
27 let dt = 100 * 1_000_000; 27 let dt = 100 * 1_000_000;
28 let k = 1.003; 28 let k = 1.003;
29 29
30 unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); 30 spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt))));
31 unwrap!(spawner.spawn(toggle_led( 31 spawner.spawn(unwrap!(toggle_led(
32 CHANNEL.sender(), 32 CHANNEL.sender(),
33 Duration::from_nanos((dt as f64 * k) as u64) 33 Duration::from_nanos((dt as f64 * k) as u64)
34 ))); 34 )));
diff --git a/examples/rp235x/src/bin/blinky_two_tasks.rs b/examples/rp235x/src/bin/blinky_two_tasks.rs
index 67a9108c0..aac7d928b 100644
--- a/examples/rp235x/src/bin/blinky_two_tasks.rs
+++ b/examples/rp235x/src/bin/blinky_two_tasks.rs
@@ -30,8 +30,8 @@ async fn main(spawner: Spawner) {
30 let dt = 100 * 1_000_000; 30 let dt = 100 * 1_000_000;
31 let k = 1.003; 31 let k = 1.003;
32 32
33 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); 33 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos(dt))));
34 unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); 34 spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64))));
35} 35}
36 36
37#[embassy_executor::task(pool_size = 2)] 37#[embassy_executor::task(pool_size = 2)]
diff --git a/examples/rp235x/src/bin/blinky_wifi.rs b/examples/rp235x/src/bin/blinky_wifi.rs
index ef6057a1c..b2201f0ae 100644
--- a/examples/rp235x/src/bin/blinky_wifi.rs
+++ b/examples/rp235x/src/bin/blinky_wifi.rs
@@ -71,7 +71,7 @@ async fn main(spawner: Spawner) {
71 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 71 static STATE: StaticCell<cyw43::State> = StaticCell::new();
72 let state = STATE.init(cyw43::State::new()); 72 let state = STATE.init(cyw43::State::new());
73 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 73 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
74 unwrap!(spawner.spawn(cyw43_task(runner))); 74 spawner.spawn(unwrap!(cyw43_task(runner)));
75 75
76 control.init(clm).await; 76 control.init(clm).await;
77 control 77 control
diff --git a/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs b/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs
index 0a5bccfb3..e6d6f687b 100644
--- a/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs
+++ b/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs
@@ -68,7 +68,7 @@ async fn main(spawner: Spawner) {
68 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 68 static STATE: StaticCell<cyw43::State> = StaticCell::new();
69 let state = STATE.init(cyw43::State::new()); 69 let state = STATE.init(cyw43::State::new());
70 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 70 let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
71 unwrap!(spawner.spawn(cyw43_task(runner))); 71 spawner.spawn(unwrap!(cyw43_task(runner)));
72 72
73 control.init(clm).await; 73 control.init(clm).await;
74 control 74 control
diff --git a/examples/rp235x/src/bin/ethernet_w5500_icmp.rs b/examples/rp235x/src/bin/ethernet_w5500_icmp.rs
index f1abd311c..f012c9589 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_icmp.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_icmp.rs
@@ -61,7 +61,7 @@ async fn main(spawner: Spawner) {
61 ) 61 )
62 .await 62 .await
63 .unwrap(); 63 .unwrap();
64 unwrap!(spawner.spawn(ethernet_task(runner))); 64 spawner.spawn(unwrap!(ethernet_task(runner)));
65 65
66 // Generate random seed 66 // Generate random seed
67 let seed = rng.next_u64(); 67 let seed = rng.next_u64();
@@ -76,7 +76,7 @@ async fn main(spawner: Spawner) {
76 ); 76 );
77 77
78 // Launch network task 78 // Launch network task
79 unwrap!(spawner.spawn(net_task(runner))); 79 spawner.spawn(unwrap!(net_task(runner)));
80 80
81 info!("Waiting for DHCP..."); 81 info!("Waiting for DHCP...");
82 let cfg = wait_for_config(stack).await; 82 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs b/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs
index 1f799a6b0..309d3e4f7 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs
@@ -63,7 +63,7 @@ async fn main(spawner: Spawner) {
63 ) 63 )
64 .await 64 .await
65 .unwrap(); 65 .unwrap();
66 unwrap!(spawner.spawn(ethernet_task(runner))); 66 spawner.spawn(unwrap!(ethernet_task(runner)));
67 67
68 // Generate random seed 68 // Generate random seed
69 let seed = rng.next_u64(); 69 let seed = rng.next_u64();
@@ -78,7 +78,7 @@ async fn main(spawner: Spawner) {
78 ); 78 );
79 79
80 // Launch network task 80 // Launch network task
81 unwrap!(spawner.spawn(net_task(runner))); 81 spawner.spawn(unwrap!(net_task(runner)));
82 82
83 info!("Waiting for DHCP..."); 83 info!("Waiting for DHCP...");
84 let cfg = wait_for_config(stack).await; 84 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs b/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs
index fd8bc5c7a..7cfc00776 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs
@@ -64,7 +64,7 @@ async fn main(spawner: Spawner) {
64 ) 64 )
65 .await 65 .await
66 .unwrap(); 66 .unwrap();
67 unwrap!(spawner.spawn(ethernet_task(runner))); 67 spawner.spawn(unwrap!(ethernet_task(runner)));
68 68
69 // Generate random seed 69 // Generate random seed
70 let seed = rng.next_u64(); 70 let seed = rng.next_u64();
@@ -79,7 +79,7 @@ async fn main(spawner: Spawner) {
79 ); 79 );
80 80
81 // Launch network task 81 // Launch network task
82 unwrap!(spawner.spawn(net_task(runner))); 82 spawner.spawn(unwrap!(net_task(runner)));
83 83
84 info!("Waiting for DHCP..."); 84 info!("Waiting for DHCP...");
85 let cfg = wait_for_config(stack).await; 85 let cfg = wait_for_config(stack).await;
@@ -87,8 +87,8 @@ async fn main(spawner: Spawner) {
87 info!("IP address: {:?}", local_addr); 87 info!("IP address: {:?}", local_addr);
88 88
89 // Create two sockets listening to the same port, to handle simultaneous connections 89 // Create two sockets listening to the same port, to handle simultaneous connections
90 unwrap!(spawner.spawn(listen_task(stack, 0, 1234))); 90 spawner.spawn(unwrap!(listen_task(stack, 0, 1234)));
91 unwrap!(spawner.spawn(listen_task(stack, 1, 1234))); 91 spawner.spawn(unwrap!(listen_task(stack, 1, 1234)));
92} 92}
93 93
94#[embassy_executor::task(pool_size = 2)] 94#[embassy_executor::task(pool_size = 2)]
diff --git a/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs b/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs
index b726b9cc6..254aada9a 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs
@@ -67,7 +67,7 @@ async fn main(spawner: Spawner) {
67 ) 67 )
68 .await 68 .await
69 .unwrap(); 69 .unwrap();
70 unwrap!(spawner.spawn(ethernet_task(runner))); 70 spawner.spawn(unwrap!(ethernet_task(runner)));
71 71
72 // Generate random seed 72 // Generate random seed
73 let seed = rng.next_u64(); 73 let seed = rng.next_u64();
@@ -82,7 +82,7 @@ async fn main(spawner: Spawner) {
82 ); 82 );
83 83
84 // Launch network task 84 // Launch network task
85 unwrap!(spawner.spawn(net_task(runner))); 85 spawner.spawn(unwrap!(net_task(runner)));
86 86
87 info!("Waiting for DHCP..."); 87 info!("Waiting for DHCP...");
88 let cfg = wait_for_config(stack).await; 88 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs b/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs
index 32b3880f6..ba812f4fd 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs
@@ -66,7 +66,7 @@ async fn main(spawner: Spawner) {
66 ) 66 )
67 .await 67 .await
68 .unwrap(); 68 .unwrap();
69 unwrap!(spawner.spawn(ethernet_task(runner))); 69 spawner.spawn(unwrap!(ethernet_task(runner)));
70 70
71 // Generate random seed 71 // Generate random seed
72 let seed = rng.next_u64(); 72 let seed = rng.next_u64();
@@ -81,7 +81,7 @@ async fn main(spawner: Spawner) {
81 ); 81 );
82 82
83 // Launch network task 83 // Launch network task
84 unwrap!(spawner.spawn(net_task(runner))); 84 spawner.spawn(unwrap!(net_task(runner)));
85 85
86 info!("Waiting for DHCP..."); 86 info!("Waiting for DHCP...");
87 let cfg = wait_for_config(stack).await; 87 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp235x/src/bin/ethernet_w5500_udp.rs b/examples/rp235x/src/bin/ethernet_w5500_udp.rs
index cd0824df1..ae74ad518 100644
--- a/examples/rp235x/src/bin/ethernet_w5500_udp.rs
+++ b/examples/rp235x/src/bin/ethernet_w5500_udp.rs
@@ -64,7 +64,7 @@ async fn main(spawner: Spawner) {
64 ) 64 )
65 .await 65 .await
66 .unwrap(); 66 .unwrap();
67 unwrap!(spawner.spawn(ethernet_task(runner))); 67 spawner.spawn(unwrap!(ethernet_task(runner)));
68 68
69 // Generate random seed 69 // Generate random seed
70 let seed = rng.next_u64(); 70 let seed = rng.next_u64();
@@ -79,7 +79,7 @@ async fn main(spawner: Spawner) {
79 ); 79 );
80 80
81 // Launch network task 81 // Launch network task
82 unwrap!(spawner.spawn(net_task(runner))); 82 spawner.spawn(unwrap!(net_task(runner)));
83 83
84 info!("Waiting for DHCP..."); 84 info!("Waiting for DHCP...");
85 let cfg = wait_for_config(stack).await; 85 let cfg = wait_for_config(stack).await;
diff --git a/examples/rp235x/src/bin/i2c_slave.rs b/examples/rp235x/src/bin/i2c_slave.rs
index 9fffb4646..02ad9a003 100644
--- a/examples/rp235x/src/bin/i2c_slave.rs
+++ b/examples/rp235x/src/bin/i2c_slave.rs
@@ -105,7 +105,7 @@ async fn main(spawner: Spawner) {
105 config.addr = DEV_ADDR as u16; 105 config.addr = DEV_ADDR as u16;
106 let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); 106 let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config);
107 107
108 unwrap!(spawner.spawn(device_task(device))); 108 spawner.spawn(unwrap!(device_task(device)));
109 109
110 let c_sda = p.PIN_1; 110 let c_sda = p.PIN_1;
111 let c_scl = p.PIN_0; 111 let c_scl = p.PIN_0;
@@ -113,5 +113,5 @@ async fn main(spawner: Spawner) {
113 config.frequency = 1_000_000; 113 config.frequency = 1_000_000;
114 let controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, config); 114 let controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, config);
115 115
116 unwrap!(spawner.spawn(controller_task(controller))); 116 spawner.spawn(unwrap!(controller_task(controller)));
117} 117}
diff --git a/examples/rp235x/src/bin/interrupt.rs b/examples/rp235x/src/bin/interrupt.rs
index e9ac76486..88513180c 100644
--- a/examples/rp235x/src/bin/interrupt.rs
+++ b/examples/rp235x/src/bin/interrupt.rs
@@ -51,7 +51,7 @@ async fn main(spawner: Spawner) {
51 // No Mutex needed when sharing within the same executor/prio level 51 // No Mutex needed when sharing within the same executor/prio level
52 static AVG: StaticCell<Cell<u32>> = StaticCell::new(); 52 static AVG: StaticCell<Cell<u32>> = StaticCell::new();
53 let avg = AVG.init(Default::default()); 53 let avg = AVG.init(Default::default());
54 spawner.must_spawn(processing(avg)); 54 spawner.spawn(processing(avg).unwrap());
55 55
56 let mut ticker = Ticker::every(Duration::from_secs(1)); 56 let mut ticker = Ticker::every(Duration::from_secs(1));
57 loop { 57 loop {
diff --git a/examples/rp235x/src/bin/multicore.rs b/examples/rp235x/src/bin/multicore.rs
index f02dc3876..4f82801d6 100644
--- a/examples/rp235x/src/bin/multicore.rs
+++ b/examples/rp235x/src/bin/multicore.rs
@@ -35,12 +35,12 @@ fn main() -> ! {
35 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, 35 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) },
36 move || { 36 move || {
37 let executor1 = EXECUTOR1.init(Executor::new()); 37 let executor1 = EXECUTOR1.init(Executor::new());
38 executor1.run(|spawner| unwrap!(spawner.spawn(core1_task(led)))); 38 executor1.run(|spawner| spawner.spawn(unwrap!(core1_task(led))));
39 }, 39 },
40 ); 40 );
41 41
42 let executor0 = EXECUTOR0.init(Executor::new()); 42 let executor0 = EXECUTOR0.init(Executor::new());
43 executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); 43 executor0.run(|spawner| spawner.spawn(unwrap!(core0_task())));
44} 44}
45 45
46#[embassy_executor::task] 46#[embassy_executor::task]
diff --git a/examples/rp235x/src/bin/multiprio.rs b/examples/rp235x/src/bin/multiprio.rs
index 2b397f97d..96cdf8fb1 100644
--- a/examples/rp235x/src/bin/multiprio.rs
+++ b/examples/rp235x/src/bin/multiprio.rs
@@ -130,16 +130,16 @@ fn main() -> ! {
130 // High-priority executor: SWI_IRQ_1, priority level 2 130 // High-priority executor: SWI_IRQ_1, priority level 2
131 interrupt::SWI_IRQ_1.set_priority(Priority::P2); 131 interrupt::SWI_IRQ_1.set_priority(Priority::P2);
132 let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1); 132 let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1);
133 unwrap!(spawner.spawn(run_high())); 133 spawner.spawn(unwrap!(run_high()));
134 134
135 // Medium-priority executor: SWI_IRQ_0, priority level 3 135 // Medium-priority executor: SWI_IRQ_0, priority level 3
136 interrupt::SWI_IRQ_0.set_priority(Priority::P3); 136 interrupt::SWI_IRQ_0.set_priority(Priority::P3);
137 let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0); 137 let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0);
138 unwrap!(spawner.spawn(run_med())); 138 spawner.spawn(unwrap!(run_med()));
139 139
140 // Low priority executor: runs in thread mode, using WFE/SEV 140 // Low priority executor: runs in thread mode, using WFE/SEV
141 let executor = EXECUTOR_LOW.init(Executor::new()); 141 let executor = EXECUTOR_LOW.init(Executor::new());
142 executor.run(|spawner| { 142 executor.run(|spawner| {
143 unwrap!(spawner.spawn(run_low())); 143 spawner.spawn(unwrap!(run_low()));
144 }); 144 });
145} 145}
diff --git a/examples/rp235x/src/bin/pio_async.rs b/examples/rp235x/src/bin/pio_async.rs
index a519b8a50..d76930f5c 100644
--- a/examples/rp235x/src/bin/pio_async.rs
+++ b/examples/rp235x/src/bin/pio_async.rs
@@ -125,7 +125,7 @@ async fn main(spawner: Spawner) {
125 setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0); 125 setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0);
126 setup_pio_task_sm1(&mut common, &mut sm1); 126 setup_pio_task_sm1(&mut common, &mut sm1);
127 setup_pio_task_sm2(&mut common, &mut sm2); 127 setup_pio_task_sm2(&mut common, &mut sm2);
128 spawner.spawn(pio_task_sm0(sm0)).unwrap(); 128 spawner.spawn(pio_task_sm0(sm0).unwrap());
129 spawner.spawn(pio_task_sm1(sm1)).unwrap(); 129 spawner.spawn(pio_task_sm1(sm1).unwrap());
130 spawner.spawn(pio_task_sm2(irq3, sm2)).unwrap(); 130 spawner.spawn(pio_task_sm2(irq3, sm2).unwrap());
131} 131}
diff --git a/examples/rp235x/src/bin/pio_rotary_encoder.rs b/examples/rp235x/src/bin/pio_rotary_encoder.rs
index e820d316d..610d1a40b 100644
--- a/examples/rp235x/src/bin/pio_rotary_encoder.rs
+++ b/examples/rp235x/src/bin/pio_rotary_encoder.rs
@@ -50,6 +50,6 @@ async fn main(spawner: Spawner) {
50 let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg); 50 let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg);
51 let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg); 51 let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg);
52 52
53 spawner.must_spawn(encoder_0(encoder0)); 53 spawner.spawn(encoder_0(encoder0).unwrap());
54 spawner.must_spawn(encoder_1(encoder1)); 54 spawner.spawn(encoder_1(encoder1).unwrap());
55} 55}
diff --git a/examples/rp235x/src/bin/pwm.rs b/examples/rp235x/src/bin/pwm.rs
index da1acc18a..289480c85 100644
--- a/examples/rp235x/src/bin/pwm.rs
+++ b/examples/rp235x/src/bin/pwm.rs
@@ -18,8 +18,8 @@ use {defmt_rtt as _, panic_probe as _};
18#[embassy_executor::main] 18#[embassy_executor::main]
19async fn main(spawner: Spawner) { 19async fn main(spawner: Spawner) {
20 let p = embassy_rp::init(Default::default()); 20 let p = embassy_rp::init(Default::default());
21 spawner.spawn(pwm_set_config(p.PWM_SLICE4, p.PIN_25)).unwrap(); 21 spawner.spawn(pwm_set_config(p.PWM_SLICE4, p.PIN_25).unwrap());
22 spawner.spawn(pwm_set_dutycycle(p.PWM_SLICE2, p.PIN_4)).unwrap(); 22 spawner.spawn(pwm_set_dutycycle(p.PWM_SLICE2, p.PIN_4).unwrap());
23} 23}
24 24
25/// Demonstrate PWM by modifying & applying the config 25/// Demonstrate PWM by modifying & applying the config
diff --git a/examples/rp235x/src/bin/shared_bus.rs b/examples/rp235x/src/bin/shared_bus.rs
index 9267dfccb..db7566b1a 100644
--- a/examples/rp235x/src/bin/shared_bus.rs
+++ b/examples/rp235x/src/bin/shared_bus.rs
@@ -35,8 +35,8 @@ async fn main(spawner: Spawner) {
35 static I2C_BUS: StaticCell<I2c1Bus> = StaticCell::new(); 35 static I2C_BUS: StaticCell<I2c1Bus> = StaticCell::new();
36 let i2c_bus = I2C_BUS.init(Mutex::new(i2c)); 36 let i2c_bus = I2C_BUS.init(Mutex::new(i2c));
37 37
38 spawner.must_spawn(i2c_task_a(i2c_bus)); 38 spawner.spawn(i2c_task_a(i2c_bus).unwrap());
39 spawner.must_spawn(i2c_task_b(i2c_bus)); 39 spawner.spawn(i2c_task_b(i2c_bus).unwrap());
40 40
41 // Shared SPI bus 41 // Shared SPI bus
42 let spi_cfg = spi::Config::default(); 42 let spi_cfg = spi::Config::default();
@@ -48,8 +48,8 @@ async fn main(spawner: Spawner) {
48 let cs_a = Output::new(p.PIN_0, Level::High); 48 let cs_a = Output::new(p.PIN_0, Level::High);
49 let cs_b = Output::new(p.PIN_1, Level::High); 49 let cs_b = Output::new(p.PIN_1, Level::High);
50 50
51 spawner.must_spawn(spi_task_a(spi_bus, cs_a)); 51 spawner.spawn(spi_task_a(spi_bus, cs_a).unwrap());
52 spawner.must_spawn(spi_task_b(spi_bus, cs_b)); 52 spawner.spawn(spi_task_b(spi_bus, cs_b).unwrap());
53} 53}
54 54
55#[embassy_executor::task] 55#[embassy_executor::task]
diff --git a/examples/rp235x/src/bin/sharing.rs b/examples/rp235x/src/bin/sharing.rs
index 856be6ace..d4c89946b 100644
--- a/examples/rp235x/src/bin/sharing.rs
+++ b/examples/rp235x/src/bin/sharing.rs
@@ -68,7 +68,7 @@ fn main() -> ! {
68 // High-priority executor: runs in interrupt mode 68 // High-priority executor: runs in interrupt mode
69 interrupt::SWI_IRQ_0.set_priority(Priority::P3); 69 interrupt::SWI_IRQ_0.set_priority(Priority::P3);
70 let spawner = EXECUTOR_HI.start(interrupt::SWI_IRQ_0); 70 let spawner = EXECUTOR_HI.start(interrupt::SWI_IRQ_0);
71 spawner.must_spawn(task_a(uart)); 71 spawner.spawn(task_a(uart).unwrap());
72 72
73 // Low priority executor: runs in thread mode 73 // Low priority executor: runs in thread mode
74 let executor = EXECUTOR_LOW.init(Executor::new()); 74 let executor = EXECUTOR_LOW.init(Executor::new());
@@ -83,8 +83,8 @@ fn main() -> ! {
83 static REF_CELL: ConstStaticCell<RefCell<MyType>> = ConstStaticCell::new(RefCell::new(MyType { inner: 0 })); 83 static REF_CELL: ConstStaticCell<RefCell<MyType>> = ConstStaticCell::new(RefCell::new(MyType { inner: 0 }));
84 let ref_cell = REF_CELL.take(); 84 let ref_cell = REF_CELL.take();
85 85
86 spawner.must_spawn(task_b(uart, cell, ref_cell)); 86 spawner.spawn(task_b(uart, cell, ref_cell).unwrap());
87 spawner.must_spawn(task_c(cell, ref_cell)); 87 spawner.spawn(task_c(cell, ref_cell).unwrap());
88 }); 88 });
89} 89}
90 90
diff --git a/examples/rp235x/src/bin/uart_buffered_split.rs b/examples/rp235x/src/bin/uart_buffered_split.rs
index 7cad09f9b..061be873d 100644
--- a/examples/rp235x/src/bin/uart_buffered_split.rs
+++ b/examples/rp235x/src/bin/uart_buffered_split.rs
@@ -33,7 +33,7 @@ async fn main(spawner: Spawner) {
33 let uart = BufferedUart::new(uart, tx_pin, rx_pin, Irqs, tx_buf, rx_buf, Config::default()); 33 let uart = BufferedUart::new(uart, tx_pin, rx_pin, Irqs, tx_buf, rx_buf, Config::default());
34 let (mut tx, rx) = uart.split(); 34 let (mut tx, rx) = uart.split();
35 35
36 unwrap!(spawner.spawn(reader(rx))); 36 spawner.spawn(unwrap!(reader(rx)));
37 37
38 info!("Writing..."); 38 info!("Writing...");
39 loop { 39 loop {
diff --git a/examples/rp235x/src/bin/uart_unidir.rs b/examples/rp235x/src/bin/uart_unidir.rs
index 45c9c8407..0c80d24c9 100644
--- a/examples/rp235x/src/bin/uart_unidir.rs
+++ b/examples/rp235x/src/bin/uart_unidir.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) {
27 let mut uart_tx = UartTx::new(p.UART0, p.PIN_0, p.DMA_CH0, Config::default()); 27 let mut uart_tx = UartTx::new(p.UART0, p.PIN_0, p.DMA_CH0, Config::default());
28 let uart_rx = UartRx::new(p.UART1, p.PIN_5, Irqs, p.DMA_CH1, Config::default()); 28 let uart_rx = UartRx::new(p.UART1, p.PIN_5, Irqs, p.DMA_CH1, Config::default());
29 29
30 unwrap!(spawner.spawn(reader(uart_rx))); 30 spawner.spawn(unwrap!(reader(uart_rx)));
31 31
32 info!("Writing..."); 32 info!("Writing...");
33 loop { 33 loop {
diff --git a/examples/rp235x/src/bin/zerocopy.rs b/examples/rp235x/src/bin/zerocopy.rs
index 086c86cac..62ba4cfb8 100644
--- a/examples/rp235x/src/bin/zerocopy.rs
+++ b/examples/rp235x/src/bin/zerocopy.rs
@@ -52,8 +52,8 @@ async fn main(spawner: Spawner) {
52 let channel = CHANNEL.init(Channel::new(buf)); 52 let channel = CHANNEL.init(Channel::new(buf));
53 let (sender, receiver) = channel.split(); 53 let (sender, receiver) = channel.split();
54 54
55 spawner.must_spawn(consumer(receiver)); 55 spawner.spawn(consumer(receiver).unwrap());
56 spawner.must_spawn(producer(sender, adc_parts)); 56 spawner.spawn(producer(sender, adc_parts).unwrap());
57 57
58 let mut ticker = Ticker::every(Duration::from_secs(1)); 58 let mut ticker = Ticker::every(Duration::from_secs(1));
59 loop { 59 loop {
diff --git a/examples/std/src/bin/net.rs b/examples/std/src/bin/net.rs
index 232cf494b..fd7b6c930 100644
--- a/examples/std/src/bin/net.rs
+++ b/examples/std/src/bin/net.rs
@@ -56,7 +56,7 @@ async fn main_task(spawner: Spawner) {
56 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 56 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
57 57
58 // Launch network task 58 // Launch network task
59 spawner.spawn(net_task(runner)).unwrap(); 59 spawner.spawn(net_task(runner).unwrap());
60 60
61 // Then we can use it! 61 // Then we can use it!
62 let mut rx_buffer = [0; 4096]; 62 let mut rx_buffer = [0; 4096];
@@ -95,6 +95,6 @@ fn main() {
95 95
96 let executor = EXECUTOR.init(Executor::new()); 96 let executor = EXECUTOR.init(Executor::new());
97 executor.run(|spawner| { 97 executor.run(|spawner| {
98 spawner.spawn(main_task(spawner)).unwrap(); 98 spawner.spawn(main_task(spawner).unwrap());
99 }); 99 });
100} 100}
diff --git a/examples/std/src/bin/net_dns.rs b/examples/std/src/bin/net_dns.rs
index cf90731dd..dff704b86 100644
--- a/examples/std/src/bin/net_dns.rs
+++ b/examples/std/src/bin/net_dns.rs
@@ -53,7 +53,7 @@ async fn main_task(spawner: Spawner) {
53 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 53 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
54 54
55 // Launch network task 55 // Launch network task
56 spawner.spawn(net_task(runner)).unwrap(); 56 spawner.spawn(net_task(runner).unwrap());
57 57
58 let host = "example.com"; 58 let host = "example.com";
59 info!("querying host {:?}...", host); 59 info!("querying host {:?}...", host);
@@ -78,6 +78,6 @@ fn main() {
78 78
79 let executor = EXECUTOR.init(Executor::new()); 79 let executor = EXECUTOR.init(Executor::new());
80 executor.run(|spawner| { 80 executor.run(|spawner| {
81 spawner.spawn(main_task(spawner)).unwrap(); 81 spawner.spawn(main_task(spawner).unwrap());
82 }); 82 });
83} 83}
diff --git a/examples/std/src/bin/net_ppp.rs b/examples/std/src/bin/net_ppp.rs
index ac3aea6ff..82272c798 100644
--- a/examples/std/src/bin/net_ppp.rs
+++ b/examples/std/src/bin/net_ppp.rs
@@ -102,8 +102,8 @@ async fn main_task(spawner: Spawner) {
102 ); 102 );
103 103
104 // Launch network task 104 // Launch network task
105 spawner.spawn(net_task(net_runner)).unwrap(); 105 spawner.spawn(net_task(net_runner).unwrap());
106 spawner.spawn(ppp_task(stack, runner, port)).unwrap(); 106 spawner.spawn(ppp_task(stack, runner, port).unwrap());
107 107
108 // Then we can use it! 108 // Then we can use it!
109 let mut rx_buffer = [0; 4096]; 109 let mut rx_buffer = [0; 4096];
@@ -160,6 +160,6 @@ fn main() {
160 160
161 let executor = EXECUTOR.init(Executor::new()); 161 let executor = EXECUTOR.init(Executor::new());
162 executor.run(|spawner| { 162 executor.run(|spawner| {
163 spawner.spawn(main_task(spawner)).unwrap(); 163 spawner.spawn(main_task(spawner).unwrap());
164 }); 164 });
165} 165}
diff --git a/examples/std/src/bin/net_udp.rs b/examples/std/src/bin/net_udp.rs
index 53632a5b4..c5c4da65f 100644
--- a/examples/std/src/bin/net_udp.rs
+++ b/examples/std/src/bin/net_udp.rs
@@ -52,7 +52,7 @@ async fn main_task(spawner: Spawner) {
52 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 52 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
53 53
54 // Launch network task 54 // Launch network task
55 spawner.spawn(net_task(runner)).unwrap(); 55 spawner.spawn(net_task(runner).unwrap());
56 56
57 // Then we can use it! 57 // Then we can use it!
58 let mut rx_meta = [PacketMetadata::EMPTY; 16]; 58 let mut rx_meta = [PacketMetadata::EMPTY; 16];
@@ -86,6 +86,6 @@ fn main() {
86 86
87 let executor = EXECUTOR.init(Executor::new()); 87 let executor = EXECUTOR.init(Executor::new());
88 executor.run(|spawner| { 88 executor.run(|spawner| {
89 spawner.spawn(main_task(spawner)).unwrap(); 89 spawner.spawn(main_task(spawner).unwrap());
90 }); 90 });
91} 91}
diff --git a/examples/std/src/bin/serial.rs b/examples/std/src/bin/serial.rs
index 10c85511d..1ed9997c4 100644
--- a/examples/std/src/bin/serial.rs
+++ b/examples/std/src/bin/serial.rs
@@ -50,6 +50,6 @@ fn main() {
50 50
51 let executor = EXECUTOR.init(Executor::new()); 51 let executor = EXECUTOR.init(Executor::new());
52 executor.run(|spawner| { 52 executor.run(|spawner| {
53 spawner.spawn(run()).unwrap(); 53 spawner.spawn(run().unwrap());
54 }); 54 });
55} 55}
diff --git a/examples/std/src/bin/tcp_accept.rs b/examples/std/src/bin/tcp_accept.rs
index 961c20e2d..77886f471 100644
--- a/examples/std/src/bin/tcp_accept.rs
+++ b/examples/std/src/bin/tcp_accept.rs
@@ -54,7 +54,7 @@ async fn main_task(spawner: Spawner) {
54 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 54 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
55 55
56 // Launch network task 56 // Launch network task
57 spawner.spawn(net_task(runner)).unwrap(); 57 spawner.spawn(net_task(runner).unwrap());
58 58
59 // Then we can use it! 59 // Then we can use it!
60 let mut rx_buffer = [0; 4096]; 60 let mut rx_buffer = [0; 4096];
@@ -101,6 +101,6 @@ fn main() {
101 101
102 let executor = EXECUTOR.init(Executor::new()); 102 let executor = EXECUTOR.init(Executor::new());
103 executor.run(|spawner| { 103 executor.run(|spawner| {
104 spawner.spawn(main_task(spawner)).unwrap(); 104 spawner.spawn(main_task(spawner).unwrap());
105 }); 105 });
106} 106}
diff --git a/examples/std/src/bin/tick.rs b/examples/std/src/bin/tick.rs
index f23cf3549..16b82c82b 100644
--- a/examples/std/src/bin/tick.rs
+++ b/examples/std/src/bin/tick.rs
@@ -17,5 +17,5 @@ async fn main(spawner: Spawner) {
17 .format_timestamp_nanos() 17 .format_timestamp_nanos()
18 .init(); 18 .init();
19 19
20 spawner.spawn(run()).unwrap(); 20 spawner.spawn(run().unwrap());
21} 21}
diff --git a/examples/stm32f0/src/bin/button_controlled_blink.rs b/examples/stm32f0/src/bin/button_controlled_blink.rs
index 744df3e3b..f232e3290 100644
--- a/examples/stm32f0/src/bin/button_controlled_blink.rs
+++ b/examples/stm32f0/src/bin/button_controlled_blink.rs
@@ -46,7 +46,7 @@ async fn main(spawner: Spawner) {
46 BLINK_MS.store(del_var, Ordering::Relaxed); 46 BLINK_MS.store(del_var, Ordering::Relaxed);
47 47
48 // Spawn LED blinking task 48 // Spawn LED blinking task
49 spawner.spawn(led_task(p.PA5.into())).unwrap(); 49 spawner.spawn(led_task(p.PA5.into()).unwrap());
50 50
51 loop { 51 loop {
52 // Check if button got pressed 52 // Check if button got pressed
diff --git a/examples/stm32f0/src/bin/multiprio.rs b/examples/stm32f0/src/bin/multiprio.rs
index 84e4077ef..b5244afc8 100644
--- a/examples/stm32f0/src/bin/multiprio.rs
+++ b/examples/stm32f0/src/bin/multiprio.rs
@@ -134,16 +134,16 @@ fn main() -> ! {
134 // High-priority executor: USART1, priority level 6 134 // High-priority executor: USART1, priority level 6
135 interrupt::USART1.set_priority(Priority::P6); 135 interrupt::USART1.set_priority(Priority::P6);
136 let spawner = EXECUTOR_HIGH.start(interrupt::USART1); 136 let spawner = EXECUTOR_HIGH.start(interrupt::USART1);
137 unwrap!(spawner.spawn(run_high())); 137 spawner.spawn(unwrap!(run_high()));
138 138
139 // Medium-priority executor: USART2, priority level 7 139 // Medium-priority executor: USART2, priority level 7
140 interrupt::USART2.set_priority(Priority::P7); 140 interrupt::USART2.set_priority(Priority::P7);
141 let spawner = EXECUTOR_MED.start(interrupt::USART2); 141 let spawner = EXECUTOR_MED.start(interrupt::USART2);
142 unwrap!(spawner.spawn(run_med())); 142 spawner.spawn(unwrap!(run_med()));
143 143
144 // Low priority executor: runs in thread mode, using WFE/SEV 144 // Low priority executor: runs in thread mode, using WFE/SEV
145 let executor = EXECUTOR_LOW.init(Executor::new()); 145 let executor = EXECUTOR_LOW.init(Executor::new());
146 executor.run(|spawner| { 146 executor.run(|spawner| {
147 unwrap!(spawner.spawn(run_low())); 147 spawner.spawn(unwrap!(run_low()));
148 }); 148 });
149} 149}
diff --git a/examples/stm32f1/src/bin/input_capture.rs b/examples/stm32f1/src/bin/input_capture.rs
index 84811fb95..d747a43c2 100644
--- a/examples/stm32f1/src/bin/input_capture.rs
+++ b/examples/stm32f1/src/bin/input_capture.rs
@@ -37,7 +37,7 @@ async fn main(spawner: Spawner) {
37 let p = embassy_stm32::init(Default::default()); 37 let p = embassy_stm32::init(Default::default());
38 info!("Hello World!"); 38 info!("Hello World!");
39 39
40 unwrap!(spawner.spawn(blinky(p.PC13))); 40 spawner.spawn(unwrap!(blinky(p.PC13)));
41 41
42 let ch3 = CapturePin::new(p.PA2, Pull::None); 42 let ch3 = CapturePin::new(p.PA2, Pull::None);
43 let mut ic = InputCapture::new(p.TIM2, None, None, Some(ch3), None, Irqs, khz(1000), Default::default()); 43 let mut ic = InputCapture::new(p.TIM2, None, None, Some(ch3), None, Irqs, khz(1000), Default::default());
diff --git a/examples/stm32f1/src/bin/pwm_input.rs b/examples/stm32f1/src/bin/pwm_input.rs
index aa6a11ff8..63b899767 100644
--- a/examples/stm32f1/src/bin/pwm_input.rs
+++ b/examples/stm32f1/src/bin/pwm_input.rs
@@ -36,7 +36,7 @@ async fn main(spawner: Spawner) {
36 let p = embassy_stm32::init(Default::default()); 36 let p = embassy_stm32::init(Default::default());
37 info!("Hello World!"); 37 info!("Hello World!");
38 38
39 unwrap!(spawner.spawn(blinky(p.PC13))); 39 spawner.spawn(unwrap!(blinky(p.PC13)));
40 40
41 let mut pwm_input = PwmInput::new_ch1(p.TIM2, p.PA0, Pull::None, khz(10)); 41 let mut pwm_input = PwmInput::new_ch1(p.TIM2, p.PA0, Pull::None, khz(10));
42 pwm_input.enable(); 42 pwm_input.enable();
diff --git a/examples/stm32f3/src/bin/button_events.rs b/examples/stm32f3/src/bin/button_events.rs
index f5ed5d2c9..a54d03212 100644
--- a/examples/stm32f3/src/bin/button_events.rs
+++ b/examples/stm32f3/src/bin/button_events.rs
@@ -113,8 +113,8 @@ async fn main(spawner: Spawner) {
113 ]; 113 ];
114 let leds = Leds::new(leds); 114 let leds = Leds::new(leds);
115 115
116 spawner.spawn(button_waiter(button)).unwrap(); 116 spawner.spawn(button_waiter(button).unwrap());
117 spawner.spawn(led_blinker(leds)).unwrap(); 117 spawner.spawn(led_blinker(leds).unwrap());
118} 118}
119 119
120#[embassy_executor::task] 120#[embassy_executor::task]
diff --git a/examples/stm32f3/src/bin/multiprio.rs b/examples/stm32f3/src/bin/multiprio.rs
index b4620888f..2f2ffdea2 100644
--- a/examples/stm32f3/src/bin/multiprio.rs
+++ b/examples/stm32f3/src/bin/multiprio.rs
@@ -135,16 +135,16 @@ fn main() -> ! {
135 // High-priority executor: UART4, priority level 6 135 // High-priority executor: UART4, priority level 6
136 interrupt::UART4.set_priority(Priority::P6); 136 interrupt::UART4.set_priority(Priority::P6);
137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4); 137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4);
138 unwrap!(spawner.spawn(run_high())); 138 spawner.spawn(unwrap!(run_high()));
139 139
140 // Medium-priority executor: UART5, priority level 7 140 // Medium-priority executor: UART5, priority level 7
141 interrupt::UART5.set_priority(Priority::P7); 141 interrupt::UART5.set_priority(Priority::P7);
142 let spawner = EXECUTOR_MED.start(interrupt::UART5); 142 let spawner = EXECUTOR_MED.start(interrupt::UART5);
143 unwrap!(spawner.spawn(run_med())); 143 spawner.spawn(unwrap!(run_med()));
144 144
145 // Low priority executor: runs in thread mode, using WFE/SEV 145 // Low priority executor: runs in thread mode, using WFE/SEV
146 let executor = EXECUTOR_LOW.init(Executor::new()); 146 let executor = EXECUTOR_LOW.init(Executor::new());
147 executor.run(|spawner| { 147 executor.run(|spawner| {
148 unwrap!(spawner.spawn(run_low())); 148 spawner.spawn(unwrap!(run_low()));
149 }); 149 });
150} 150}
diff --git a/examples/stm32f4/src/bin/adc_dma.rs b/examples/stm32f4/src/bin/adc_dma.rs
index 43a761e6d..2ec48640e 100644
--- a/examples/stm32f4/src/bin/adc_dma.rs
+++ b/examples/stm32f4/src/bin/adc_dma.rs
@@ -11,7 +11,7 @@ use {defmt_rtt as _, panic_probe as _};
11#[embassy_executor::main] 11#[embassy_executor::main]
12async fn main(spawner: Spawner) { 12async fn main(spawner: Spawner) {
13 let p = embassy_stm32::init(Default::default()); 13 let p = embassy_stm32::init(Default::default());
14 spawner.must_spawn(adc_task(p)); 14 spawner.spawn(adc_task(p).unwrap());
15} 15}
16 16
17#[embassy_executor::task] 17#[embassy_executor::task]
diff --git a/examples/stm32f4/src/bin/eth.rs b/examples/stm32f4/src/bin/eth.rs
index 634d8e2c6..f41a60529 100644
--- a/examples/stm32f4/src/bin/eth.rs
+++ b/examples/stm32f4/src/bin/eth.rs
@@ -91,7 +91,7 @@ async fn main(spawner: Spawner) -> ! {
91 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 91 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
92 92
93 // Launch network task 93 // Launch network task
94 unwrap!(spawner.spawn(net_task(runner))); 94 spawner.spawn(unwrap!(net_task(runner)));
95 95
96 // Ensure DHCP configuration is up before trying connect 96 // Ensure DHCP configuration is up before trying connect
97 stack.wait_config_up().await; 97 stack.wait_config_up().await;
diff --git a/examples/stm32f4/src/bin/eth_w5500.rs b/examples/stm32f4/src/bin/eth_w5500.rs
index 6e6bef08c..7ce3bfe75 100644
--- a/examples/stm32f4/src/bin/eth_w5500.rs
+++ b/examples/stm32f4/src/bin/eth_w5500.rs
@@ -83,7 +83,7 @@ async fn main(spawner: Spawner) -> ! {
83 let (device, runner) = embassy_net_wiznet::new(mac_addr, state, spi, w5500_int, w5500_reset) 83 let (device, runner) = embassy_net_wiznet::new(mac_addr, state, spi, w5500_int, w5500_reset)
84 .await 84 .await
85 .unwrap(); 85 .unwrap();
86 unwrap!(spawner.spawn(ethernet_task(runner))); 86 spawner.spawn(unwrap!(ethernet_task(runner)));
87 87
88 let config = embassy_net::Config::dhcpv4(Default::default()); 88 let config = embassy_net::Config::dhcpv4(Default::default());
89 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { 89 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
@@ -96,7 +96,7 @@ async fn main(spawner: Spawner) -> ! {
96 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 96 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
97 97
98 // Launch network task 98 // Launch network task
99 unwrap!(spawner.spawn(net_task(runner))); 99 spawner.spawn(unwrap!(net_task(runner)));
100 100
101 // Ensure DHCP configuration is up before trying connect 101 // Ensure DHCP configuration is up before trying connect
102 stack.wait_config_up().await; 102 stack.wait_config_up().await;
diff --git a/examples/stm32f4/src/bin/flash_async.rs b/examples/stm32f4/src/bin/flash_async.rs
index 755713542..2feb9de09 100644
--- a/examples/stm32f4/src/bin/flash_async.rs
+++ b/examples/stm32f4/src/bin/flash_async.rs
@@ -21,7 +21,7 @@ async fn main(spawner: Spawner) {
21 let mut f = Flash::new(p.FLASH, Irqs); 21 let mut f = Flash::new(p.FLASH, Irqs);
22 22
23 // Led should blink uninterrupted during ~2sec erase operation 23 // Led should blink uninterrupted during ~2sec erase operation
24 spawner.spawn(blinky(p.PB7.into())).unwrap(); 24 spawner.spawn(blinky(p.PB7.into()).unwrap());
25 25
26 // Test on bank 2 in order not to stall CPU. 26 // Test on bank 2 in order not to stall CPU.
27 test_flash(&mut f, 1024 * 1024, 128 * 1024).await; 27 test_flash(&mut f, 1024 * 1024, 128 * 1024).await;
diff --git a/examples/stm32f4/src/bin/input_capture.rs b/examples/stm32f4/src/bin/input_capture.rs
index e15b4d26e..9998c4733 100644
--- a/examples/stm32f4/src/bin/input_capture.rs
+++ b/examples/stm32f4/src/bin/input_capture.rs
@@ -37,7 +37,7 @@ async fn main(spawner: Spawner) {
37 let p = embassy_stm32::init(Default::default()); 37 let p = embassy_stm32::init(Default::default());
38 info!("Hello World!"); 38 info!("Hello World!");
39 39
40 unwrap!(spawner.spawn(blinky(p.PB2))); 40 spawner.spawn(unwrap!(blinky(p.PB2)));
41 41
42 let ch3 = CapturePin::new(p.PB10, Pull::None); 42 let ch3 = CapturePin::new(p.PB10, Pull::None);
43 let mut ic = InputCapture::new(p.TIM2, None, None, Some(ch3), None, Irqs, khz(1000), Default::default()); 43 let mut ic = InputCapture::new(p.TIM2, None, None, Some(ch3), None, Irqs, khz(1000), Default::default());
diff --git a/examples/stm32f4/src/bin/multiprio.rs b/examples/stm32f4/src/bin/multiprio.rs
index b4620888f..2f2ffdea2 100644
--- a/examples/stm32f4/src/bin/multiprio.rs
+++ b/examples/stm32f4/src/bin/multiprio.rs
@@ -135,16 +135,16 @@ fn main() -> ! {
135 // High-priority executor: UART4, priority level 6 135 // High-priority executor: UART4, priority level 6
136 interrupt::UART4.set_priority(Priority::P6); 136 interrupt::UART4.set_priority(Priority::P6);
137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4); 137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4);
138 unwrap!(spawner.spawn(run_high())); 138 spawner.spawn(unwrap!(run_high()));
139 139
140 // Medium-priority executor: UART5, priority level 7 140 // Medium-priority executor: UART5, priority level 7
141 interrupt::UART5.set_priority(Priority::P7); 141 interrupt::UART5.set_priority(Priority::P7);
142 let spawner = EXECUTOR_MED.start(interrupt::UART5); 142 let spawner = EXECUTOR_MED.start(interrupt::UART5);
143 unwrap!(spawner.spawn(run_med())); 143 spawner.spawn(unwrap!(run_med()));
144 144
145 // Low priority executor: runs in thread mode, using WFE/SEV 145 // Low priority executor: runs in thread mode, using WFE/SEV
146 let executor = EXECUTOR_LOW.init(Executor::new()); 146 let executor = EXECUTOR_LOW.init(Executor::new());
147 executor.run(|spawner| { 147 executor.run(|spawner| {
148 unwrap!(spawner.spawn(run_low())); 148 spawner.spawn(unwrap!(run_low()));
149 }); 149 });
150} 150}
diff --git a/examples/stm32f4/src/bin/pwm_input.rs b/examples/stm32f4/src/bin/pwm_input.rs
index 74167cbf2..e8bfa524f 100644
--- a/examples/stm32f4/src/bin/pwm_input.rs
+++ b/examples/stm32f4/src/bin/pwm_input.rs
@@ -36,7 +36,7 @@ async fn main(spawner: Spawner) {
36 let p = embassy_stm32::init(Default::default()); 36 let p = embassy_stm32::init(Default::default());
37 info!("Hello World!"); 37 info!("Hello World!");
38 38
39 unwrap!(spawner.spawn(blinky(p.PB2))); 39 spawner.spawn(unwrap!(blinky(p.PB2)));
40 40
41 let mut pwm_input = PwmInput::new_ch1(p.TIM3, p.PA6, Pull::None, khz(10)); 41 let mut pwm_input = PwmInput::new_ch1(p.TIM3, p.PA6, Pull::None, khz(10));
42 pwm_input.enable(); 42 pwm_input.enable();
diff --git a/examples/stm32f4/src/bin/usb_ethernet.rs b/examples/stm32f4/src/bin/usb_ethernet.rs
index 322cb90c7..7abbe8719 100644
--- a/examples/stm32f4/src/bin/usb_ethernet.rs
+++ b/examples/stm32f4/src/bin/usb_ethernet.rs
@@ -118,11 +118,11 @@ async fn main(spawner: Spawner) {
118 // Build the builder. 118 // Build the builder.
119 let usb = builder.build(); 119 let usb = builder.build();
120 120
121 unwrap!(spawner.spawn(usb_task(usb))); 121 spawner.spawn(unwrap!(usb_task(usb)));
122 122
123 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); 123 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new();
124 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); 124 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr);
125 unwrap!(spawner.spawn(usb_ncm_task(runner))); 125 spawner.spawn(unwrap!(usb_ncm_task(runner)));
126 126
127 let config = embassy_net::Config::dhcpv4(Default::default()); 127 let config = embassy_net::Config::dhcpv4(Default::default());
128 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { 128 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
@@ -141,7 +141,7 @@ async fn main(spawner: Spawner) {
141 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 141 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
142 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 142 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
143 143
144 unwrap!(spawner.spawn(net_task(runner))); 144 spawner.spawn(unwrap!(net_task(runner)));
145 145
146 // And now we can use it! 146 // And now we can use it!
147 147
diff --git a/examples/stm32f4/src/bin/usb_uac_speaker.rs b/examples/stm32f4/src/bin/usb_uac_speaker.rs
index 654bec498..79bd2d914 100644
--- a/examples/stm32f4/src/bin/usb_uac_speaker.rs
+++ b/examples/stm32f4/src/bin/usb_uac_speaker.rs
@@ -375,9 +375,9 @@ async fn main(spawner: Spawner) {
375 } 375 }
376 376
377 // Launch USB audio tasks. 377 // Launch USB audio tasks.
378 unwrap!(spawner.spawn(usb_control_task(control_monitor))); 378 spawner.spawn(unwrap!(usb_control_task(control_monitor)));
379 unwrap!(spawner.spawn(usb_streaming_task(stream, sender))); 379 spawner.spawn(unwrap!(usb_streaming_task(stream, sender)));
380 unwrap!(spawner.spawn(usb_feedback_task(feedback))); 380 spawner.spawn(unwrap!(usb_feedback_task(feedback)));
381 unwrap!(spawner.spawn(usb_task(usb_device))); 381 spawner.spawn(unwrap!(usb_task(usb_device)));
382 unwrap!(spawner.spawn(audio_receiver_task(receiver))); 382 spawner.spawn(unwrap!(audio_receiver_task(receiver)));
383} 383}
diff --git a/examples/stm32f7/src/bin/can.rs b/examples/stm32f7/src/bin/can.rs
index 58ba940a8..9a91ac814 100644
--- a/examples/stm32f7/src/bin/can.rs
+++ b/examples/stm32f7/src/bin/can.rs
@@ -64,7 +64,7 @@ async fn main(spawner: Spawner) {
64 64
65 static CAN_TX: StaticCell<CanTx<'static>> = StaticCell::new(); 65 static CAN_TX: StaticCell<CanTx<'static>> = StaticCell::new();
66 let tx = CAN_TX.init(tx); 66 let tx = CAN_TX.init(tx);
67 spawner.spawn(send_can_message(tx)).unwrap(); 67 spawner.spawn(send_can_message(tx).unwrap());
68 68
69 loop { 69 loop {
70 let envelope = rx.read().await.unwrap(); 70 let envelope = rx.read().await.unwrap();
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs
index 67a2b34bb..b13b7bdda 100644
--- a/examples/stm32f7/src/bin/eth.rs
+++ b/examples/stm32f7/src/bin/eth.rs
@@ -91,7 +91,7 @@ async fn main(spawner: Spawner) -> ! {
91 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 91 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
92 92
93 // Launch network task 93 // Launch network task
94 unwrap!(spawner.spawn(net_task(runner))); 94 spawner.spawn(unwrap!(net_task(runner)));
95 95
96 // Ensure DHCP configuration is up before trying connect 96 // Ensure DHCP configuration is up before trying connect
97 stack.wait_config_up().await; 97 stack.wait_config_up().await;
diff --git a/examples/stm32g0/src/bin/input_capture.rs b/examples/stm32g0/src/bin/input_capture.rs
index df339d541..5501a6941 100644
--- a/examples/stm32g0/src/bin/input_capture.rs
+++ b/examples/stm32g0/src/bin/input_capture.rs
@@ -44,7 +44,7 @@ async fn main(spawner: Spawner) {
44 let p = embassy_stm32::init(Default::default()); 44 let p = embassy_stm32::init(Default::default());
45 info!("Hello World!"); 45 info!("Hello World!");
46 46
47 unwrap!(spawner.spawn(blinky(p.PB1))); 47 spawner.spawn(unwrap!(blinky(p.PB1)));
48 48
49 // Connect PB1 and PA8 with a 1k Ohm resistor 49 // Connect PB1 and PA8 with a 1k Ohm resistor
50 let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull); 50 let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull);
diff --git a/examples/stm32g0/src/bin/pwm_input.rs b/examples/stm32g0/src/bin/pwm_input.rs
index fd4f53f1e..72aa07c03 100644
--- a/examples/stm32g0/src/bin/pwm_input.rs
+++ b/examples/stm32g0/src/bin/pwm_input.rs
@@ -40,7 +40,7 @@ bind_interrupts!(struct Irqs {
40async fn main(spawner: Spawner) { 40async fn main(spawner: Spawner) {
41 let p = embassy_stm32::init(Default::default()); 41 let p = embassy_stm32::init(Default::default());
42 42
43 unwrap!(spawner.spawn(blinky(p.PB1))); 43 spawner.spawn(unwrap!(blinky(p.PB1)));
44 // Connect PA8 and PA6 with a 1k Ohm resistor 44 // Connect PA8 and PA6 with a 1k Ohm resistor
45 let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull); 45 let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull);
46 let mut pwm = SimplePwm::new(p.TIM1, Some(ch1_pin), None, None, None, khz(1), Default::default()); 46 let mut pwm = SimplePwm::new(p.TIM1, Some(ch1_pin), None, None, None, khz(1), Default::default());
diff --git a/examples/stm32g4/src/bin/i2c_slave.rs b/examples/stm32g4/src/bin/i2c_slave.rs
index 8b255b0e6..65aca1c1b 100644
--- a/examples/stm32g4/src/bin/i2c_slave.rs
+++ b/examples/stm32g4/src/bin/i2c_slave.rs
@@ -139,11 +139,11 @@ async fn main(spawner: Spawner) {
139 let device = 139 let device =
140 i2c::I2c::new(p.I2C2, d_scl, d_sda, Irqs, p.DMA1_CH1, p.DMA1_CH2, config).into_slave_multimaster(d_addr_config); 140 i2c::I2c::new(p.I2C2, d_scl, d_sda, Irqs, p.DMA1_CH1, p.DMA1_CH2, config).into_slave_multimaster(d_addr_config);
141 141
142 unwrap!(spawner.spawn(device_task(device))); 142 spawner.spawn(unwrap!(device_task(device)));
143 143
144 let c_sda = p.PB8; 144 let c_sda = p.PB8;
145 let c_scl = p.PB7; 145 let c_scl = p.PB7;
146 let controller = i2c::I2c::new(p.I2C1, c_sda, c_scl, Irqs, p.DMA1_CH3, p.DMA1_CH4, config); 146 let controller = i2c::I2c::new(p.I2C1, c_sda, c_scl, Irqs, p.DMA1_CH3, p.DMA1_CH4, config);
147 147
148 unwrap!(spawner.spawn(controller_task(controller))); 148 spawner.spawn(unwrap!(controller_task(controller)));
149} 149}
diff --git a/examples/stm32h5/src/bin/adc_dma.rs b/examples/stm32h5/src/bin/adc_dma.rs
index 20073e22f..fb9fcbc5c 100644
--- a/examples/stm32h5/src/bin/adc_dma.rs
+++ b/examples/stm32h5/src/bin/adc_dma.rs
@@ -42,8 +42,8 @@ async fn main(spawner: Spawner) {
42 } 42 }
43 let p = embassy_stm32::init(config); 43 let p = embassy_stm32::init(config);
44 44
45 spawner.must_spawn(adc1_task(p.ADC1, p.GPDMA1_CH0, p.PA0, p.PA2)); 45 spawner.spawn(unwrap!(adc1_task(p.ADC1, p.GPDMA1_CH0, p.PA0, p.PA2)));
46 spawner.must_spawn(adc2_task(p.ADC2, p.GPDMA1_CH1, p.PA1, p.PA3)); 46 spawner.spawn(unwrap!(adc2_task(p.ADC2, p.GPDMA1_CH1, p.PA1, p.PA3)));
47} 47}
48 48
49#[embassy_executor::task] 49#[embassy_executor::task]
diff --git a/examples/stm32h5/src/bin/eth.rs b/examples/stm32h5/src/bin/eth.rs
index 1d85cc1e7..a84fe358b 100644
--- a/examples/stm32h5/src/bin/eth.rs
+++ b/examples/stm32h5/src/bin/eth.rs
@@ -94,7 +94,7 @@ async fn main(spawner: Spawner) -> ! {
94 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 94 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
95 95
96 // Launch network task 96 // Launch network task
97 unwrap!(spawner.spawn(net_task(runner))); 97 spawner.spawn(unwrap!(net_task(runner)));
98 98
99 // Ensure DHCP configuration is up before trying connect 99 // Ensure DHCP configuration is up before trying connect
100 stack.wait_config_up().await; 100 stack.wait_config_up().await;
diff --git a/examples/stm32h5/src/bin/stop.rs b/examples/stm32h5/src/bin/stop.rs
index e650791c5..3c4f49f64 100644
--- a/examples/stm32h5/src/bin/stop.rs
+++ b/examples/stm32h5/src/bin/stop.rs
@@ -18,7 +18,7 @@ use {defmt_rtt as _, panic_probe as _};
18#[cortex_m_rt::entry] 18#[cortex_m_rt::entry]
19fn main() -> ! { 19fn main() -> ! {
20 Executor::take().run(|spawner| { 20 Executor::take().run(|spawner| {
21 unwrap!(spawner.spawn(async_main(spawner))); 21 spawner.spawn(unwrap!(async_main(spawner)));
22 }) 22 })
23} 23}
24 24
@@ -43,8 +43,8 @@ async fn async_main(spawner: Spawner) {
43 let rtc = RTC.init(rtc); 43 let rtc = RTC.init(rtc);
44 embassy_stm32::low_power::stop_with_rtc(rtc); 44 embassy_stm32::low_power::stop_with_rtc(rtc);
45 45
46 unwrap!(spawner.spawn(blinky(p.PB4.into()))); 46 spawner.spawn(unwrap!(blinky(p.PB4.into())));
47 unwrap!(spawner.spawn(timeout())); 47 spawner.spawn(unwrap!(timeout()));
48} 48}
49 49
50#[embassy_executor::task] 50#[embassy_executor::task]
diff --git a/examples/stm32h5/src/bin/usart.rs b/examples/stm32h5/src/bin/usart.rs
index cc49c2fdb..264e7d582 100644
--- a/examples/stm32h5/src/bin/usart.rs
+++ b/examples/stm32h5/src/bin/usart.rs
@@ -34,6 +34,6 @@ fn main() -> ! {
34 let executor = EXECUTOR.init(Executor::new()); 34 let executor = EXECUTOR.init(Executor::new());
35 35
36 executor.run(|spawner| { 36 executor.run(|spawner| {
37 unwrap!(spawner.spawn(main_task())); 37 spawner.spawn(unwrap!(main_task()));
38 }) 38 })
39} 39}
diff --git a/examples/stm32h5/src/bin/usart_dma.rs b/examples/stm32h5/src/bin/usart_dma.rs
index c644e84bd..ea48515d7 100644
--- a/examples/stm32h5/src/bin/usart_dma.rs
+++ b/examples/stm32h5/src/bin/usart_dma.rs
@@ -42,6 +42,6 @@ fn main() -> ! {
42 let executor = EXECUTOR.init(Executor::new()); 42 let executor = EXECUTOR.init(Executor::new());
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(main_task())); 45 spawner.spawn(unwrap!(main_task()));
46 }) 46 })
47} 47}
diff --git a/examples/stm32h5/src/bin/usart_split.rs b/examples/stm32h5/src/bin/usart_split.rs
index d26c5003c..f56c1c57d 100644
--- a/examples/stm32h5/src/bin/usart_split.rs
+++ b/examples/stm32h5/src/bin/usart_split.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) -> ! {
27 27
28 let (mut tx, rx) = usart.split(); 28 let (mut tx, rx) = usart.split();
29 29
30 unwrap!(spawner.spawn(reader(rx))); 30 spawner.spawn(unwrap!(reader(rx)));
31 31
32 loop { 32 loop {
33 let buf = CHANNEL.receive().await; 33 let buf = CHANNEL.receive().await;
diff --git a/examples/stm32h5/src/bin/usb_uac_speaker.rs b/examples/stm32h5/src/bin/usb_uac_speaker.rs
index 5d007261c..86873cabd 100644
--- a/examples/stm32h5/src/bin/usb_uac_speaker.rs
+++ b/examples/stm32h5/src/bin/usb_uac_speaker.rs
@@ -366,9 +366,9 @@ async fn main(spawner: Spawner) {
366 } 366 }
367 367
368 // Launch USB audio tasks. 368 // Launch USB audio tasks.
369 unwrap!(spawner.spawn(usb_control_task(control_monitor))); 369 spawner.spawn(unwrap!(usb_control_task(control_monitor)));
370 unwrap!(spawner.spawn(usb_streaming_task(stream, sender))); 370 spawner.spawn(unwrap!(usb_streaming_task(stream, sender)));
371 unwrap!(spawner.spawn(usb_feedback_task(feedback))); 371 spawner.spawn(unwrap!(usb_feedback_task(feedback)));
372 unwrap!(spawner.spawn(usb_task(usb_device))); 372 spawner.spawn(unwrap!(usb_task(usb_device)));
373 unwrap!(spawner.spawn(audio_receiver_task(receiver))); 373 spawner.spawn(unwrap!(audio_receiver_task(receiver)));
374} 374}
diff --git a/examples/stm32h7/src/bin/dac_dma.rs b/examples/stm32h7/src/bin/dac_dma.rs
index 8314754bc..df37e9d78 100644
--- a/examples/stm32h7/src/bin/dac_dma.rs
+++ b/examples/stm32h7/src/bin/dac_dma.rs
@@ -53,8 +53,8 @@ async fn main(spawner: Spawner) {
53 // Obtain two independent channels (p.DAC1 can only be consumed once, though!) 53 // Obtain two independent channels (p.DAC1 can only be consumed once, though!)
54 let (dac_ch1, dac_ch2) = embassy_stm32::dac::Dac::new(p.DAC1, p.DMA1_CH3, p.DMA1_CH4, p.PA4, p.PA5).split(); 54 let (dac_ch1, dac_ch2) = embassy_stm32::dac::Dac::new(p.DAC1, p.DMA1_CH3, p.DMA1_CH4, p.PA4, p.PA5).split();
55 55
56 spawner.spawn(dac_task1(p.TIM6, dac_ch1)).ok(); 56 spawner.spawn(dac_task1(p.TIM6, dac_ch1).unwrap());
57 spawner.spawn(dac_task2(p.TIM7, dac_ch2)).ok(); 57 spawner.spawn(dac_task2(p.TIM7, dac_ch2).unwrap());
58} 58}
59 59
60#[embassy_executor::task] 60#[embassy_executor::task]
diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs
index fc14c1a70..6c215362d 100644
--- a/examples/stm32h7/src/bin/eth.rs
+++ b/examples/stm32h7/src/bin/eth.rs
@@ -93,7 +93,7 @@ async fn main(spawner: Spawner) -> ! {
93 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 93 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
94 94
95 // Launch network task 95 // Launch network task
96 unwrap!(spawner.spawn(net_task(runner))); 96 spawner.spawn(unwrap!(net_task(runner)));
97 97
98 // Ensure DHCP configuration is up before trying connect 98 // Ensure DHCP configuration is up before trying connect
99 stack.wait_config_up().await; 99 stack.wait_config_up().await;
diff --git a/examples/stm32h7/src/bin/eth_client.rs b/examples/stm32h7/src/bin/eth_client.rs
index 46301a478..10ac57fc9 100644
--- a/examples/stm32h7/src/bin/eth_client.rs
+++ b/examples/stm32h7/src/bin/eth_client.rs
@@ -95,7 +95,7 @@ async fn main(spawner: Spawner) -> ! {
95 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 95 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
96 96
97 // Launch network task 97 // Launch network task
98 unwrap!(spawner.spawn(net_task(runner))); 98 spawner.spawn(unwrap!(net_task(runner)));
99 99
100 // Ensure DHCP configuration is up before trying connect 100 // Ensure DHCP configuration is up before trying connect
101 stack.wait_config_up().await; 101 stack.wait_config_up().await;
diff --git a/examples/stm32h7/src/bin/eth_client_mii.rs b/examples/stm32h7/src/bin/eth_client_mii.rs
index 99cd1a158..c6a108471 100644
--- a/examples/stm32h7/src/bin/eth_client_mii.rs
+++ b/examples/stm32h7/src/bin/eth_client_mii.rs
@@ -101,7 +101,7 @@ async fn main(spawner: Spawner) -> ! {
101 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 101 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
102 102
103 // Launch network task 103 // Launch network task
104 unwrap!(spawner.spawn(net_task(runner))); 104 spawner.spawn(unwrap!(net_task(runner)));
105 105
106 // Ensure DHCP configuration is up before trying connect 106 // Ensure DHCP configuration is up before trying connect
107 stack.wait_config_up().await; 107 stack.wait_config_up().await;
diff --git a/examples/stm32h7/src/bin/i2c_shared.rs b/examples/stm32h7/src/bin/i2c_shared.rs
index 560f97aa3..9e45d845f 100644
--- a/examples/stm32h7/src/bin/i2c_shared.rs
+++ b/examples/stm32h7/src/bin/i2c_shared.rs
@@ -95,9 +95,9 @@ async fn main(spawner: Spawner) {
95 95
96 // Device 1, using embedded-hal-async compatible driver for TMP117 96 // Device 1, using embedded-hal-async compatible driver for TMP117
97 let i2c_dev1 = I2cDevice::new(i2c_bus); 97 let i2c_dev1 = I2cDevice::new(i2c_bus);
98 spawner.spawn(temperature(i2c_dev1)).unwrap(); 98 spawner.spawn(temperature(i2c_dev1).unwrap());
99 99
100 // Device 2, using embedded-hal-async compatible driver for SHTC3 100 // Device 2, using embedded-hal-async compatible driver for SHTC3
101 let i2c_dev2 = I2cDevice::new(i2c_bus); 101 let i2c_dev2 = I2cDevice::new(i2c_bus);
102 spawner.spawn(humidity(i2c_dev2)).unwrap(); 102 spawner.spawn(humidity(i2c_dev2).unwrap());
103} 103}
diff --git a/examples/stm32h7/src/bin/multiprio.rs b/examples/stm32h7/src/bin/multiprio.rs
index b4620888f..2f2ffdea2 100644
--- a/examples/stm32h7/src/bin/multiprio.rs
+++ b/examples/stm32h7/src/bin/multiprio.rs
@@ -135,16 +135,16 @@ fn main() -> ! {
135 // High-priority executor: UART4, priority level 6 135 // High-priority executor: UART4, priority level 6
136 interrupt::UART4.set_priority(Priority::P6); 136 interrupt::UART4.set_priority(Priority::P6);
137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4); 137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4);
138 unwrap!(spawner.spawn(run_high())); 138 spawner.spawn(unwrap!(run_high()));
139 139
140 // Medium-priority executor: UART5, priority level 7 140 // Medium-priority executor: UART5, priority level 7
141 interrupt::UART5.set_priority(Priority::P7); 141 interrupt::UART5.set_priority(Priority::P7);
142 let spawner = EXECUTOR_MED.start(interrupt::UART5); 142 let spawner = EXECUTOR_MED.start(interrupt::UART5);
143 unwrap!(spawner.spawn(run_med())); 143 spawner.spawn(unwrap!(run_med()));
144 144
145 // Low priority executor: runs in thread mode, using WFE/SEV 145 // Low priority executor: runs in thread mode, using WFE/SEV
146 let executor = EXECUTOR_LOW.init(Executor::new()); 146 let executor = EXECUTOR_LOW.init(Executor::new());
147 executor.run(|spawner| { 147 executor.run(|spawner| {
148 unwrap!(spawner.spawn(run_low())); 148 spawner.spawn(unwrap!(run_low()));
149 }); 149 });
150} 150}
diff --git a/examples/stm32h7/src/bin/signal.rs b/examples/stm32h7/src/bin/signal.rs
index b73360f32..97309798e 100644
--- a/examples/stm32h7/src/bin/signal.rs
+++ b/examples/stm32h7/src/bin/signal.rs
@@ -26,7 +26,7 @@ async fn my_sending_task() {
26#[embassy_executor::main] 26#[embassy_executor::main]
27async fn main(spawner: Spawner) { 27async fn main(spawner: Spawner) {
28 let _p = embassy_stm32::init(Default::default()); 28 let _p = embassy_stm32::init(Default::default());
29 unwrap!(spawner.spawn(my_sending_task())); 29 spawner.spawn(unwrap!(my_sending_task()));
30 30
31 loop { 31 loop {
32 let received_counter = SIGNAL.wait().await; 32 let received_counter = SIGNAL.wait().await;
diff --git a/examples/stm32h7/src/bin/spi.rs b/examples/stm32h7/src/bin/spi.rs
index ad4a8aaf7..dce30a4a7 100644
--- a/examples/stm32h7/src/bin/spi.rs
+++ b/examples/stm32h7/src/bin/spi.rs
@@ -66,6 +66,6 @@ fn main() -> ! {
66 let executor = EXECUTOR.init(Executor::new()); 66 let executor = EXECUTOR.init(Executor::new());
67 67
68 executor.run(|spawner| { 68 executor.run(|spawner| {
69 unwrap!(spawner.spawn(main_task(spi))); 69 spawner.spawn(unwrap!(main_task(spi)));
70 }) 70 })
71} 71}
diff --git a/examples/stm32h7/src/bin/spi_bdma.rs b/examples/stm32h7/src/bin/spi_bdma.rs
index 5a7dff572..828f687b8 100644
--- a/examples/stm32h7/src/bin/spi_bdma.rs
+++ b/examples/stm32h7/src/bin/spi_bdma.rs
@@ -80,6 +80,6 @@ fn main() -> ! {
80 let executor = EXECUTOR.init(Executor::new()); 80 let executor = EXECUTOR.init(Executor::new());
81 81
82 executor.run(|spawner| { 82 executor.run(|spawner| {
83 unwrap!(spawner.spawn(main_task(spi))); 83 spawner.spawn(unwrap!(main_task(spi)));
84 }) 84 })
85} 85}
diff --git a/examples/stm32h7/src/bin/spi_dma.rs b/examples/stm32h7/src/bin/spi_dma.rs
index 731c7fef5..2197fabce 100644
--- a/examples/stm32h7/src/bin/spi_dma.rs
+++ b/examples/stm32h7/src/bin/spi_dma.rs
@@ -63,6 +63,6 @@ fn main() -> ! {
63 let executor = EXECUTOR.init(Executor::new()); 63 let executor = EXECUTOR.init(Executor::new());
64 64
65 executor.run(|spawner| { 65 executor.run(|spawner| {
66 unwrap!(spawner.spawn(main_task(spi))); 66 spawner.spawn(unwrap!(main_task(spi)));
67 }) 67 })
68} 68}
diff --git a/examples/stm32h7/src/bin/usart.rs b/examples/stm32h7/src/bin/usart.rs
index cc49c2fdb..264e7d582 100644
--- a/examples/stm32h7/src/bin/usart.rs
+++ b/examples/stm32h7/src/bin/usart.rs
@@ -34,6 +34,6 @@ fn main() -> ! {
34 let executor = EXECUTOR.init(Executor::new()); 34 let executor = EXECUTOR.init(Executor::new());
35 35
36 executor.run(|spawner| { 36 executor.run(|spawner| {
37 unwrap!(spawner.spawn(main_task())); 37 spawner.spawn(unwrap!(main_task()));
38 }) 38 })
39} 39}
diff --git a/examples/stm32h7/src/bin/usart_dma.rs b/examples/stm32h7/src/bin/usart_dma.rs
index 6f340d40a..23d7f193a 100644
--- a/examples/stm32h7/src/bin/usart_dma.rs
+++ b/examples/stm32h7/src/bin/usart_dma.rs
@@ -42,6 +42,6 @@ fn main() -> ! {
42 let executor = EXECUTOR.init(Executor::new()); 42 let executor = EXECUTOR.init(Executor::new());
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(main_task())); 45 spawner.spawn(unwrap!(main_task()));
46 }) 46 })
47} 47}
diff --git a/examples/stm32h7/src/bin/usart_split.rs b/examples/stm32h7/src/bin/usart_split.rs
index 2bb58be5e..464ce8d72 100644
--- a/examples/stm32h7/src/bin/usart_split.rs
+++ b/examples/stm32h7/src/bin/usart_split.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) -> ! {
27 27
28 let (mut tx, rx) = usart.split(); 28 let (mut tx, rx) = usart.split();
29 29
30 unwrap!(spawner.spawn(reader(rx))); 30 spawner.spawn(unwrap!(reader(rx)));
31 31
32 loop { 32 loop {
33 let buf = CHANNEL.receive().await; 33 let buf = CHANNEL.receive().await;
diff --git a/examples/stm32h735/src/bin/ltdc.rs b/examples/stm32h735/src/bin/ltdc.rs
index a36fdef2c..8a99f745d 100644
--- a/examples/stm32h735/src/bin/ltdc.rs
+++ b/examples/stm32h735/src/bin/ltdc.rs
@@ -47,7 +47,7 @@ async fn main(spawner: Spawner) {
47 47
48 // blink the led on another task 48 // blink the led on another task
49 let led = Output::new(p.PC3, Level::High, Speed::Low); 49 let led = Output::new(p.PC3, Level::High, Speed::Low);
50 unwrap!(spawner.spawn(led_task(led))); 50 spawner.spawn(unwrap!(led_task(led)));
51 51
52 // numbers from STMicroelectronics/STM32CubeH7 STM32H735G-DK C-based example 52 // numbers from STMicroelectronics/STM32CubeH7 STM32H735G-DK C-based example
53 const RK043FN48H_HSYNC: u16 = 41; // Horizontal synchronization 53 const RK043FN48H_HSYNC: u16 = 41; // Horizontal synchronization
diff --git a/examples/stm32h755cm4/src/bin/intercore.rs b/examples/stm32h755cm4/src/bin/intercore.rs
index d5e3e7648..f584e31e9 100644
--- a/examples/stm32h755cm4/src/bin/intercore.rs
+++ b/examples/stm32h755cm4/src/bin/intercore.rs
@@ -128,7 +128,7 @@ async fn main(spawner: Spawner) -> ! {
128 let red_led = Output::new(p.PB14, Level::Low, Speed::Low); // LD3 (heartbeat) 128 let red_led = Output::new(p.PB14, Level::Low, Speed::Low); // LD3 (heartbeat)
129 129
130 // Start heartbeat task 130 // Start heartbeat task
131 unwrap!(spawner.spawn(blink_heartbeat(red_led))); 131 spawner.spawn(unwrap!(blink_heartbeat(red_led)));
132 132
133 // Track previous values to detect changes 133 // Track previous values to detect changes
134 let mut prev_green = false; 134 let mut prev_green = false;
diff --git a/examples/stm32h7rs/src/bin/eth.rs b/examples/stm32h7rs/src/bin/eth.rs
index d8002e9ba..67f541564 100644
--- a/examples/stm32h7rs/src/bin/eth.rs
+++ b/examples/stm32h7rs/src/bin/eth.rs
@@ -94,7 +94,7 @@ async fn main(spawner: Spawner) -> ! {
94 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 94 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
95 95
96 // Launch network task 96 // Launch network task
97 unwrap!(spawner.spawn(net_task(runner))); 97 spawner.spawn(unwrap!(net_task(runner)));
98 98
99 // Ensure DHCP configuration is up before trying connect 99 // Ensure DHCP configuration is up before trying connect
100 //stack.wait_config_up().await; 100 //stack.wait_config_up().await;
diff --git a/examples/stm32h7rs/src/bin/multiprio.rs b/examples/stm32h7rs/src/bin/multiprio.rs
index b4620888f..2f2ffdea2 100644
--- a/examples/stm32h7rs/src/bin/multiprio.rs
+++ b/examples/stm32h7rs/src/bin/multiprio.rs
@@ -135,16 +135,16 @@ fn main() -> ! {
135 // High-priority executor: UART4, priority level 6 135 // High-priority executor: UART4, priority level 6
136 interrupt::UART4.set_priority(Priority::P6); 136 interrupt::UART4.set_priority(Priority::P6);
137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4); 137 let spawner = EXECUTOR_HIGH.start(interrupt::UART4);
138 unwrap!(spawner.spawn(run_high())); 138 spawner.spawn(unwrap!(run_high()));
139 139
140 // Medium-priority executor: UART5, priority level 7 140 // Medium-priority executor: UART5, priority level 7
141 interrupt::UART5.set_priority(Priority::P7); 141 interrupt::UART5.set_priority(Priority::P7);
142 let spawner = EXECUTOR_MED.start(interrupt::UART5); 142 let spawner = EXECUTOR_MED.start(interrupt::UART5);
143 unwrap!(spawner.spawn(run_med())); 143 spawner.spawn(unwrap!(run_med()));
144 144
145 // Low priority executor: runs in thread mode, using WFE/SEV 145 // Low priority executor: runs in thread mode, using WFE/SEV
146 let executor = EXECUTOR_LOW.init(Executor::new()); 146 let executor = EXECUTOR_LOW.init(Executor::new());
147 executor.run(|spawner| { 147 executor.run(|spawner| {
148 unwrap!(spawner.spawn(run_low())); 148 spawner.spawn(unwrap!(run_low()));
149 }); 149 });
150} 150}
diff --git a/examples/stm32h7rs/src/bin/signal.rs b/examples/stm32h7rs/src/bin/signal.rs
index b73360f32..97309798e 100644
--- a/examples/stm32h7rs/src/bin/signal.rs
+++ b/examples/stm32h7rs/src/bin/signal.rs
@@ -26,7 +26,7 @@ async fn my_sending_task() {
26#[embassy_executor::main] 26#[embassy_executor::main]
27async fn main(spawner: Spawner) { 27async fn main(spawner: Spawner) {
28 let _p = embassy_stm32::init(Default::default()); 28 let _p = embassy_stm32::init(Default::default());
29 unwrap!(spawner.spawn(my_sending_task())); 29 spawner.spawn(unwrap!(my_sending_task()));
30 30
31 loop { 31 loop {
32 let received_counter = SIGNAL.wait().await; 32 let received_counter = SIGNAL.wait().await;
diff --git a/examples/stm32h7rs/src/bin/spi.rs b/examples/stm32h7rs/src/bin/spi.rs
index 8d6ccc58b..8c280fdae 100644
--- a/examples/stm32h7rs/src/bin/spi.rs
+++ b/examples/stm32h7rs/src/bin/spi.rs
@@ -44,6 +44,6 @@ fn main() -> ! {
44 let executor = EXECUTOR.init(Executor::new()); 44 let executor = EXECUTOR.init(Executor::new());
45 45
46 executor.run(|spawner| { 46 executor.run(|spawner| {
47 unwrap!(spawner.spawn(main_task(spi))); 47 spawner.spawn(unwrap!(main_task(spi)));
48 }) 48 })
49} 49}
diff --git a/examples/stm32h7rs/src/bin/spi_dma.rs b/examples/stm32h7rs/src/bin/spi_dma.rs
index cb305351b..3fa69fd15 100644
--- a/examples/stm32h7rs/src/bin/spi_dma.rs
+++ b/examples/stm32h7rs/src/bin/spi_dma.rs
@@ -41,6 +41,6 @@ fn main() -> ! {
41 let executor = EXECUTOR.init(Executor::new()); 41 let executor = EXECUTOR.init(Executor::new());
42 42
43 executor.run(|spawner| { 43 executor.run(|spawner| {
44 unwrap!(spawner.spawn(main_task(spi))); 44 spawner.spawn(unwrap!(main_task(spi)));
45 }) 45 })
46} 46}
diff --git a/examples/stm32h7rs/src/bin/usart.rs b/examples/stm32h7rs/src/bin/usart.rs
index cc49c2fdb..264e7d582 100644
--- a/examples/stm32h7rs/src/bin/usart.rs
+++ b/examples/stm32h7rs/src/bin/usart.rs
@@ -34,6 +34,6 @@ fn main() -> ! {
34 let executor = EXECUTOR.init(Executor::new()); 34 let executor = EXECUTOR.init(Executor::new());
35 35
36 executor.run(|spawner| { 36 executor.run(|spawner| {
37 unwrap!(spawner.spawn(main_task())); 37 spawner.spawn(unwrap!(main_task()));
38 }) 38 })
39} 39}
diff --git a/examples/stm32h7rs/src/bin/usart_dma.rs b/examples/stm32h7rs/src/bin/usart_dma.rs
index c644e84bd..ea48515d7 100644
--- a/examples/stm32h7rs/src/bin/usart_dma.rs
+++ b/examples/stm32h7rs/src/bin/usart_dma.rs
@@ -42,6 +42,6 @@ fn main() -> ! {
42 let executor = EXECUTOR.init(Executor::new()); 42 let executor = EXECUTOR.init(Executor::new());
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(main_task())); 45 spawner.spawn(unwrap!(main_task()));
46 }) 46 })
47} 47}
diff --git a/examples/stm32h7rs/src/bin/usart_split.rs b/examples/stm32h7rs/src/bin/usart_split.rs
index d26c5003c..f56c1c57d 100644
--- a/examples/stm32h7rs/src/bin/usart_split.rs
+++ b/examples/stm32h7rs/src/bin/usart_split.rs
@@ -27,7 +27,7 @@ async fn main(spawner: Spawner) -> ! {
27 27
28 let (mut tx, rx) = usart.split(); 28 let (mut tx, rx) = usart.split();
29 29
30 unwrap!(spawner.spawn(reader(rx))); 30 spawner.spawn(unwrap!(reader(rx)));
31 31
32 loop { 32 loop {
33 let buf = CHANNEL.receive().await; 33 let buf = CHANNEL.receive().await;
diff --git a/examples/stm32l0/src/bin/raw_spawn.rs b/examples/stm32l0/src/bin/raw_spawn.rs
index 29c7e0dc7..6385e3c8f 100644
--- a/examples/stm32l0/src/bin/raw_spawn.rs
+++ b/examples/stm32l0/src/bin/raw_spawn.rs
@@ -42,8 +42,8 @@ fn main() -> ! {
42 let run2_task = unsafe { make_static(&run2_task) }; 42 let run2_task = unsafe { make_static(&run2_task) };
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(run1_task.spawn(|| run1()))); 45 spawner.spawn(unwrap!(run1_task.spawn(|| run1())));
46 unwrap!(spawner.spawn(run2_task.spawn(|| run2()))); 46 spawner.spawn(unwrap!(run2_task.spawn(|| run2())));
47 }); 47 });
48} 48}
49 49
diff --git a/examples/stm32l4/src/bin/dac_dma.rs b/examples/stm32l4/src/bin/dac_dma.rs
index cde24f411..44edec728 100644
--- a/examples/stm32l4/src/bin/dac_dma.rs
+++ b/examples/stm32l4/src/bin/dac_dma.rs
@@ -24,8 +24,8 @@ async fn main(spawner: Spawner) {
24 // Obtain two independent channels (p.DAC1 can only be consumed once, though!) 24 // Obtain two independent channels (p.DAC1 can only be consumed once, though!)
25 let (dac_ch1, dac_ch2) = embassy_stm32::dac::Dac::new(p.DAC1, p.DMA1_CH3, p.DMA1_CH4, p.PA4, p.PA5).split(); 25 let (dac_ch1, dac_ch2) = embassy_stm32::dac::Dac::new(p.DAC1, p.DMA1_CH3, p.DMA1_CH4, p.PA4, p.PA5).split();
26 26
27 spawner.spawn(dac_task1(p.TIM6, dac_ch1)).ok(); 27 spawner.spawn(dac_task1(p.TIM6, dac_ch1).unwrap());
28 spawner.spawn(dac_task2(p.TIM7, dac_ch2)).ok(); 28 spawner.spawn(dac_task2(p.TIM7, dac_ch2).unwrap());
29} 29}
30 30
31#[embassy_executor::task] 31#[embassy_executor::task]
diff --git a/examples/stm32l4/src/bin/spe_adin1110_http_server.rs b/examples/stm32l4/src/bin/spe_adin1110_http_server.rs
index 516badcb2..24efe526f 100644
--- a/examples/stm32l4/src/bin/spe_adin1110_http_server.rs
+++ b/examples/stm32l4/src/bin/spe_adin1110_http_server.rs
@@ -181,11 +181,11 @@ async fn main(spawner: Spawner) {
181 .await; 181 .await;
182 182
183 // Start task blink_led 183 // Start task blink_led
184 unwrap!(spawner.spawn(heartbeat_led(led_uc3_yellow))); 184 spawner.spawn(unwrap!(heartbeat_led(led_uc3_yellow)));
185 // Start task temperature measurement 185 // Start task temperature measurement
186 unwrap!(spawner.spawn(temp_task(temp_sens_i2c, led_uc4_blue))); 186 spawner.spawn(unwrap!(temp_task(temp_sens_i2c, led_uc4_blue)));
187 // Start ethernet task 187 // Start ethernet task
188 unwrap!(spawner.spawn(ethernet_task(runner))); 188 spawner.spawn(unwrap!(ethernet_task(runner)));
189 189
190 let mut rng = Rng::new(dp.RNG, Irqs); 190 let mut rng = Rng::new(dp.RNG, Irqs);
191 // Generate random seed 191 // Generate random seed
@@ -208,7 +208,7 @@ async fn main(spawner: Spawner) {
208 let (stack, runner) = embassy_net::new(device, ip_cfg, RESOURCES.init(StackResources::new()), seed); 208 let (stack, runner) = embassy_net::new(device, ip_cfg, RESOURCES.init(StackResources::new()), seed);
209 209
210 // Launch network task 210 // Launch network task
211 unwrap!(spawner.spawn(net_task(runner))); 211 spawner.spawn(unwrap!(net_task(runner)));
212 212
213 let cfg = wait_for_config(stack).await; 213 let cfg = wait_for_config(stack).await;
214 let local_addr = cfg.address.address(); 214 let local_addr = cfg.address.address();
diff --git a/examples/stm32l5/src/bin/stop.rs b/examples/stm32l5/src/bin/stop.rs
index d7a1efea9..c34053190 100644
--- a/examples/stm32l5/src/bin/stop.rs
+++ b/examples/stm32l5/src/bin/stop.rs
@@ -15,7 +15,7 @@ use {defmt_rtt as _, panic_probe as _};
15#[cortex_m_rt::entry] 15#[cortex_m_rt::entry]
16fn main() -> ! { 16fn main() -> ! {
17 Executor::take().run(|spawner| { 17 Executor::take().run(|spawner| {
18 unwrap!(spawner.spawn(async_main(spawner))); 18 spawner.spawn(unwrap!(async_main(spawner)));
19 }) 19 })
20} 20}
21 21
@@ -34,8 +34,8 @@ async fn async_main(spawner: Spawner) {
34 let rtc = RTC.init(rtc); 34 let rtc = RTC.init(rtc);
35 embassy_stm32::low_power::stop_with_rtc(rtc); 35 embassy_stm32::low_power::stop_with_rtc(rtc);
36 36
37 unwrap!(spawner.spawn(blinky(p.PC7.into()))); 37 spawner.spawn(unwrap!(blinky(p.PC7.into())));
38 unwrap!(spawner.spawn(timeout())); 38 spawner.spawn(unwrap!(timeout()));
39} 39}
40 40
41#[embassy_executor::task] 41#[embassy_executor::task]
diff --git a/examples/stm32l5/src/bin/usb_ethernet.rs b/examples/stm32l5/src/bin/usb_ethernet.rs
index 6c72132c6..25aa9ef69 100644
--- a/examples/stm32l5/src/bin/usb_ethernet.rs
+++ b/examples/stm32l5/src/bin/usb_ethernet.rs
@@ -96,11 +96,11 @@ async fn main(spawner: Spawner) {
96 // Build the builder. 96 // Build the builder.
97 let usb = builder.build(); 97 let usb = builder.build();
98 98
99 unwrap!(spawner.spawn(usb_task(usb))); 99 spawner.spawn(unwrap!(usb_task(usb)));
100 100
101 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); 101 static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new();
102 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); 102 let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr);
103 unwrap!(spawner.spawn(usb_ncm_task(runner))); 103 spawner.spawn(unwrap!(usb_ncm_task(runner)));
104 104
105 let config = embassy_net::Config::dhcpv4(Default::default()); 105 let config = embassy_net::Config::dhcpv4(Default::default());
106 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { 106 //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
@@ -117,7 +117,7 @@ async fn main(spawner: Spawner) {
117 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); 117 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
118 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 118 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
119 119
120 unwrap!(spawner.spawn(net_task(runner))); 120 spawner.spawn(unwrap!(net_task(runner)));
121 121
122 // And now we can use it! 122 // And now we can use it!
123 123
diff --git a/examples/stm32u5/src/bin/ltdc.rs b/examples/stm32u5/src/bin/ltdc.rs
index bd59a9148..46d1c120f 100644
--- a/examples/stm32u5/src/bin/ltdc.rs
+++ b/examples/stm32u5/src/bin/ltdc.rs
@@ -50,7 +50,7 @@ async fn main(spawner: Spawner) {
50 50
51 // blink the led on another task 51 // blink the led on another task
52 let led = Output::new(p.PD2, Level::High, Speed::Low); 52 let led = Output::new(p.PD2, Level::High, Speed::Low);
53 unwrap!(spawner.spawn(led_task(led))); 53 spawner.spawn(unwrap!(led_task(led)));
54 54
55 // numbers from STM32U5G9J-DK2.ioc 55 // numbers from STM32U5G9J-DK2.ioc
56 const RK050HR18H_HSYNC: u16 = 5; // Horizontal synchronization 56 const RK050HR18H_HSYNC: u16 = 5; // Horizontal synchronization
diff --git a/examples/stm32wb/src/bin/gatt_server.rs b/examples/stm32wb/src/bin/gatt_server.rs
index 9864fa026..5d927bc00 100644
--- a/examples/stm32wb/src/bin/gatt_server.rs
+++ b/examples/stm32wb/src/bin/gatt_server.rs
@@ -71,7 +71,7 @@ async fn main(spawner: Spawner) {
71 let config = Config::default(); 71 let config = Config::default();
72 let mut mbox = TlMbox::init(p.IPCC, Irqs, config); 72 let mut mbox = TlMbox::init(p.IPCC, Irqs, config);
73 73
74 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 74 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
75 let sys_event = mbox.sys_subsystem.read().await; 75 let sys_event = mbox.sys_subsystem.read().await;
76 info!("sys event: {}", sys_event.payload()); 76 info!("sys event: {}", sys_event.payload());
77 77
diff --git a/examples/stm32wb/src/bin/mac_ffd.rs b/examples/stm32wb/src/bin/mac_ffd.rs
index d139aa61b..ede6cf4b9 100644
--- a/examples/stm32wb/src/bin/mac_ffd.rs
+++ b/examples/stm32wb/src/bin/mac_ffd.rs
@@ -56,7 +56,7 @@ async fn main(spawner: Spawner) {
56 let config = Config::default(); 56 let config = Config::default();
57 let mbox = TlMbox::init(p.IPCC, Irqs, config); 57 let mbox = TlMbox::init(p.IPCC, Irqs, config);
58 58
59 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 59 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
60 60
61 let sys_event = mbox.sys_subsystem.read().await; 61 let sys_event = mbox.sys_subsystem.read().await;
62 info!("sys event: {}", sys_event.payload()); 62 info!("sys event: {}", sys_event.payload());
diff --git a/examples/stm32wb/src/bin/mac_ffd_net.rs b/examples/stm32wb/src/bin/mac_ffd_net.rs
index 6a97daf4d..cc3b21e2e 100644
--- a/examples/stm32wb/src/bin/mac_ffd_net.rs
+++ b/examples/stm32wb/src/bin/mac_ffd_net.rs
@@ -62,7 +62,7 @@ async fn main(spawner: Spawner) {
62 let config = Config::default(); 62 let config = Config::default();
63 let mbox = TlMbox::init(p.IPCC, Irqs, config); 63 let mbox = TlMbox::init(p.IPCC, Irqs, config);
64 64
65 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 65 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
66 66
67 let sys_event = mbox.sys_subsystem.read().await; 67 let sys_event = mbox.sys_subsystem.read().await;
68 info!("sys event: {}", sys_event.payload()); 68 info!("sys event: {}", sys_event.payload());
@@ -168,7 +168,7 @@ async fn main(spawner: Spawner) {
168 static RUNNER: StaticCell<Runner> = StaticCell::new(); 168 static RUNNER: StaticCell<Runner> = StaticCell::new();
169 let runner = RUNNER.init(Runner::new(mbox.mac_subsystem, tx_queue)); 169 let runner = RUNNER.init(Runner::new(mbox.mac_subsystem, tx_queue));
170 170
171 spawner.spawn(run_mac(runner)).unwrap(); 171 spawner.spawn(run_mac(runner).unwrap());
172 172
173 let (driver, control) = mac::new(runner).await; 173 let (driver, control) = mac::new(runner).await;
174 174
diff --git a/examples/stm32wb/src/bin/mac_rfd.rs b/examples/stm32wb/src/bin/mac_rfd.rs
index 9062bdcd2..d872104a8 100644
--- a/examples/stm32wb/src/bin/mac_rfd.rs
+++ b/examples/stm32wb/src/bin/mac_rfd.rs
@@ -58,7 +58,7 @@ async fn main(spawner: Spawner) {
58 let config = Config::default(); 58 let config = Config::default();
59 let mbox = TlMbox::init(p.IPCC, Irqs, config); 59 let mbox = TlMbox::init(p.IPCC, Irqs, config);
60 60
61 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 61 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
62 62
63 let sys_event = mbox.sys_subsystem.read().await; 63 let sys_event = mbox.sys_subsystem.read().await;
64 info!("sys event: {}", sys_event.payload()); 64 info!("sys event: {}", sys_event.payload());
diff --git a/examples/stm32wb/src/bin/tl_mbox_mac.rs b/examples/stm32wb/src/bin/tl_mbox_mac.rs
index 9224e626d..95c73872b 100644
--- a/examples/stm32wb/src/bin/tl_mbox_mac.rs
+++ b/examples/stm32wb/src/bin/tl_mbox_mac.rs
@@ -53,7 +53,7 @@ async fn main(spawner: Spawner) {
53 let config = Config::default(); 53 let config = Config::default();
54 let mbox = TlMbox::init(p.IPCC, Irqs, config); 54 let mbox = TlMbox::init(p.IPCC, Irqs, config);
55 55
56 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 56 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
57 57
58 let sys_event = mbox.sys_subsystem.read().await; 58 let sys_event = mbox.sys_subsystem.read().await;
59 info!("sys event: {}", sys_event.payload()); 59 info!("sys event: {}", sys_event.payload());
diff --git a/examples/wasm/src/lib.rs b/examples/wasm/src/lib.rs
index 71cf980dd..170c97fb7 100644
--- a/examples/wasm/src/lib.rs
+++ b/examples/wasm/src/lib.rs
@@ -24,5 +24,5 @@ async fn ticker() {
24#[embassy_executor::main] 24#[embassy_executor::main]
25async fn main(spawner: Spawner) { 25async fn main(spawner: Spawner) {
26 wasm_logger::init(wasm_logger::Config::default()); 26 wasm_logger::init(wasm_logger::Config::default());
27 spawner.spawn(ticker()).unwrap(); 27 spawner.spawn(ticker().unwrap());
28} 28}
diff --git a/tests/nrf/src/bin/ethernet_enc28j60_perf.rs b/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
index ed58627f1..5f3fa1fd3 100644
--- a/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
+++ b/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
@@ -68,7 +68,7 @@ async fn main(spawner: Spawner) {
68 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new(); 68 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new();
69 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 69 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
70 70
71 unwrap!(spawner.spawn(net_task(runner))); 71 spawner.spawn(unwrap!(net_task(runner)));
72 72
73 perf_client::run( 73 perf_client::run(
74 stack, 74 stack,
diff --git a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
index 34fb8103b..34c33a4ad 100644
--- a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
+++ b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
@@ -74,7 +74,7 @@ async fn main(spawner: Spawner) {
74 ) 74 )
75 .await; 75 .await;
76 76
77 unwrap!(spawner.spawn(wifi_task(runner))); 77 spawner.spawn(unwrap!(wifi_task(runner)));
78 78
79 unwrap!(control.init().await); 79 unwrap!(control.init().await);
80 unwrap!(control.connect(WIFI_NETWORK, WIFI_PASSWORD).await); 80 unwrap!(control.connect(WIFI_NETWORK, WIFI_PASSWORD).await);
@@ -94,7 +94,7 @@ async fn main(spawner: Spawner) {
94 seed, 94 seed,
95 ); 95 );
96 96
97 unwrap!(spawner.spawn(net_task(runner))); 97 spawner.spawn(unwrap!(net_task(runner)));
98 98
99 perf_client::run( 99 perf_client::run(
100 stack, 100 stack,
diff --git a/tests/rp/src/bin/cyw43-perf.rs b/tests/rp/src/bin/cyw43-perf.rs
index dba1058a8..555134ffd 100644
--- a/tests/rp/src/bin/cyw43-perf.rs
+++ b/tests/rp/src/bin/cyw43-perf.rs
@@ -70,7 +70,7 @@ async fn main(spawner: Spawner) {
70 static STATE: StaticCell<cyw43::State> = StaticCell::new(); 70 static STATE: StaticCell<cyw43::State> = StaticCell::new();
71 let state = STATE.init(cyw43::State::new()); 71 let state = STATE.init(cyw43::State::new());
72 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; 72 let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await;
73 unwrap!(spawner.spawn(wifi_task(runner))); 73 spawner.spawn(unwrap!(wifi_task(runner)));
74 74
75 control.init(clm).await; 75 control.init(clm).await;
76 control 76 control
@@ -89,7 +89,7 @@ async fn main(spawner: Spawner) {
89 seed, 89 seed,
90 ); 90 );
91 91
92 unwrap!(spawner.spawn(net_task(runner))); 92 spawner.spawn(unwrap!(net_task(runner)));
93 93
94 loop { 94 loop {
95 match control 95 match control
diff --git a/tests/rp/src/bin/ethernet_w5100s_perf.rs b/tests/rp/src/bin/ethernet_w5100s_perf.rs
index 89e0ad32e..3f2bc728d 100644
--- a/tests/rp/src/bin/ethernet_w5100s_perf.rs
+++ b/tests/rp/src/bin/ethernet_w5100s_perf.rs
@@ -60,7 +60,7 @@ async fn main(spawner: Spawner) {
60 ) 60 )
61 .await 61 .await
62 .unwrap(); 62 .unwrap();
63 unwrap!(spawner.spawn(ethernet_task(runner))); 63 spawner.spawn(unwrap!(ethernet_task(runner)));
64 64
65 // Generate random seed 65 // Generate random seed
66 let seed = rng.next_u64(); 66 let seed = rng.next_u64();
@@ -75,7 +75,7 @@ async fn main(spawner: Spawner) {
75 ); 75 );
76 76
77 // Launch network task 77 // Launch network task
78 unwrap!(spawner.spawn(net_task(runner))); 78 spawner.spawn(unwrap!(net_task(runner)));
79 79
80 perf_client::run( 80 perf_client::run(
81 stack, 81 stack,
diff --git a/tests/rp/src/bin/gpio_multicore.rs b/tests/rp/src/bin/gpio_multicore.rs
index 857f36975..f48dd207b 100644
--- a/tests/rp/src/bin/gpio_multicore.rs
+++ b/tests/rp/src/bin/gpio_multicore.rs
@@ -30,11 +30,11 @@ fn main() -> ! {
30 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, 30 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) },
31 move || { 31 move || {
32 let executor1 = EXECUTOR1.init(Executor::new()); 32 let executor1 = EXECUTOR1.init(Executor::new());
33 executor1.run(|spawner| unwrap!(spawner.spawn(core1_task(p.PIN_1)))); 33 executor1.run(|spawner| spawner.spawn(unwrap!(core1_task(p.PIN_1))));
34 }, 34 },
35 ); 35 );
36 let executor0 = EXECUTOR0.init(Executor::new()); 36 let executor0 = EXECUTOR0.init(Executor::new());
37 executor0.run(|spawner| unwrap!(spawner.spawn(core0_task(p.PIN_0)))); 37 executor0.run(|spawner| spawner.spawn(unwrap!(core0_task(p.PIN_0))));
38} 38}
39 39
40#[embassy_executor::task] 40#[embassy_executor::task]
diff --git a/tests/rp/src/bin/i2c.rs b/tests/rp/src/bin/i2c.rs
index 2c835bd5a..21761b98b 100644
--- a/tests/rp/src/bin/i2c.rs
+++ b/tests/rp/src/bin/i2c.rs
@@ -208,7 +208,7 @@ async fn controller_task(con: &mut i2c::I2c<'static, I2C0, i2c::Async>) {
208 config.addr = DEV_ADDR as u16; 208 config.addr = DEV_ADDR as u16;
209 let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); 209 let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config);
210 210
211 spawner.must_spawn(device_task(device)); 211 spawner.spawn(device_task(device).unwrap());
212 212
213 let c_sda = p.PIN_21; 213 let c_sda = p.PIN_21;
214 let c_scl = p.PIN_20; 214 let c_scl = p.PIN_20;
diff --git a/tests/rp/src/bin/multicore.rs b/tests/rp/src/bin/multicore.rs
index 902169c40..11b03cfea 100644
--- a/tests/rp/src/bin/multicore.rs
+++ b/tests/rp/src/bin/multicore.rs
@@ -27,11 +27,11 @@ fn main() -> ! {
27 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, 27 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) },
28 move || { 28 move || {
29 let executor1 = EXECUTOR1.init(Executor::new()); 29 let executor1 = EXECUTOR1.init(Executor::new());
30 executor1.run(|spawner| unwrap!(spawner.spawn(core1_task()))); 30 executor1.run(|spawner| spawner.spawn(unwrap!(core1_task())));
31 }, 31 },
32 ); 32 );
33 let executor0 = EXECUTOR0.init(Executor::new()); 33 let executor0 = EXECUTOR0.init(Executor::new());
34 executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); 34 executor0.run(|spawner| spawner.spawn(unwrap!(core0_task())));
35} 35}
36 36
37#[embassy_executor::task] 37#[embassy_executor::task]
diff --git a/tests/rp/src/bin/spinlock_mutex_multicore.rs b/tests/rp/src/bin/spinlock_mutex_multicore.rs
index ebcf1ca32..c56d43ade 100644
--- a/tests/rp/src/bin/spinlock_mutex_multicore.rs
+++ b/tests/rp/src/bin/spinlock_mutex_multicore.rs
@@ -27,11 +27,11 @@ fn main() -> ! {
27 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, 27 unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) },
28 move || { 28 move || {
29 let executor1 = EXECUTOR1.init(Executor::new()); 29 let executor1 = EXECUTOR1.init(Executor::new());
30 executor1.run(|spawner| unwrap!(spawner.spawn(core1_task()))); 30 executor1.run(|spawner| spawner.spawn(unwrap!(core1_task())));
31 }, 31 },
32 ); 32 );
33 let executor0 = EXECUTOR0.init(Executor::new()); 33 let executor0 = EXECUTOR0.init(Executor::new());
34 executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); 34 executor0.run(|spawner| spawner.spawn(unwrap!(core0_task())));
35} 35}
36 36
37#[embassy_executor::task] 37#[embassy_executor::task]
diff --git a/tests/stm32/src/bin/eth.rs b/tests/stm32/src/bin/eth.rs
index bcb362b42..a65682a02 100644
--- a/tests/stm32/src/bin/eth.rs
+++ b/tests/stm32/src/bin/eth.rs
@@ -101,7 +101,7 @@ async fn main(spawner: Spawner) {
101 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); 101 let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed);
102 102
103 // Launch network task 103 // Launch network task
104 unwrap!(spawner.spawn(net_task(runner))); 104 spawner.spawn(unwrap!(net_task(runner)));
105 105
106 perf_client::run( 106 perf_client::run(
107 stack, 107 stack,
diff --git a/tests/stm32/src/bin/stop.rs b/tests/stm32/src/bin/stop.rs
index 772bc527c..8119c1f39 100644
--- a/tests/stm32/src/bin/stop.rs
+++ b/tests/stm32/src/bin/stop.rs
@@ -19,7 +19,7 @@ use static_cell::StaticCell;
19#[entry] 19#[entry]
20fn main() -> ! { 20fn main() -> ! {
21 Executor::take().run(|spawner| { 21 Executor::take().run(|spawner| {
22 unwrap!(spawner.spawn(async_main(spawner))); 22 spawner.spawn(unwrap!(async_main(spawner)));
23 }); 23 });
24} 24}
25 25
@@ -75,6 +75,6 @@ async fn async_main(spawner: Spawner) {
75 75
76 stop_with_rtc(rtc); 76 stop_with_rtc(rtc);
77 77
78 spawner.spawn(task_1()).unwrap(); 78 spawner.spawn(task_1().unwrap());
79 spawner.spawn(task_2()).unwrap(); 79 spawner.spawn(task_2().unwrap());
80} 80}
diff --git a/tests/stm32/src/bin/usart_rx_ringbuffered.rs b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
index 83c0887ac..15a0b0d60 100644
--- a/tests/stm32/src/bin/usart_rx_ringbuffered.rs
+++ b/tests/stm32/src/bin/usart_rx_ringbuffered.rs
@@ -46,8 +46,8 @@ async fn main(spawner: Spawner) {
46 let rx = rx.into_ring_buffered(unsafe { &mut *core::ptr::addr_of_mut!(DMA_BUF) }); 46 let rx = rx.into_ring_buffered(unsafe { &mut *core::ptr::addr_of_mut!(DMA_BUF) });
47 47
48 info!("Spawning tasks"); 48 info!("Spawning tasks");
49 spawner.spawn(transmit_task(tx)).unwrap(); 49 spawner.spawn(transmit_task(tx).unwrap());
50 spawner.spawn(receive_task(rx)).unwrap(); 50 spawner.spawn(receive_task(rx).unwrap());
51} 51}
52 52
53#[embassy_executor::task] 53#[embassy_executor::task]
diff --git a/tests/stm32/src/bin/wpan_ble.rs b/tests/stm32/src/bin/wpan_ble.rs
index fde1dfa9b..8957bfc04 100644
--- a/tests/stm32/src/bin/wpan_ble.rs
+++ b/tests/stm32/src/bin/wpan_ble.rs
@@ -47,7 +47,7 @@ async fn main(spawner: Spawner) {
47 let config = Config::default(); 47 let config = Config::default();
48 let mut mbox = TlMbox::init(p.IPCC, Irqs, config); 48 let mut mbox = TlMbox::init(p.IPCC, Irqs, config);
49 49
50 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 50 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
51 51
52 let sys_event = mbox.sys_subsystem.read().await; 52 let sys_event = mbox.sys_subsystem.read().await;
53 info!("sys event: {}", sys_event.payload()); 53 info!("sys event: {}", sys_event.payload());
diff --git a/tests/stm32/src/bin/wpan_mac.rs b/tests/stm32/src/bin/wpan_mac.rs
index b65ace40f..79e13d524 100644
--- a/tests/stm32/src/bin/wpan_mac.rs
+++ b/tests/stm32/src/bin/wpan_mac.rs
@@ -40,7 +40,7 @@ async fn main(spawner: Spawner) {
40 let config = Config::default(); 40 let config = Config::default();
41 let mbox = TlMbox::init(p.IPCC, Irqs, config); 41 let mbox = TlMbox::init(p.IPCC, Irqs, config);
42 42
43 spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); 43 spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap());
44 44
45 let sys_event = mbox.sys_subsystem.read().await; 45 let sys_event = mbox.sys_subsystem.read().await;
46 info!("sys event: {}", sys_event.payload()); 46 info!("sys event: {}", sys_event.payload());