aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-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/src/raw/mod.rs18
-rw-r--r--embassy-executor/src/spawner.rs65
-rw-r--r--embassy-executor/tests/test.rs29
-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/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/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/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/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
164 files changed, 337 insertions, 389 deletions
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/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/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs
index a7e65360d..bdaa32951 100644
--- a/embassy-executor/src/raw/mod.rs
+++ b/embassy-executor/src/raw/mod.rs
@@ -41,7 +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; 44use crate::{Metadata, SpawnError};
45 45
46#[no_mangle] 46#[no_mangle]
47extern "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 {
@@ -220,11 +220,11 @@ impl<F: Future + 'static> TaskStorage<F> {
220 /// 220 ///
221 /// 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
222 /// on a different executor. 222 /// on a different executor.
223 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> {
224 let task = AvailableTask::claim(self); 224 let task = AvailableTask::claim(self);
225 match task { 225 match task {
226 Some(task) => task.initialize(future), 226 Some(task) => Ok(task.initialize(future)),
227 None => SpawnToken::new_failed(), 227 None => Err(SpawnError::Busy),
228 } 228 }
229 } 229 }
230 230
@@ -353,10 +353,10 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
353 } 353 }
354 } 354 }
355 355
356 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> {
357 match self.pool.iter().find_map(AvailableTask::claim) { 357 match self.pool.iter().find_map(AvailableTask::claim) {
358 Some(task) => task.initialize_impl::<T>(future), 358 Some(task) => Ok(task.initialize_impl::<T>(future)),
359 None => SpawnToken::new_failed(), 359 None => Err(SpawnError::Busy),
360 } 360 }
361 } 361 }
362 362
@@ -367,7 +367,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
367 /// 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
368 /// 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,
369 /// 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.
370 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> {
371 self.spawn_impl::<F>(future) 371 self.spawn_impl::<F>(future)
372 } 372 }
373 373
@@ -380,7 +380,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> {
380 /// 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`
381 /// is an `async fn`, NOT a hand-written `Future`. 381 /// is an `async fn`, NOT a hand-written `Future`.
382 #[doc(hidden)] 382 #[doc(hidden)]
383 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>
384 where 384 where
385 FutFn: FnOnce() -> F, 385 FutFn: FnOnce() -> F,
386 { 386 {
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs
index cd2113a28..83d896b76 100644
--- a/embassy-executor/src/spawner.rs
+++ b/embassy-executor/src/spawner.rs
@@ -23,39 +23,28 @@ use crate::Metadata;
23/// 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.
24#[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()"]
25pub struct SpawnToken<S> { 25pub struct SpawnToken<S> {
26 pub(crate) raw_task: Option<raw::TaskRef>, 26 pub(crate) raw_task: raw::TaskRef,
27 phantom: PhantomData<*mut S>, 27 phantom: PhantomData<*mut S>,
28} 28}
29 29
30impl<S> SpawnToken<S> { 30impl<S> SpawnToken<S> {
31 pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self { 31 pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self {
32 Self { 32 Self {
33 raw_task: Some(raw_task), 33 raw_task,
34 phantom: PhantomData, 34 phantom: PhantomData,
35 } 35 }
36 } 36 }
37 37
38 /// Return a SpawnToken that represents a failed spawn. 38 /// Returns the task ID.
39 pub fn new_failed() -> Self {
40 Self {
41 raw_task: None,
42 phantom: PhantomData,
43 }
44 }
45
46 /// Returns the task ID if available, otherwise 0
47 /// This can be used in combination with rtos-trace to match task names with IDs 39 /// This can be used in combination with rtos-trace to match task names with IDs
48 pub fn id(&self) -> u32 { 40 pub fn id(&self) -> u32 {
49 match self.raw_task { 41 self.raw_task.id()
50 None => 0,
51 Some(t) => t.id(),
52 }
53 } 42 }
54 43
55 /// Get the metadata for this task. You can use this to set metadata fields 44 /// Get the metadata for this task. You can use this to set metadata fields
56 /// prior to spawning it. 45 /// prior to spawning it.
57 pub fn metadata(&self) -> &Metadata { 46 pub fn metadata(&self) -> &Metadata {
58 self.raw_task.unwrap().metadata() 47 self.raw_task.metadata()
59 } 48 }
60} 49}
61 50
@@ -164,30 +153,10 @@ impl Spawner {
164 /// Spawn a task into an executor. 153 /// Spawn a task into an executor.
165 /// 154 ///
166 /// 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]`).
167 pub fn spawn<S>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 156 pub fn spawn<S>(&self, token: SpawnToken<S>) {
168 let task = token.raw_task; 157 let task = token.raw_task;
169 mem::forget(token); 158 mem::forget(token);
170 159 unsafe { self.executor.spawn(task) }
171 match task {
172 Some(task) => {
173 unsafe { self.executor.spawn(task) };
174 Ok(())
175 }
176 None => Err(SpawnError::Busy),
177 }
178 }
179
180 // Used by the `embassy_executor_macros::main!` macro to throw an error when spawn
181 // fails. This is here to allow conditional use of `defmt::unwrap!`
182 // without introducing a `defmt` feature in the `embassy_executor_macros` package,
183 // which would require use of `-Z namespaced-features`.
184 /// Spawn a task into an executor, panicking on failure.
185 ///
186 /// # Panics
187 ///
188 /// Panics if the spawning fails.
189 pub fn must_spawn<S>(&self, token: SpawnToken<S>) {
190 unwrap!(self.spawn(token));
191 } 160 }
192 161
193 /// 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
@@ -245,25 +214,9 @@ impl SendSpawner {
245 /// Spawn a task into an executor. 214 /// Spawn a task into an executor.
246 /// 215 ///
247 /// 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]`).
248 pub fn spawn<S: Send>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { 217 pub fn spawn<S: Send>(&self, token: SpawnToken<S>) {
249 let header = token.raw_task; 218 let header = token.raw_task;
250 mem::forget(token); 219 mem::forget(token);
251 220 unsafe { self.executor.spawn(header) }
252 match header {
253 Some(header) => {
254 unsafe { self.executor.spawn(header) };
255 Ok(())
256 }
257 None => Err(SpawnError::Busy),
258 }
259 }
260
261 /// Spawn a task into an executor, panicking on failure.
262 ///
263 /// # Panics
264 ///
265 /// Panics if the spawning fails.
266 pub fn must_spawn<S: Send>(&self, token: SpawnToken<S>) {
267 unwrap!(self.spawn(token));
268 } 221 }
269} 222}
diff --git a/embassy-executor/tests/test.rs b/embassy-executor/tests/test.rs
index 530314ac3..85c5dc1d9 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
@@ -338,22 +337,22 @@ fn task_metadata() {
338 337
339 // check no task name 338 // check no task name
340 let (executor, _) = setup(); 339 let (executor, _) = setup();
341 executor.spawner().spawn(task1(None)).unwrap(); 340 executor.spawner().spawn(task1(None).unwrap());
342 unsafe { executor.poll() }; 341 unsafe { executor.poll() };
343 342
344 // check setting task name 343 // check setting task name
345 let token = task1(Some("foo")); 344 let token = task1(Some("foo")).unwrap();
346 token.metadata().set_name("foo"); 345 token.metadata().set_name("foo");
347 executor.spawner().spawn(token).unwrap(); 346 executor.spawner().spawn(token);
348 unsafe { executor.poll() }; 347 unsafe { executor.poll() };
349 348
350 let token = task1(Some("bar")); 349 let token = task1(Some("bar")).unwrap();
351 token.metadata().set_name("bar"); 350 token.metadata().set_name("bar");
352 executor.spawner().spawn(token).unwrap(); 351 executor.spawner().spawn(token);
353 unsafe { executor.poll() }; 352 unsafe { executor.poll() };
354 353
355 // check name is cleared if the task pool slot is recycled. 354 // check name is cleared if the task pool slot is recycled.
356 let (executor, _) = setup(); 355 let (executor, _) = setup();
357 executor.spawner().spawn(task1(None)).unwrap(); 356 executor.spawner().spawn(task1(None).unwrap());
358 unsafe { executor.poll() }; 357 unsafe { executor.poll() };
359} 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/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/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/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/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());