diff options
194 files changed, 889 insertions, 570 deletions
diff --git a/.github/ci/test.sh b/.github/ci/test.sh index c9b332cf8..33dfa48c9 100755 --- a/.github/ci/test.sh +++ b/.github/ci/test.sh | |||
| @@ -12,7 +12,7 @@ export CARGO_TARGET_DIR=/ci/cache/target | |||
| 12 | # used when pointing stm32-metapac to a CI-built one. | 12 | # used when pointing stm32-metapac to a CI-built one. |
| 13 | export CARGO_NET_GIT_FETCH_WITH_CLI=true | 13 | export CARGO_NET_GIT_FETCH_WITH_CLI=true |
| 14 | 14 | ||
| 15 | cargo test --manifest-path ./embassy-executor/Cargo.toml | 15 | cargo test --manifest-path ./embassy-executor/Cargo.toml --features metadata-name |
| 16 | cargo test --manifest-path ./embassy-futures/Cargo.toml | 16 | cargo test --manifest-path ./embassy-futures/Cargo.toml |
| 17 | cargo test --manifest-path ./embassy-sync/Cargo.toml | 17 | cargo test --manifest-path ./embassy-sync/Cargo.toml |
| 18 | cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml | 18 | cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml |
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 13e04d954..8ee143cad 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml | |||
| @@ -161,9 +161,9 @@ jobs: | |||
| 161 | if: steps.changes.outputs.embassy-executor-macros == 'true' | 161 | if: steps.changes.outputs.embassy-executor-macros == 'true' |
| 162 | uses: dangoslen/changelog-enforcer@v3 | 162 | uses: dangoslen/changelog-enforcer@v3 |
| 163 | with: | 163 | with: |
| 164 | changeLogPath: embassy-executor-macros/CHANGELOG.md | 164 | changeLogPath: embassy-executor/CHANGELOG.md |
| 165 | skipLabels: "skip-changelog" | 165 | skipLabels: "skip-changelog" |
| 166 | missingUpdateErrorMessage: "Please add a changelog entry in the embassy-executor-macros/CHANGELOG.md file." | 166 | missingUpdateErrorMessage: "Please add a changelog entry in the embassy-executor/CHANGELOG.md file." |
| 167 | - name: Check that changelog updated (embassy-executor-timer-queue) | 167 | - name: Check that changelog updated (embassy-executor-timer-queue) |
| 168 | if: steps.changes.outputs.embassy-executor-timer-queue == 'true' | 168 | if: steps.changes.outputs.embassy-executor-timer-queue == 'true' |
| 169 | uses: dangoslen/changelog-enforcer@v3 | 169 | uses: dangoslen/changelog-enforcer@v3 |
| @@ -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 { |
| @@ -31,7 +31,10 @@ cargo batch \ | |||
| 31 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \ | 31 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \ |
| 32 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt \ | 32 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt \ |
| 33 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \ | 33 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \ |
| 34 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,metadata-name \ | ||
| 35 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,trace \ | ||
| 34 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,rtos-trace \ | 36 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,rtos-trace \ |
| 37 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,trace,rtos-trace \ | ||
| 35 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \ | 38 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \ |
| 36 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \ | 39 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \ |
| 37 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \ | 40 | --- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \ |
diff --git a/docs/examples/basic/src/main.rs b/docs/examples/basic/src/main.rs index 4412712c8..6e274bacb 100644 --- a/docs/examples/basic/src/main.rs +++ b/docs/examples/basic/src/main.rs | |||
| @@ -22,5 +22,5 @@ async fn main(spawner: Spawner) { | |||
| 22 | let p = embassy_nrf::init(Default::default()); | 22 | let p = embassy_nrf::init(Default::default()); |
| 23 | 23 | ||
| 24 | let led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard); | 24 | let led = Output::new(p.P0_13, Level::Low, OutputDrive::Standard); |
| 25 | unwrap!(spawner.spawn(blinker(led, Duration::from_millis(300)))); | 25 | spawner.spawn(unwrap!(blinker(led, Duration::from_millis(300)))); |
| 26 | } | 26 | } |
diff --git a/docs/pages/sharing_peripherals.adoc b/docs/pages/sharing_peripherals.adoc index dfb8c1ffe..70b4210e6 100644 --- a/docs/pages/sharing_peripherals.adoc +++ b/docs/pages/sharing_peripherals.adoc | |||
| @@ -36,8 +36,8 @@ async fn main(spawner: Spawner) { | |||
| 36 | let dt = 100 * 1_000_000; | 36 | let dt = 100 * 1_000_000; |
| 37 | let k = 1.003; | 37 | let k = 1.003; |
| 38 | 38 | ||
| 39 | unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); | 39 | spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos(dt)))); |
| 40 | unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); | 40 | spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | // A pool size of 2 means you can spawn two instances of this task. | 43 | // A pool size of 2 means you can spawn two instances of this task. |
| @@ -103,8 +103,8 @@ async fn main(spawner: Spawner) { | |||
| 103 | let dt = 100 * 1_000_000; | 103 | let dt = 100 * 1_000_000; |
| 104 | let k = 1.003; | 104 | let k = 1.003; |
| 105 | 105 | ||
| 106 | unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); | 106 | spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); |
| 107 | unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64)))); | 107 | spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos((dt as f64 * k) as u64)))); |
| 108 | 108 | ||
| 109 | loop { | 109 | loop { |
| 110 | match CHANNEL.receive().await { | 110 | match CHANNEL.receive().await { |
diff --git a/embassy-executor-macros/src/macros/main.rs b/embassy-executor-macros/src/macros/main.rs index a0e7b3401..f043ff7f6 100644 --- a/embassy-executor-macros/src/macros/main.rs +++ b/embassy-executor-macros/src/macros/main.rs | |||
| @@ -170,6 +170,14 @@ For example: `#[embassy_executor::main(entry = ..., executor = \"some_crate::Exe | |||
| 170 | let f_body = f.body; | 170 | let f_body = f.body; |
| 171 | let out = &f.sig.output; | 171 | let out = &f.sig.output; |
| 172 | 172 | ||
| 173 | let name_main_task = if cfg!(feature = "rtos-trace") { | ||
| 174 | quote!( | ||
| 175 | main_task.metadata().set_name("main\0"); | ||
| 176 | ) | ||
| 177 | } else { | ||
| 178 | quote!() | ||
| 179 | }; | ||
| 180 | |||
| 173 | let (main_ret, mut main_body) = match arch.flavor { | 181 | let (main_ret, mut main_body) = match arch.flavor { |
| 174 | Flavor::Standard => ( | 182 | Flavor::Standard => ( |
| 175 | quote!(!), | 183 | quote!(!), |
| @@ -181,7 +189,9 @@ For example: `#[embassy_executor::main(entry = ..., executor = \"some_crate::Exe | |||
| 181 | let mut executor = #executor::new(); | 189 | let mut executor = #executor::new(); |
| 182 | let executor = unsafe { __make_static(&mut executor) }; | 190 | let executor = unsafe { __make_static(&mut executor) }; |
| 183 | executor.run(|spawner| { | 191 | executor.run(|spawner| { |
| 184 | spawner.must_spawn(__embassy_main(spawner)); | 192 | let main_task = __embassy_main(spawner).unwrap(); |
| 193 | #name_main_task | ||
| 194 | spawner.spawn(main_task); | ||
| 185 | }) | 195 | }) |
| 186 | }, | 196 | }, |
| 187 | ), | 197 | ), |
| @@ -191,7 +201,9 @@ For example: `#[embassy_executor::main(entry = ..., executor = \"some_crate::Exe | |||
| 191 | let executor = ::std::boxed::Box::leak(::std::boxed::Box::new(#executor::new())); | 201 | let executor = ::std::boxed::Box::leak(::std::boxed::Box::new(#executor::new())); |
| 192 | 202 | ||
| 193 | executor.start(|spawner| { | 203 | executor.start(|spawner| { |
| 194 | spawner.must_spawn(__embassy_main(spawner)); | 204 | let main_task = __embassy_main(spawner).unwrap(); |
| 205 | #name_main_task | ||
| 206 | spawner.spawn(main_task); | ||
| 195 | }); | 207 | }); |
| 196 | 208 | ||
| 197 | Ok(()) | 209 | Ok(()) |
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs index fc8673743..755948882 100644 --- a/embassy-executor-macros/src/macros/task.rs +++ b/embassy-executor-macros/src/macros/task.rs | |||
| @@ -234,7 +234,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 234 | if !errors.is_empty() { | 234 | if !errors.is_empty() { |
| 235 | task_outer_body = quote! { | 235 | task_outer_body = quote! { |
| 236 | #![allow(unused_variables, unreachable_code)] | 236 | #![allow(unused_variables, unreachable_code)] |
| 237 | let _x: #embassy_executor::SpawnToken<()> = ::core::todo!(); | 237 | let _x: ::core::result::Result<#embassy_executor::SpawnToken<()>, #embassy_executor::SpawnError> = ::core::todo!(); |
| 238 | _x | 238 | _x |
| 239 | }; | 239 | }; |
| 240 | } | 240 | } |
| @@ -248,7 +248,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 248 | #task_inner | 248 | #task_inner |
| 249 | 249 | ||
| 250 | #(#task_outer_attrs)* | 250 | #(#task_outer_attrs)* |
| 251 | #visibility #unsafety fn #task_ident #generics (#fargs) -> #embassy_executor::SpawnToken<impl Sized> #where_clause{ | 251 | #visibility #unsafety fn #task_ident #generics (#fargs) -> ::core::result::Result<#embassy_executor::SpawnToken<impl Sized>, #embassy_executor::SpawnError> #where_clause{ |
| 252 | #task_outer_body | 252 | #task_outer_body |
| 253 | } | 253 | } |
| 254 | 254 | ||
diff --git a/embassy-executor/CHANGELOG.md b/embassy-executor/CHANGELOG.md index f301429c0..a36d270ba 100644 --- a/embassy-executor/CHANGELOG.md +++ b/embassy-executor/CHANGELOG.md | |||
| @@ -8,12 +8,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 8 | <!-- next-header --> | 8 | <!-- next-header --> |
| 9 | ## Unreleased - ReleaseDate | 9 | ## Unreleased - ReleaseDate |
| 10 | 10 | ||
| 11 | - Added new metadata API for tasks | ||
| 12 | - Named main task when rtos-trace feature is enabled. | ||
| 13 | - Upgraded rtos-trace | ||
| 14 | |||
| 15 | ## 0.9.1 - 2025-08-31 | ||
| 16 | |||
| 17 | - Fixed performance regression on some ESP32 MCUs. | ||
| 18 | |||
| 11 | ## 0.9.0 - 2025-08-26 | 19 | ## 0.9.0 - 2025-08-26 |
| 12 | 20 | ||
| 13 | - Added `extern "Rust" fn __embassy_time_queue_item_from_waker` | 21 | - Added `extern "Rust" fn __embassy_time_queue_item_from_waker` |
| 14 | - Removed `TaskRef::dangling` | 22 | - Removed `TaskRef::dangling` |
| 15 | - Added `embassy_time_queue_utils` as a dependency | 23 | - Added `embassy-executor-timer-queue` as a dependency |
| 16 | - Moved the `TimeQueueItem` struct and `timer-item-payload-size-*` features into embassy-time-queue-utils | 24 | - Moved the `TimeQueueItem` struct and `timer-item-payload-size-*` features (as `timer-item-size-X-words`) into `embassy-executor-timer-queue` |
| 17 | 25 | ||
| 18 | ## 0.8.0 - 2025-07-31 | 26 | ## 0.8.0 - 2025-07-31 |
| 19 | 27 | ||
diff --git a/embassy-executor/Cargo.toml b/embassy-executor/Cargo.toml index d89e85cb7..ed72a585f 100644 --- a/embassy-executor/Cargo.toml +++ b/embassy-executor/Cargo.toml | |||
| @@ -51,7 +51,7 @@ features = ["defmt", "arch-cortex-m", "executor-thread", "executor-interrupt"] | |||
| 51 | [dependencies] | 51 | [dependencies] |
| 52 | defmt = { version = "1.0.1", optional = true } | 52 | defmt = { version = "1.0.1", optional = true } |
| 53 | log = { version = "0.4.14", optional = true } | 53 | log = { version = "0.4.14", optional = true } |
| 54 | rtos-trace = { version = "0.1.3", optional = true } | 54 | rtos-trace = { version = "0.2", optional = true } |
| 55 | 55 | ||
| 56 | embassy-executor-macros = { version = "0.7.0", path = "../embassy-executor-macros" } | 56 | embassy-executor-macros = { version = "0.7.0", path = "../embassy-executor-macros" } |
| 57 | embassy-time-driver = { version = "0.2.1", path = "../embassy-time-driver", optional = true } | 57 | embassy-time-driver = { version = "0.2.1", path = "../embassy-time-driver", optional = true } |
| @@ -109,13 +109,19 @@ arch-avr = ["_arch", "dep:portable-atomic", "dep:avr-device"] | |||
| 109 | ## spin (architecture agnostic; never sleeps) | 109 | ## spin (architecture agnostic; never sleeps) |
| 110 | arch-spin = ["_arch"] | 110 | arch-spin = ["_arch"] |
| 111 | 111 | ||
| 112 | #! ### Metadata | ||
| 113 | |||
| 114 | ## Enable the `name` field in task metadata. | ||
| 115 | metadata-name = [] | ||
| 116 | |||
| 112 | #! ### Executor | 117 | #! ### Executor |
| 113 | 118 | ||
| 114 | ## Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs) | 119 | ## Enable the thread-mode executor (using WFE/SEV in Cortex-M, WFI in other embedded archs) |
| 115 | executor-thread = [] | 120 | executor-thread = [] |
| 116 | ## Enable the interrupt-mode executor (available in Cortex-M only) | 121 | ## Enable the interrupt-mode executor (available in Cortex-M only) |
| 117 | executor-interrupt = [] | 122 | executor-interrupt = [] |
| 118 | ## Enable tracing support (adds some overhead) | 123 | ## Enable tracing hooks |
| 119 | trace = [] | 124 | trace = ["_any_trace"] |
| 120 | ## Enable support for rtos-trace framework | 125 | ## Enable support for rtos-trace framework |
| 121 | rtos-trace = ["dep:rtos-trace", "trace", "dep:embassy-time-driver"] | 126 | rtos-trace = ["_any_trace", "metadata-name", "dep:rtos-trace", "dep:embassy-time-driver"] |
| 127 | _any_trace = [] | ||
diff --git a/embassy-executor/src/lib.rs b/embassy-executor/src/lib.rs index 0747db032..e47b8eb9f 100644 --- a/embassy-executor/src/lib.rs +++ b/embassy-executor/src/lib.rs | |||
| @@ -54,6 +54,9 @@ pub mod raw; | |||
| 54 | mod spawner; | 54 | mod spawner; |
| 55 | pub use spawner::*; | 55 | pub use spawner::*; |
| 56 | 56 | ||
| 57 | mod metadata; | ||
| 58 | pub use metadata::*; | ||
| 59 | |||
| 57 | /// Implementation details for embassy macros. | 60 | /// Implementation details for embassy macros. |
| 58 | /// Do not use. Used for macros and HALs only. Not covered by semver guarantees. | 61 | /// Do not use. Used for macros and HALs only. Not covered by semver guarantees. |
| 59 | #[doc(hidden)] | 62 | #[doc(hidden)] |
diff --git a/embassy-executor/src/metadata.rs b/embassy-executor/src/metadata.rs new file mode 100644 index 000000000..f92c9b37c --- /dev/null +++ b/embassy-executor/src/metadata.rs | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #[cfg(feature = "metadata-name")] | ||
| 2 | use core::cell::Cell; | ||
| 3 | use core::future::{poll_fn, Future}; | ||
| 4 | use core::task::Poll; | ||
| 5 | |||
| 6 | #[cfg(feature = "metadata-name")] | ||
| 7 | use critical_section::Mutex; | ||
| 8 | |||
| 9 | use crate::raw; | ||
| 10 | |||
| 11 | /// Metadata associated with a task. | ||
| 12 | pub struct Metadata { | ||
| 13 | #[cfg(feature = "metadata-name")] | ||
| 14 | name: Mutex<Cell<Option<&'static str>>>, | ||
| 15 | } | ||
| 16 | |||
| 17 | impl Metadata { | ||
| 18 | pub(crate) const fn new() -> Self { | ||
| 19 | Self { | ||
| 20 | #[cfg(feature = "metadata-name")] | ||
| 21 | name: Mutex::new(Cell::new(None)), | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
| 25 | pub(crate) fn reset(&self) { | ||
| 26 | #[cfg(feature = "metadata-name")] | ||
| 27 | critical_section::with(|cs| self.name.borrow(cs).set(None)); | ||
| 28 | } | ||
| 29 | |||
| 30 | /// Get the metadata for the current task. | ||
| 31 | /// | ||
| 32 | /// You can use this to read or modify the current task's metadata. | ||
| 33 | /// | ||
| 34 | /// This function is `async` just to get access to the current async | ||
| 35 | /// context. It returns instantly, it does not block/yield. | ||
| 36 | pub fn for_current_task() -> impl Future<Output = &'static Self> { | ||
| 37 | poll_fn(|cx| Poll::Ready(raw::task_from_waker(cx.waker()).metadata())) | ||
| 38 | } | ||
| 39 | |||
| 40 | /// Get this task's name | ||
| 41 | /// | ||
| 42 | /// NOTE: this takes a critical section. | ||
| 43 | #[cfg(feature = "metadata-name")] | ||
| 44 | pub fn name(&self) -> Option<&'static str> { | ||
| 45 | critical_section::with(|cs| self.name.borrow(cs).get()) | ||
| 46 | } | ||
| 47 | |||
| 48 | /// Set this task's name | ||
| 49 | /// | ||
| 50 | /// NOTE: this takes a critical section. | ||
| 51 | #[cfg(feature = "metadata-name")] | ||
| 52 | pub fn set_name(&self, name: &'static str) { | ||
| 53 | critical_section::with(|cs| self.name.borrow(cs).set(Some(name))) | ||
| 54 | } | ||
| 55 | } | ||
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index 4b17d4982..4280c5750 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -12,11 +12,17 @@ | |||
| 12 | mod run_queue; | 12 | mod run_queue; |
| 13 | 13 | ||
| 14 | #[cfg_attr(all(cortex_m, target_has_atomic = "32"), path = "state_atomics_arm.rs")] | 14 | #[cfg_attr(all(cortex_m, target_has_atomic = "32"), path = "state_atomics_arm.rs")] |
| 15 | #[cfg_attr(all(not(cortex_m), target_has_atomic = "8"), path = "state_atomics.rs")] | 15 | #[cfg_attr( |
| 16 | #[cfg_attr(not(target_has_atomic = "8"), path = "state_critical_section.rs")] | 16 | all(not(cortex_m), any(target_has_atomic = "8", target_has_atomic = "32")), |
| 17 | path = "state_atomics.rs" | ||
| 18 | )] | ||
| 19 | #[cfg_attr( | ||
| 20 | not(any(target_has_atomic = "8", target_has_atomic = "32")), | ||
| 21 | path = "state_critical_section.rs" | ||
| 22 | )] | ||
| 17 | mod state; | 23 | mod state; |
| 18 | 24 | ||
| 19 | #[cfg(feature = "trace")] | 25 | #[cfg(feature = "_any_trace")] |
| 20 | pub mod trace; | 26 | pub mod trace; |
| 21 | pub(crate) mod util; | 27 | pub(crate) mod util; |
| 22 | #[cfg_attr(feature = "turbowakers", path = "waker_turbo.rs")] | 28 | #[cfg_attr(feature = "turbowakers", path = "waker_turbo.rs")] |
| @@ -41,6 +47,7 @@ use self::state::State; | |||
| 41 | use self::util::{SyncUnsafeCell, UninitCell}; | 47 | use self::util::{SyncUnsafeCell, UninitCell}; |
| 42 | pub use self::waker::task_from_waker; | 48 | pub use self::waker::task_from_waker; |
| 43 | use super::SpawnToken; | 49 | use super::SpawnToken; |
| 50 | use crate::{Metadata, SpawnError}; | ||
| 44 | 51 | ||
| 45 | #[no_mangle] | 52 | #[no_mangle] |
| 46 | extern "Rust" fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static mut TimerQueueItem { | 53 | extern "Rust" fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static mut TimerQueueItem { |
| @@ -94,11 +101,10 @@ pub(crate) struct TaskHeader { | |||
| 94 | 101 | ||
| 95 | /// Integrated timer queue storage. This field should not be accessed outside of the timer queue. | 102 | /// Integrated timer queue storage. This field should not be accessed outside of the timer queue. |
| 96 | pub(crate) timer_queue_item: TimerQueueItem, | 103 | pub(crate) timer_queue_item: TimerQueueItem, |
| 97 | #[cfg(feature = "trace")] | 104 | |
| 98 | pub(crate) name: Option<&'static str>, | 105 | pub(crate) metadata: Metadata, |
| 99 | #[cfg(feature = "trace")] | 106 | |
| 100 | pub(crate) id: u32, | 107 | #[cfg(feature = "rtos-trace")] |
| 101 | #[cfg(feature = "trace")] | ||
| 102 | all_tasks_next: AtomicPtr<TaskHeader>, | 108 | all_tasks_next: AtomicPtr<TaskHeader>, |
| 103 | } | 109 | } |
| 104 | 110 | ||
| @@ -129,6 +135,10 @@ impl TaskRef { | |||
| 129 | unsafe { self.ptr.as_ref() } | 135 | unsafe { self.ptr.as_ref() } |
| 130 | } | 136 | } |
| 131 | 137 | ||
| 138 | pub(crate) fn metadata(self) -> &'static Metadata { | ||
| 139 | unsafe { &self.ptr.as_ref().metadata } | ||
| 140 | } | ||
| 141 | |||
| 132 | /// Returns a reference to the executor that the task is currently running on. | 142 | /// Returns a reference to the executor that the task is currently running on. |
| 133 | pub unsafe fn executor(self) -> Option<&'static Executor> { | 143 | pub unsafe fn executor(self) -> Option<&'static Executor> { |
| 134 | let executor = self.header().executor.load(Ordering::Relaxed); | 144 | let executor = self.header().executor.load(Ordering::Relaxed); |
| @@ -148,6 +158,12 @@ impl TaskRef { | |||
| 148 | pub(crate) fn as_ptr(self) -> *const TaskHeader { | 158 | pub(crate) fn as_ptr(self) -> *const TaskHeader { |
| 149 | self.ptr.as_ptr() | 159 | self.ptr.as_ptr() |
| 150 | } | 160 | } |
| 161 | |||
| 162 | /// Returns the task ID. | ||
| 163 | /// This can be used in combination with rtos-trace to match task names with IDs | ||
| 164 | pub fn id(&self) -> u32 { | ||
| 165 | self.as_ptr() as u32 | ||
| 166 | } | ||
| 151 | } | 167 | } |
| 152 | 168 | ||
| 153 | /// Raw storage in which a task can be spawned. | 169 | /// Raw storage in which a task can be spawned. |
| @@ -189,11 +205,8 @@ impl<F: Future + 'static> TaskStorage<F> { | |||
| 189 | poll_fn: SyncUnsafeCell::new(None), | 205 | poll_fn: SyncUnsafeCell::new(None), |
| 190 | 206 | ||
| 191 | timer_queue_item: TimerQueueItem::new(), | 207 | timer_queue_item: TimerQueueItem::new(), |
| 192 | #[cfg(feature = "trace")] | 208 | metadata: Metadata::new(), |
| 193 | name: None, | 209 | #[cfg(feature = "rtos-trace")] |
| 194 | #[cfg(feature = "trace")] | ||
| 195 | id: 0, | ||
| 196 | #[cfg(feature = "trace")] | ||
| 197 | all_tasks_next: AtomicPtr::new(core::ptr::null_mut()), | 210 | all_tasks_next: AtomicPtr::new(core::ptr::null_mut()), |
| 198 | }, | 211 | }, |
| 199 | future: UninitCell::uninit(), | 212 | future: UninitCell::uninit(), |
| @@ -213,11 +226,11 @@ impl<F: Future + 'static> TaskStorage<F> { | |||
| 213 | /// | 226 | /// |
| 214 | /// Once the task has finished running, you may spawn it again. It is allowed to spawn it | 227 | /// Once the task has finished running, you may spawn it again. It is allowed to spawn it |
| 215 | /// on a different executor. | 228 | /// on a different executor. |
| 216 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> SpawnToken<impl Sized> { | 229 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<impl Sized>, SpawnError> { |
| 217 | let task = AvailableTask::claim(self); | 230 | let task = AvailableTask::claim(self); |
| 218 | match task { | 231 | match task { |
| 219 | Some(task) => task.initialize(future), | 232 | Some(task) => Ok(task.initialize(future)), |
| 220 | None => SpawnToken::new_failed(), | 233 | None => Err(SpawnError::Busy), |
| 221 | } | 234 | } |
| 222 | } | 235 | } |
| 223 | 236 | ||
| @@ -229,7 +242,7 @@ impl<F: Future + 'static> TaskStorage<F> { | |||
| 229 | let mut cx = Context::from_waker(&waker); | 242 | let mut cx = Context::from_waker(&waker); |
| 230 | match future.poll(&mut cx) { | 243 | match future.poll(&mut cx) { |
| 231 | Poll::Ready(_) => { | 244 | Poll::Ready(_) => { |
| 232 | #[cfg(feature = "trace")] | 245 | #[cfg(feature = "_any_trace")] |
| 233 | let exec_ptr: *const SyncExecutor = this.raw.executor.load(Ordering::Relaxed); | 246 | let exec_ptr: *const SyncExecutor = this.raw.executor.load(Ordering::Relaxed); |
| 234 | 247 | ||
| 235 | // As the future has finished and this function will not be called | 248 | // As the future has finished and this function will not be called |
| @@ -244,7 +257,7 @@ impl<F: Future + 'static> TaskStorage<F> { | |||
| 244 | // after we're done with it. | 257 | // after we're done with it. |
| 245 | this.raw.state.despawn(); | 258 | this.raw.state.despawn(); |
| 246 | 259 | ||
| 247 | #[cfg(feature = "trace")] | 260 | #[cfg(feature = "_any_trace")] |
| 248 | trace::task_end(exec_ptr, &p); | 261 | trace::task_end(exec_ptr, &p); |
| 249 | } | 262 | } |
| 250 | Poll::Pending => {} | 263 | Poll::Pending => {} |
| @@ -279,6 +292,7 @@ impl<F: Future + 'static> AvailableTask<F> { | |||
| 279 | 292 | ||
| 280 | fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> { | 293 | fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> { |
| 281 | unsafe { | 294 | unsafe { |
| 295 | self.task.raw.metadata.reset(); | ||
| 282 | self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll)); | 296 | self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll)); |
| 283 | self.task.future.write_in_place(future); | 297 | self.task.future.write_in_place(future); |
| 284 | 298 | ||
| @@ -345,10 +359,10 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> { | |||
| 345 | } | 359 | } |
| 346 | } | 360 | } |
| 347 | 361 | ||
| 348 | fn spawn_impl<T>(&'static self, future: impl FnOnce() -> F) -> SpawnToken<T> { | 362 | fn spawn_impl<T>(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<T>, SpawnError> { |
| 349 | match self.pool.iter().find_map(AvailableTask::claim) { | 363 | match self.pool.iter().find_map(AvailableTask::claim) { |
| 350 | Some(task) => task.initialize_impl::<T>(future), | 364 | Some(task) => Ok(task.initialize_impl::<T>(future)), |
| 351 | None => SpawnToken::new_failed(), | 365 | None => Err(SpawnError::Busy), |
| 352 | } | 366 | } |
| 353 | } | 367 | } |
| 354 | 368 | ||
| @@ -359,7 +373,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> { | |||
| 359 | /// This will loop over the pool and spawn the task in the first storage that | 373 | /// This will loop over the pool and spawn the task in the first storage that |
| 360 | /// is currently free. If none is free, a "poisoned" SpawnToken is returned, | 374 | /// is currently free. If none is free, a "poisoned" SpawnToken is returned, |
| 361 | /// which will cause [`Spawner::spawn()`](super::Spawner::spawn) to return the error. | 375 | /// which will cause [`Spawner::spawn()`](super::Spawner::spawn) to return the error. |
| 362 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> SpawnToken<impl Sized> { | 376 | pub fn spawn(&'static self, future: impl FnOnce() -> F) -> Result<SpawnToken<impl Sized>, SpawnError> { |
| 363 | self.spawn_impl::<F>(future) | 377 | self.spawn_impl::<F>(future) |
| 364 | } | 378 | } |
| 365 | 379 | ||
| @@ -372,7 +386,7 @@ impl<F: Future + 'static, const N: usize> TaskPool<F, N> { | |||
| 372 | /// SAFETY: `future` must be a closure of the form `move || my_async_fn(args)`, where `my_async_fn` | 386 | /// SAFETY: `future` must be a closure of the form `move || my_async_fn(args)`, where `my_async_fn` |
| 373 | /// is an `async fn`, NOT a hand-written `Future`. | 387 | /// is an `async fn`, NOT a hand-written `Future`. |
| 374 | #[doc(hidden)] | 388 | #[doc(hidden)] |
| 375 | pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> SpawnToken<impl Sized> | 389 | pub unsafe fn _spawn_async_fn<FutFn>(&'static self, future: FutFn) -> Result<SpawnToken<impl Sized>, SpawnError> |
| 376 | where | 390 | where |
| 377 | FutFn: FnOnce() -> F, | 391 | FutFn: FnOnce() -> F, |
| 378 | { | 392 | { |
| @@ -417,7 +431,7 @@ impl SyncExecutor { | |||
| 417 | /// - `task` must NOT be already enqueued (in this executor or another one). | 431 | /// - `task` must NOT be already enqueued (in this executor or another one). |
| 418 | #[inline(always)] | 432 | #[inline(always)] |
| 419 | unsafe fn enqueue(&self, task: TaskRef, l: state::Token) { | 433 | unsafe fn enqueue(&self, task: TaskRef, l: state::Token) { |
| 420 | #[cfg(feature = "trace")] | 434 | #[cfg(feature = "_any_trace")] |
| 421 | trace::task_ready_begin(self, &task); | 435 | trace::task_ready_begin(self, &task); |
| 422 | 436 | ||
| 423 | if self.run_queue.enqueue(task, l) { | 437 | if self.run_queue.enqueue(task, l) { |
| @@ -430,7 +444,7 @@ impl SyncExecutor { | |||
| 430 | .executor | 444 | .executor |
| 431 | .store((self as *const Self).cast_mut(), Ordering::Relaxed); | 445 | .store((self as *const Self).cast_mut(), Ordering::Relaxed); |
| 432 | 446 | ||
| 433 | #[cfg(feature = "trace")] | 447 | #[cfg(feature = "_any_trace")] |
| 434 | trace::task_new(self, &task); | 448 | trace::task_new(self, &task); |
| 435 | 449 | ||
| 436 | state::locked(|l| { | 450 | state::locked(|l| { |
| @@ -442,23 +456,23 @@ impl SyncExecutor { | |||
| 442 | /// | 456 | /// |
| 443 | /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created. | 457 | /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created. |
| 444 | pub(crate) unsafe fn poll(&'static self) { | 458 | pub(crate) unsafe fn poll(&'static self) { |
| 445 | #[cfg(feature = "trace")] | 459 | #[cfg(feature = "_any_trace")] |
| 446 | trace::poll_start(self); | 460 | trace::poll_start(self); |
| 447 | 461 | ||
| 448 | self.run_queue.dequeue_all(|p| { | 462 | self.run_queue.dequeue_all(|p| { |
| 449 | let task = p.header(); | 463 | let task = p.header(); |
| 450 | 464 | ||
| 451 | #[cfg(feature = "trace")] | 465 | #[cfg(feature = "_any_trace")] |
| 452 | trace::task_exec_begin(self, &p); | 466 | trace::task_exec_begin(self, &p); |
| 453 | 467 | ||
| 454 | // Run the task | 468 | // Run the task |
| 455 | task.poll_fn.get().unwrap_unchecked()(p); | 469 | task.poll_fn.get().unwrap_unchecked()(p); |
| 456 | 470 | ||
| 457 | #[cfg(feature = "trace")] | 471 | #[cfg(feature = "_any_trace")] |
| 458 | trace::task_exec_end(self, &p); | 472 | trace::task_exec_end(self, &p); |
| 459 | }); | 473 | }); |
| 460 | 474 | ||
| 461 | #[cfg(feature = "trace")] | 475 | #[cfg(feature = "_any_trace")] |
| 462 | trace::executor_idle(self) | 476 | trace::executor_idle(self) |
| 463 | } | 477 | } |
| 464 | } | 478 | } |
diff --git a/embassy-executor/src/raw/state_atomics.rs b/embassy-executor/src/raw/state_atomics.rs index e813548ae..6675875be 100644 --- a/embassy-executor/src/raw/state_atomics.rs +++ b/embassy-executor/src/raw/state_atomics.rs | |||
| @@ -1,4 +1,15 @@ | |||
| 1 | use core::sync::atomic::{AtomicU8, Ordering}; | 1 | // Prefer pointer-width atomic operations, as narrower ones may be slower. |
| 2 | #[cfg(all(target_pointer_width = "32", target_has_atomic = "32"))] | ||
| 3 | type AtomicState = core::sync::atomic::AtomicU32; | ||
| 4 | #[cfg(not(all(target_pointer_width = "32", target_has_atomic = "32")))] | ||
| 5 | type AtomicState = core::sync::atomic::AtomicU8; | ||
| 6 | |||
| 7 | #[cfg(all(target_pointer_width = "32", target_has_atomic = "32"))] | ||
| 8 | type StateBits = u32; | ||
| 9 | #[cfg(not(all(target_pointer_width = "32", target_has_atomic = "32")))] | ||
| 10 | type StateBits = u8; | ||
| 11 | |||
| 12 | use core::sync::atomic::Ordering; | ||
| 2 | 13 | ||
| 3 | #[derive(Clone, Copy)] | 14 | #[derive(Clone, Copy)] |
| 4 | pub(crate) struct Token(()); | 15 | pub(crate) struct Token(()); |
| @@ -11,18 +22,18 @@ pub(crate) fn locked<R>(f: impl FnOnce(Token) -> R) -> R { | |||
| 11 | } | 22 | } |
| 12 | 23 | ||
| 13 | /// Task is spawned (has a future) | 24 | /// Task is spawned (has a future) |
| 14 | pub(crate) const STATE_SPAWNED: u8 = 1 << 0; | 25 | pub(crate) const STATE_SPAWNED: StateBits = 1 << 0; |
| 15 | /// Task is in the executor run queue | 26 | /// Task is in the executor run queue |
| 16 | pub(crate) const STATE_RUN_QUEUED: u8 = 1 << 1; | 27 | pub(crate) const STATE_RUN_QUEUED: StateBits = 1 << 1; |
| 17 | 28 | ||
| 18 | pub(crate) struct State { | 29 | pub(crate) struct State { |
| 19 | state: AtomicU8, | 30 | state: AtomicState, |
| 20 | } | 31 | } |
| 21 | 32 | ||
| 22 | impl State { | 33 | impl State { |
| 23 | pub const fn new() -> State { | 34 | pub const fn new() -> State { |
| 24 | Self { | 35 | Self { |
| 25 | state: AtomicU8::new(0), | 36 | state: AtomicState::new(0), |
| 26 | } | 37 | } |
| 27 | } | 38 | } |
| 28 | 39 | ||
diff --git a/embassy-executor/src/raw/state_critical_section.rs b/embassy-executor/src/raw/state_critical_section.rs index ec08f2f58..b69a6ac66 100644 --- a/embassy-executor/src/raw/state_critical_section.rs +++ b/embassy-executor/src/raw/state_critical_section.rs | |||
| @@ -3,13 +3,18 @@ use core::cell::Cell; | |||
| 3 | pub(crate) use critical_section::{with as locked, CriticalSection as Token}; | 3 | pub(crate) use critical_section::{with as locked, CriticalSection as Token}; |
| 4 | use critical_section::{CriticalSection, Mutex}; | 4 | use critical_section::{CriticalSection, Mutex}; |
| 5 | 5 | ||
| 6 | #[cfg(target_arch = "avr")] | ||
| 7 | type StateBits = u8; | ||
| 8 | #[cfg(not(target_arch = "avr"))] | ||
| 9 | type StateBits = usize; | ||
| 10 | |||
| 6 | /// Task is spawned (has a future) | 11 | /// Task is spawned (has a future) |
| 7 | pub(crate) const STATE_SPAWNED: u8 = 1 << 0; | 12 | pub(crate) const STATE_SPAWNED: StateBits = 1 << 0; |
| 8 | /// Task is in the executor run queue | 13 | /// Task is in the executor run queue |
| 9 | pub(crate) const STATE_RUN_QUEUED: u8 = 1 << 1; | 14 | pub(crate) const STATE_RUN_QUEUED: StateBits = 1 << 1; |
| 10 | 15 | ||
| 11 | pub(crate) struct State { | 16 | pub(crate) struct State { |
| 12 | state: Mutex<Cell<u8>>, | 17 | state: Mutex<Cell<StateBits>>, |
| 13 | } | 18 | } |
| 14 | 19 | ||
| 15 | impl State { | 20 | impl State { |
| @@ -19,11 +24,11 @@ impl State { | |||
| 19 | } | 24 | } |
| 20 | } | 25 | } |
| 21 | 26 | ||
| 22 | fn update<R>(&self, f: impl FnOnce(&mut u8) -> R) -> R { | 27 | fn update<R>(&self, f: impl FnOnce(&mut StateBits) -> R) -> R { |
| 23 | critical_section::with(|cs| self.update_with_cs(cs, f)) | 28 | critical_section::with(|cs| self.update_with_cs(cs, f)) |
| 24 | } | 29 | } |
| 25 | 30 | ||
| 26 | fn update_with_cs<R>(&self, cs: CriticalSection<'_>, f: impl FnOnce(&mut u8) -> R) -> R { | 31 | fn update_with_cs<R>(&self, cs: CriticalSection<'_>, f: impl FnOnce(&mut StateBits) -> R) -> R { |
| 27 | let s = self.state.borrow(cs); | 32 | let s = self.state.borrow(cs); |
| 28 | let mut val = s.get(); | 33 | let mut val = s.get(); |
| 29 | let r = f(&mut val); | 34 | let r = f(&mut val); |
diff --git a/embassy-executor/src/raw/trace.rs b/embassy-executor/src/raw/trace.rs index f484abf58..b3086948c 100644 --- a/embassy-executor/src/raw/trace.rs +++ b/embassy-executor/src/raw/trace.rs | |||
| @@ -95,17 +95,20 @@ use crate::spawner::{SpawnError, SpawnToken, Spawner}; | |||
| 95 | /// This static provides access to the global task tracker which maintains | 95 | /// This static provides access to the global task tracker which maintains |
| 96 | /// a list of all tasks in the system. It's automatically updated by the | 96 | /// a list of all tasks in the system. It's automatically updated by the |
| 97 | /// task lifecycle hooks in the trace module. | 97 | /// task lifecycle hooks in the trace module. |
| 98 | pub static TASK_TRACKER: TaskTracker = TaskTracker::new(); | 98 | #[cfg(feature = "rtos-trace")] |
| 99 | pub(crate) static TASK_TRACKER: TaskTracker = TaskTracker::new(); | ||
| 99 | 100 | ||
| 100 | /// A thread-safe tracker for all tasks in the system | 101 | /// A thread-safe tracker for all tasks in the system |
| 101 | /// | 102 | /// |
| 102 | /// This struct uses an intrusive linked list approach to track all tasks | 103 | /// This struct uses an intrusive linked list approach to track all tasks |
| 103 | /// without additional memory allocations. It maintains a global list of | 104 | /// without additional memory allocations. It maintains a global list of |
| 104 | /// tasks that can be traversed to find all currently existing tasks. | 105 | /// tasks that can be traversed to find all currently existing tasks. |
| 105 | pub struct TaskTracker { | 106 | #[cfg(feature = "rtos-trace")] |
| 107 | pub(crate) struct TaskTracker { | ||
| 106 | head: AtomicPtr<TaskHeader>, | 108 | head: AtomicPtr<TaskHeader>, |
| 107 | } | 109 | } |
| 108 | 110 | ||
| 111 | #[cfg(feature = "rtos-trace")] | ||
| 109 | impl TaskTracker { | 112 | impl TaskTracker { |
| 110 | /// Creates a new empty task tracker | 113 | /// Creates a new empty task tracker |
| 111 | /// | 114 | /// |
| @@ -125,7 +128,7 @@ impl TaskTracker { | |||
| 125 | /// # Arguments | 128 | /// # Arguments |
| 126 | /// * `task` - The task reference to add to the tracker | 129 | /// * `task` - The task reference to add to the tracker |
| 127 | pub fn add(&self, task: TaskRef) { | 130 | pub fn add(&self, task: TaskRef) { |
| 128 | let task_ptr = task.as_ptr() as *mut TaskHeader; | 131 | let task_ptr = task.as_ptr(); |
| 129 | 132 | ||
| 130 | loop { | 133 | loop { |
| 131 | let current_head = self.head.load(Ordering::Acquire); | 134 | let current_head = self.head.load(Ordering::Acquire); |
| @@ -135,7 +138,7 @@ impl TaskTracker { | |||
| 135 | 138 | ||
| 136 | if self | 139 | if self |
| 137 | .head | 140 | .head |
| 138 | .compare_exchange(current_head, task_ptr, Ordering::Release, Ordering::Relaxed) | 141 | .compare_exchange(current_head, task_ptr.cast_mut(), Ordering::Release, Ordering::Relaxed) |
| 139 | .is_ok() | 142 | .is_ok() |
| 140 | { | 143 | { |
| 141 | break; | 144 | break; |
| @@ -165,50 +168,7 @@ impl TaskTracker { | |||
| 165 | } | 168 | } |
| 166 | } | 169 | } |
| 167 | 170 | ||
| 168 | /// Extension trait for `TaskRef` that provides tracing functionality. | 171 | #[cfg(feature = "trace")] |
| 169 | /// | ||
| 170 | /// This trait is only available when the `trace` feature is enabled. | ||
| 171 | /// It extends `TaskRef` with methods for accessing and modifying task identifiers | ||
| 172 | /// and names, which are useful for debugging, logging, and performance analysis. | ||
| 173 | pub trait TaskRefTrace { | ||
| 174 | /// Get the name for a task | ||
| 175 | fn name(&self) -> Option<&'static str>; | ||
| 176 | |||
| 177 | /// Set the name for a task | ||
| 178 | fn set_name(&self, name: Option<&'static str>); | ||
| 179 | |||
| 180 | /// Get the ID for a task | ||
| 181 | fn id(&self) -> u32; | ||
| 182 | |||
| 183 | /// Set the ID for a task | ||
| 184 | fn set_id(&self, id: u32); | ||
| 185 | } | ||
| 186 | |||
| 187 | impl TaskRefTrace for TaskRef { | ||
| 188 | fn name(&self) -> Option<&'static str> { | ||
| 189 | self.header().name | ||
| 190 | } | ||
| 191 | |||
| 192 | fn set_name(&self, name: Option<&'static str>) { | ||
| 193 | unsafe { | ||
| 194 | let header_ptr = self.ptr.as_ptr() as *mut TaskHeader; | ||
| 195 | (*header_ptr).name = name; | ||
| 196 | } | ||
| 197 | } | ||
| 198 | |||
| 199 | fn id(&self) -> u32 { | ||
| 200 | self.header().id | ||
| 201 | } | ||
| 202 | |||
| 203 | fn set_id(&self, id: u32) { | ||
| 204 | unsafe { | ||
| 205 | let header_ptr = self.ptr.as_ptr() as *mut TaskHeader; | ||
| 206 | (*header_ptr).id = id; | ||
| 207 | } | ||
| 208 | } | ||
| 209 | } | ||
| 210 | |||
| 211 | #[cfg(not(feature = "rtos-trace"))] | ||
| 212 | extern "Rust" { | 172 | extern "Rust" { |
| 213 | /// This callback is called when the executor begins polling. This will always | 173 | /// This callback is called when the executor begins polling. This will always |
| 214 | /// be paired with a later call to `_embassy_trace_executor_idle`. | 174 | /// be paired with a later call to `_embassy_trace_executor_idle`. |
| @@ -270,7 +230,7 @@ extern "Rust" { | |||
| 270 | 230 | ||
| 271 | #[inline] | 231 | #[inline] |
| 272 | pub(crate) fn poll_start(executor: &SyncExecutor) { | 232 | pub(crate) fn poll_start(executor: &SyncExecutor) { |
| 273 | #[cfg(not(feature = "rtos-trace"))] | 233 | #[cfg(feature = "trace")] |
| 274 | unsafe { | 234 | unsafe { |
| 275 | _embassy_trace_poll_start(executor as *const _ as u32) | 235 | _embassy_trace_poll_start(executor as *const _ as u32) |
| 276 | } | 236 | } |
| @@ -278,7 +238,7 @@ pub(crate) fn poll_start(executor: &SyncExecutor) { | |||
| 278 | 238 | ||
| 279 | #[inline] | 239 | #[inline] |
| 280 | pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) { | 240 | pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) { |
| 281 | #[cfg(not(feature = "rtos-trace"))] | 241 | #[cfg(feature = "trace")] |
| 282 | unsafe { | 242 | unsafe { |
| 283 | _embassy_trace_task_new(executor as *const _ as u32, task.as_ptr() as u32) | 243 | _embassy_trace_task_new(executor as *const _ as u32, task.as_ptr() as u32) |
| 284 | } | 244 | } |
| @@ -286,7 +246,7 @@ pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) { | |||
| 286 | #[cfg(feature = "rtos-trace")] | 246 | #[cfg(feature = "rtos-trace")] |
| 287 | { | 247 | { |
| 288 | rtos_trace::trace::task_new(task.as_ptr() as u32); | 248 | rtos_trace::trace::task_new(task.as_ptr() as u32); |
| 289 | let name = task.name().unwrap_or("unnamed task\0"); | 249 | let name = task.metadata().name().unwrap_or("unnamed task\0"); |
| 290 | let info = rtos_trace::TaskInfo { | 250 | let info = rtos_trace::TaskInfo { |
| 291 | name, | 251 | name, |
| 292 | priority: 0, | 252 | priority: 0, |
| @@ -302,7 +262,7 @@ pub(crate) fn task_new(executor: &SyncExecutor, task: &TaskRef) { | |||
| 302 | 262 | ||
| 303 | #[inline] | 263 | #[inline] |
| 304 | pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) { | 264 | pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) { |
| 305 | #[cfg(not(feature = "rtos-trace"))] | 265 | #[cfg(feature = "trace")] |
| 306 | unsafe { | 266 | unsafe { |
| 307 | _embassy_trace_task_end(executor as u32, task.as_ptr() as u32) | 267 | _embassy_trace_task_end(executor as u32, task.as_ptr() as u32) |
| 308 | } | 268 | } |
| @@ -310,7 +270,7 @@ pub(crate) fn task_end(executor: *const SyncExecutor, task: &TaskRef) { | |||
| 310 | 270 | ||
| 311 | #[inline] | 271 | #[inline] |
| 312 | pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) { | 272 | pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) { |
| 313 | #[cfg(not(feature = "rtos-trace"))] | 273 | #[cfg(feature = "trace")] |
| 314 | unsafe { | 274 | unsafe { |
| 315 | _embassy_trace_task_ready_begin(executor as *const _ as u32, task.as_ptr() as u32) | 275 | _embassy_trace_task_ready_begin(executor as *const _ as u32, task.as_ptr() as u32) |
| 316 | } | 276 | } |
| @@ -320,7 +280,7 @@ pub(crate) fn task_ready_begin(executor: &SyncExecutor, task: &TaskRef) { | |||
| 320 | 280 | ||
| 321 | #[inline] | 281 | #[inline] |
| 322 | pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) { | 282 | pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) { |
| 323 | #[cfg(not(feature = "rtos-trace"))] | 283 | #[cfg(feature = "trace")] |
| 324 | unsafe { | 284 | unsafe { |
| 325 | _embassy_trace_task_exec_begin(executor as *const _ as u32, task.as_ptr() as u32) | 285 | _embassy_trace_task_exec_begin(executor as *const _ as u32, task.as_ptr() as u32) |
| 326 | } | 286 | } |
| @@ -330,7 +290,7 @@ pub(crate) fn task_exec_begin(executor: &SyncExecutor, task: &TaskRef) { | |||
| 330 | 290 | ||
| 331 | #[inline] | 291 | #[inline] |
| 332 | pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) { | 292 | pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) { |
| 333 | #[cfg(not(feature = "rtos-trace"))] | 293 | #[cfg(feature = "trace")] |
| 334 | unsafe { | 294 | unsafe { |
| 335 | _embassy_trace_task_exec_end(executor as *const _ as u32, task.as_ptr() as u32) | 295 | _embassy_trace_task_exec_end(executor as *const _ as u32, task.as_ptr() as u32) |
| 336 | } | 296 | } |
| @@ -340,7 +300,7 @@ pub(crate) fn task_exec_end(executor: &SyncExecutor, task: &TaskRef) { | |||
| 340 | 300 | ||
| 341 | #[inline] | 301 | #[inline] |
| 342 | pub(crate) fn executor_idle(executor: &SyncExecutor) { | 302 | pub(crate) fn executor_idle(executor: &SyncExecutor) { |
| 343 | #[cfg(not(feature = "rtos-trace"))] | 303 | #[cfg(feature = "trace")] |
| 344 | unsafe { | 304 | unsafe { |
| 345 | _embassy_trace_executor_idle(executor as *const _ as u32) | 305 | _embassy_trace_executor_idle(executor as *const _ as u32) |
| 346 | } | 306 | } |
| @@ -356,6 +316,7 @@ pub(crate) fn executor_idle(executor: &SyncExecutor) { | |||
| 356 | /// | 316 | /// |
| 357 | /// # Returns | 317 | /// # Returns |
| 358 | /// An iterator that yields `TaskRef` items for each task | 318 | /// An iterator that yields `TaskRef` items for each task |
| 319 | #[cfg(feature = "rtos-trace")] | ||
| 359 | fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static { | 320 | fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static { |
| 360 | struct TaskIterator<'a> { | 321 | struct TaskIterator<'a> { |
| 361 | tracker: &'a TaskTracker, | 322 | tracker: &'a TaskTracker, |
| @@ -384,6 +345,7 @@ fn get_all_active_tasks() -> impl Iterator<Item = TaskRef> + 'static { | |||
| 384 | } | 345 | } |
| 385 | 346 | ||
| 386 | /// Perform an action on each active task | 347 | /// Perform an action on each active task |
| 348 | #[cfg(feature = "rtos-trace")] | ||
| 387 | fn with_all_active_tasks<F>(f: F) | 349 | fn with_all_active_tasks<F>(f: F) |
| 388 | where | 350 | where |
| 389 | F: FnMut(TaskRef), | 351 | F: FnMut(TaskRef), |
| @@ -395,9 +357,8 @@ where | |||
| 395 | impl rtos_trace::RtosTraceOSCallbacks for crate::raw::SyncExecutor { | 357 | impl rtos_trace::RtosTraceOSCallbacks for crate::raw::SyncExecutor { |
| 396 | fn task_list() { | 358 | fn task_list() { |
| 397 | with_all_active_tasks(|task| { | 359 | with_all_active_tasks(|task| { |
| 398 | let name = task.name().unwrap_or("unnamed task\0"); | ||
| 399 | let info = rtos_trace::TaskInfo { | 360 | let info = rtos_trace::TaskInfo { |
| 400 | name, | 361 | name: task.metadata().name().unwrap_or("unnamed task\0"), |
| 401 | priority: 0, | 362 | priority: 0, |
| 402 | stack_base: 0, | 363 | stack_base: 0, |
| 403 | stack_size: 0, | 364 | stack_size: 0, |
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs index 2909d19a0..83d896b76 100644 --- a/embassy-executor/src/spawner.rs +++ b/embassy-executor/src/spawner.rs | |||
| @@ -5,8 +5,7 @@ use core::sync::atomic::Ordering; | |||
| 5 | use core::task::Poll; | 5 | use core::task::Poll; |
| 6 | 6 | ||
| 7 | use super::raw; | 7 | use super::raw; |
| 8 | #[cfg(feature = "trace")] | 8 | use crate::Metadata; |
| 9 | use crate::raw::trace::TaskRefTrace; | ||
| 10 | 9 | ||
| 11 | /// Token to spawn a newly-created task in an executor. | 10 | /// Token to spawn a newly-created task in an executor. |
| 12 | /// | 11 | /// |
| @@ -24,33 +23,28 @@ use crate::raw::trace::TaskRefTrace; | |||
| 24 | /// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it. | 23 | /// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it. |
| 25 | #[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"] | 24 | #[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"] |
| 26 | pub struct SpawnToken<S> { | 25 | pub struct SpawnToken<S> { |
| 27 | pub(crate) raw_task: Option<raw::TaskRef>, | 26 | pub(crate) raw_task: raw::TaskRef, |
| 28 | phantom: PhantomData<*mut S>, | 27 | phantom: PhantomData<*mut S>, |
| 29 | } | 28 | } |
| 30 | 29 | ||
| 31 | impl<S> SpawnToken<S> { | 30 | impl<S> SpawnToken<S> { |
| 32 | pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self { | 31 | pub(crate) unsafe fn new(raw_task: raw::TaskRef) -> Self { |
| 33 | Self { | 32 | Self { |
| 34 | raw_task: Some(raw_task), | 33 | raw_task, |
| 35 | phantom: PhantomData, | 34 | phantom: PhantomData, |
| 36 | } | 35 | } |
| 37 | } | 36 | } |
| 38 | 37 | ||
| 39 | /// Returns the task id if available, otherwise 0 | 38 | /// Returns the task ID. |
| 40 | /// This can be used in combination with rtos-trace to match task names with id's | 39 | /// This can be used in combination with rtos-trace to match task names with IDs |
| 41 | pub fn id(&self) -> u32 { | 40 | pub fn id(&self) -> u32 { |
| 42 | match self.raw_task { | 41 | self.raw_task.id() |
| 43 | None => 0, | ||
| 44 | Some(t) => t.as_ptr() as u32, | ||
| 45 | } | ||
| 46 | } | 42 | } |
| 47 | 43 | ||
| 48 | /// Return a SpawnToken that represents a failed spawn. | 44 | /// Get the metadata for this task. You can use this to set metadata fields |
| 49 | pub fn new_failed() -> Self { | 45 | /// prior to spawning it. |
| 50 | Self { | 46 | pub fn metadata(&self) -> &Metadata { |
| 51 | raw_task: None, | 47 | self.raw_task.metadata() |
| 52 | phantom: PhantomData, | ||
| 53 | } | ||
| 54 | } | 48 | } |
| 55 | } | 49 | } |
| 56 | 50 | ||
| @@ -159,30 +153,10 @@ impl Spawner { | |||
| 159 | /// Spawn a task into an executor. | 153 | /// Spawn a task into an executor. |
| 160 | /// | 154 | /// |
| 161 | /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). | 155 | /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). |
| 162 | pub fn spawn<S>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { | 156 | pub fn spawn<S>(&self, token: SpawnToken<S>) { |
| 163 | let task = token.raw_task; | 157 | let task = token.raw_task; |
| 164 | mem::forget(token); | 158 | mem::forget(token); |
| 165 | 159 | unsafe { self.executor.spawn(task) } | |
| 166 | match task { | ||
| 167 | Some(task) => { | ||
| 168 | unsafe { self.executor.spawn(task) }; | ||
| 169 | Ok(()) | ||
| 170 | } | ||
| 171 | None => Err(SpawnError::Busy), | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | // Used by the `embassy_executor_macros::main!` macro to throw an error when spawn | ||
| 176 | // fails. This is here to allow conditional use of `defmt::unwrap!` | ||
| 177 | // without introducing a `defmt` feature in the `embassy_executor_macros` package, | ||
| 178 | // which would require use of `-Z namespaced-features`. | ||
| 179 | /// Spawn a task into an executor, panicking on failure. | ||
| 180 | /// | ||
| 181 | /// # Panics | ||
| 182 | /// | ||
| 183 | /// Panics if the spawning fails. | ||
| 184 | pub fn must_spawn<S>(&self, token: SpawnToken<S>) { | ||
| 185 | unwrap!(self.spawn(token)); | ||
| 186 | } | 160 | } |
| 187 | 161 | ||
| 188 | /// Convert this Spawner to a SendSpawner. This allows you to send the | 162 | /// Convert this Spawner to a SendSpawner. This allows you to send the |
| @@ -198,53 +172,6 @@ impl Spawner { | |||
| 198 | } | 172 | } |
| 199 | } | 173 | } |
| 200 | 174 | ||
| 201 | /// Extension trait adding tracing capabilities to the Spawner | ||
| 202 | /// | ||
| 203 | /// This trait provides an additional method to spawn tasks with an associated name, | ||
| 204 | /// which can be useful for debugging and tracing purposes. | ||
| 205 | pub trait SpawnerTraceExt { | ||
| 206 | /// Spawns a new task with a specified name. | ||
| 207 | /// | ||
| 208 | /// # Arguments | ||
| 209 | /// * `name` - Static string name to associate with the task | ||
| 210 | /// * `token` - Token representing the task to spawn | ||
| 211 | /// | ||
| 212 | /// # Returns | ||
| 213 | /// Result indicating whether the spawn was successful | ||
| 214 | fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError>; | ||
| 215 | } | ||
| 216 | |||
| 217 | /// Implementation of the SpawnerTraceExt trait for Spawner when trace is enabled | ||
| 218 | #[cfg(feature = "trace")] | ||
| 219 | impl SpawnerTraceExt for Spawner { | ||
| 220 | fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> { | ||
| 221 | let task = token.raw_task; | ||
| 222 | core::mem::forget(token); | ||
| 223 | |||
| 224 | match task { | ||
| 225 | Some(task) => { | ||
| 226 | // Set the name and ID when trace is enabled | ||
| 227 | task.set_name(Some(name)); | ||
| 228 | let task_id = task.as_ptr() as u32; | ||
| 229 | task.set_id(task_id); | ||
| 230 | |||
| 231 | unsafe { self.executor.spawn(task) }; | ||
| 232 | Ok(()) | ||
| 233 | } | ||
| 234 | None => Err(SpawnError::Busy), | ||
| 235 | } | ||
| 236 | } | ||
| 237 | } | ||
| 238 | |||
| 239 | /// Implementation of the SpawnerTraceExt trait for Spawner when trace is disabled | ||
| 240 | #[cfg(not(feature = "trace"))] | ||
| 241 | impl SpawnerTraceExt for Spawner { | ||
| 242 | fn spawn_named<S>(&self, _name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> { | ||
| 243 | // When trace is disabled, just forward to regular spawn and ignore the name | ||
| 244 | self.spawn(token) | ||
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | /// Handle to spawn tasks into an executor from any thread. | 175 | /// Handle to spawn tasks into an executor from any thread. |
| 249 | /// | 176 | /// |
| 250 | /// This Spawner can be used from any thread (it is Send), but it can | 177 | /// This Spawner can be used from any thread (it is Send), but it can |
| @@ -287,25 +214,9 @@ impl SendSpawner { | |||
| 287 | /// Spawn a task into an executor. | 214 | /// Spawn a task into an executor. |
| 288 | /// | 215 | /// |
| 289 | /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). | 216 | /// You obtain the `token` by calling a task function (i.e. one marked with `#[embassy_executor::task]`). |
| 290 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) -> Result<(), SpawnError> { | 217 | pub fn spawn<S: Send>(&self, token: SpawnToken<S>) { |
| 291 | let header = token.raw_task; | 218 | let header = token.raw_task; |
| 292 | mem::forget(token); | 219 | mem::forget(token); |
| 293 | 220 | unsafe { self.executor.spawn(header) } | |
| 294 | match header { | ||
| 295 | Some(header) => { | ||
| 296 | unsafe { self.executor.spawn(header) }; | ||
| 297 | Ok(()) | ||
| 298 | } | ||
| 299 | None => Err(SpawnError::Busy), | ||
| 300 | } | ||
| 301 | } | ||
| 302 | |||
| 303 | /// Spawn a task into an executor, panicking on failure. | ||
| 304 | /// | ||
| 305 | /// # Panics | ||
| 306 | /// | ||
| 307 | /// Panics if the spawning fails. | ||
| 308 | pub fn must_spawn<S: Send>(&self, token: SpawnToken<S>) { | ||
| 309 | unwrap!(self.spawn(token)); | ||
| 310 | } | 221 | } |
| 311 | } | 222 | } |
diff --git a/embassy-executor/tests/test.rs b/embassy-executor/tests/test.rs index b84d3785a..6baf3dc21 100644 --- a/embassy-executor/tests/test.rs +++ b/embassy-executor/tests/test.rs | |||
| @@ -65,7 +65,7 @@ fn executor_task() { | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | let (executor, trace) = setup(); | 67 | let (executor, trace) = setup(); |
| 68 | executor.spawner().spawn(task1(trace.clone())).unwrap(); | 68 | executor.spawner().spawn(task1(trace.clone()).unwrap()); |
| 69 | 69 | ||
| 70 | unsafe { executor.poll() }; | 70 | unsafe { executor.poll() }; |
| 71 | unsafe { executor.poll() }; | 71 | unsafe { executor.poll() }; |
| @@ -93,7 +93,7 @@ fn executor_task_rpit() { | |||
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | let (executor, trace) = setup(); | 95 | let (executor, trace) = setup(); |
| 96 | executor.spawner().spawn(task1(trace.clone())).unwrap(); | 96 | executor.spawner().spawn(task1(trace.clone()).unwrap()); |
| 97 | 97 | ||
| 98 | unsafe { executor.poll() }; | 98 | unsafe { executor.poll() }; |
| 99 | unsafe { executor.poll() }; | 99 | unsafe { executor.poll() }; |
| @@ -120,7 +120,7 @@ fn executor_task_self_wake() { | |||
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | let (executor, trace) = setup(); | 122 | let (executor, trace) = setup(); |
| 123 | executor.spawner().spawn(task1(trace.clone())).unwrap(); | 123 | executor.spawner().spawn(task1(trace.clone()).unwrap()); |
| 124 | 124 | ||
| 125 | unsafe { executor.poll() }; | 125 | unsafe { executor.poll() }; |
| 126 | unsafe { executor.poll() }; | 126 | unsafe { executor.poll() }; |
| @@ -152,7 +152,7 @@ fn executor_task_self_wake_twice() { | |||
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | let (executor, trace) = setup(); | 154 | let (executor, trace) = setup(); |
| 155 | executor.spawner().spawn(task1(trace.clone())).unwrap(); | 155 | executor.spawner().spawn(task1(trace.clone()).unwrap()); |
| 156 | 156 | ||
| 157 | unsafe { executor.poll() }; | 157 | unsafe { executor.poll() }; |
| 158 | unsafe { executor.poll() }; | 158 | unsafe { executor.poll() }; |
| @@ -188,7 +188,7 @@ fn waking_after_completion_does_not_poll() { | |||
| 188 | let waker = Box::leak(Box::new(AtomicWaker::new())); | 188 | let waker = Box::leak(Box::new(AtomicWaker::new())); |
| 189 | 189 | ||
| 190 | let (executor, trace) = setup(); | 190 | let (executor, trace) = setup(); |
| 191 | executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); | 191 | executor.spawner().spawn(task1(trace.clone(), waker).unwrap()); |
| 192 | 192 | ||
| 193 | unsafe { executor.poll() }; | 193 | unsafe { executor.poll() }; |
| 194 | waker.wake(); | 194 | waker.wake(); |
| @@ -200,7 +200,7 @@ fn waking_after_completion_does_not_poll() { | |||
| 200 | unsafe { executor.poll() }; // Clears running status | 200 | unsafe { executor.poll() }; // Clears running status |
| 201 | 201 | ||
| 202 | // Can respawn waken-but-dead task | 202 | // Can respawn waken-but-dead task |
| 203 | executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); | 203 | executor.spawner().spawn(task1(trace.clone(), waker).unwrap()); |
| 204 | 204 | ||
| 205 | unsafe { executor.poll() }; | 205 | unsafe { executor.poll() }; |
| 206 | 206 | ||
| @@ -250,7 +250,7 @@ fn waking_with_old_waker_after_respawn() { | |||
| 250 | let waker = Box::leak(Box::new(AtomicWaker::new())); | 250 | let waker = Box::leak(Box::new(AtomicWaker::new())); |
| 251 | 251 | ||
| 252 | let (executor, trace) = setup(); | 252 | let (executor, trace) = setup(); |
| 253 | executor.spawner().spawn(task1(trace.clone(), waker)).unwrap(); | 253 | executor.spawner().spawn(task1(trace.clone(), waker).unwrap()); |
| 254 | 254 | ||
| 255 | unsafe { executor.poll() }; | 255 | unsafe { executor.poll() }; |
| 256 | unsafe { executor.poll() }; // progress to registering the waker | 256 | unsafe { executor.poll() }; // progress to registering the waker |
| @@ -273,8 +273,7 @@ fn waking_with_old_waker_after_respawn() { | |||
| 273 | let (other_executor, other_trace) = setup(); | 273 | let (other_executor, other_trace) = setup(); |
| 274 | other_executor | 274 | other_executor |
| 275 | .spawner() | 275 | .spawner() |
| 276 | .spawn(task1(other_trace.clone(), waker)) | 276 | .spawn(task1(other_trace.clone(), waker).unwrap()); |
| 277 | .unwrap(); | ||
| 278 | 277 | ||
| 279 | unsafe { other_executor.poll() }; // just run to the yield_now | 278 | unsafe { other_executor.poll() }; // just run to the yield_now |
| 280 | waker.wake(); // trigger old waker registration | 279 | waker.wake(); // trigger old waker registration |
| @@ -323,6 +322,37 @@ fn recursive_task() { | |||
| 323 | #[embassy_executor::task(pool_size = 2)] | 322 | #[embassy_executor::task(pool_size = 2)] |
| 324 | async fn task1() { | 323 | async fn task1() { |
| 325 | let spawner = unsafe { Spawner::for_current_executor().await }; | 324 | let spawner = unsafe { Spawner::for_current_executor().await }; |
| 326 | spawner.spawn(task1()); | 325 | spawner.spawn(task1().unwrap()); |
| 327 | } | 326 | } |
| 328 | } | 327 | } |
| 328 | |||
| 329 | #[cfg(feature = "metadata-name")] | ||
| 330 | #[test] | ||
| 331 | fn task_metadata() { | ||
| 332 | #[task] | ||
| 333 | async fn task1(expected_name: Option<&'static str>) { | ||
| 334 | use embassy_executor::Metadata; | ||
| 335 | assert_eq!(Metadata::for_current_task().await.name(), expected_name); | ||
| 336 | } | ||
| 337 | |||
| 338 | // check no task name | ||
| 339 | let (executor, _) = setup(); | ||
| 340 | executor.spawner().spawn(task1(None).unwrap()); | ||
| 341 | unsafe { executor.poll() }; | ||
| 342 | |||
| 343 | // check setting task name | ||
| 344 | let token = task1(Some("foo")).unwrap(); | ||
| 345 | token.metadata().set_name("foo"); | ||
| 346 | executor.spawner().spawn(token); | ||
| 347 | unsafe { executor.poll() }; | ||
| 348 | |||
| 349 | let token = task1(Some("bar")).unwrap(); | ||
| 350 | token.metadata().set_name("bar"); | ||
| 351 | executor.spawner().spawn(token); | ||
| 352 | unsafe { executor.poll() }; | ||
| 353 | |||
| 354 | // check name is cleared if the task pool slot is recycled. | ||
| 355 | let (executor, _) = setup(); | ||
| 356 | executor.spawner().spawn(task1(None).unwrap()); | ||
| 357 | unsafe { executor.poll() }; | ||
| 358 | } | ||
diff --git a/embassy-executor/tests/ui/return_impl_future_nonsend.rs b/embassy-executor/tests/ui/return_impl_future_nonsend.rs index b8c184b21..77b3119d6 100644 --- a/embassy-executor/tests/ui/return_impl_future_nonsend.rs +++ b/embassy-executor/tests/ui/return_impl_future_nonsend.rs | |||
| @@ -15,7 +15,7 @@ fn task() -> impl Future<Output = ()> { | |||
| 15 | } | 15 | } |
| 16 | 16 | ||
| 17 | fn send_spawn(s: SendSpawner) { | 17 | fn send_spawn(s: SendSpawner) { |
| 18 | s.spawn(task()).unwrap(); | 18 | s.spawn(task().unwrap()); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | fn main() {} | 21 | fn 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 @@ | |||
| 1 | error: future cannot be sent between threads safely | 1 | error: 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 | | |
| 4 | 18 | s.spawn(task()).unwrap(); | 4 | 18 | 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 ()` |
| 8 | note: captured value is not `Send` | 8 | note: captured value is not `Send` |
| @@ -13,5 +13,5 @@ note: captured value is not `Send` | |||
| 13 | note: required by a bound in `SendSpawner::spawn` | 13 | note: 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 | ||
| 12 | fn send_spawn(s: SendSpawner) { | 12 | fn 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 | ||
| 16 | fn main() {} | 16 | fn 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 | |||
| 12 | 7 | #[embassy_executor::task] | 12 | 7 | #[embassy_executor::task] |
| 13 | | ------------------------- within this `impl Sized` | 13 | | ------------------------- within this `impl Sized` |
| 14 | ... | 14 | ... |
| 15 | 13 | s.spawn(task(core::ptr::null_mut())).unwrap(); | 15 | 13 | 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 | |||
| 26 | note: required because it appears within the type `impl Sized` | 26 | note: 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 | | ^^^^^^^^^^ |
| 31 | note: required because it appears within the type `impl Sized` | 31 | note: 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` | |||
| 36 | note: required by a bound in `SendSpawner::spawn` | 36 | note: 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-nrf/CHANGELOG.md b/embassy-nrf/CHANGELOG.md index 4e0887b0d..5dc941b25 100644 --- a/embassy-nrf/CHANGELOG.md +++ b/embassy-nrf/CHANGELOG.md | |||
| @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 8 | <!-- next-header --> | 8 | <!-- next-header --> |
| 9 | ## Unreleased - ReleaseDate | 9 | ## Unreleased - ReleaseDate |
| 10 | 10 | ||
| 11 | - changed: nrf54l: Disable glitch detection and enable DC/DC in init. | ||
| 12 | |||
| 11 | ## 0.7.0 - 2025-08-26 | 13 | ## 0.7.0 - 2025-08-26 |
| 12 | 14 | ||
| 13 | - bugfix: use correct analog input SAADC pins on nrf5340 | 15 | - bugfix: use correct analog input SAADC pins on nrf5340 |
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index 2b72debeb..aa4801897 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs | |||
| @@ -707,6 +707,14 @@ pub fn init(config: config::Config) -> Peripherals { | |||
| 707 | } | 707 | } |
| 708 | } | 708 | } |
| 709 | 709 | ||
| 710 | // GLITCHDET is only accessible for secure code | ||
| 711 | #[cfg(all(feature = "_nrf54l", feature = "_s"))] | ||
| 712 | { | ||
| 713 | // The voltage glitch detectors are automatically enabled after reset. | ||
| 714 | // To save power, the glitch detectors must be disabled when not in use. | ||
| 715 | pac::GLITCHDET.config().write(|w| w.set_enable(false)); | ||
| 716 | } | ||
| 717 | |||
| 710 | // Setup debug protection. | 718 | // Setup debug protection. |
| 711 | #[cfg(not(feature = "_nrf51"))] | 719 | #[cfg(not(feature = "_nrf51"))] |
| 712 | match config.debug { | 720 | match config.debug { |
| @@ -1083,6 +1091,15 @@ pub fn init(config: config::Config) -> Peripherals { | |||
| 1083 | reg.vregradio().dcdcen().write(|w| w.set_dcdcen(true)); | 1091 | reg.vregradio().dcdcen().write(|w| w.set_dcdcen(true)); |
| 1084 | } | 1092 | } |
| 1085 | } | 1093 | } |
| 1094 | #[cfg(feature = "_nrf54l")] | ||
| 1095 | { | ||
| 1096 | // Turn on DCDC | ||
| 1097 | // From Product specification: | ||
| 1098 | // "Once the device starts, the DC/DC regulator must be enabled using register VREGMAIN.DCDCEN. | ||
| 1099 | // When enabling the DC/DC regulator, the device checks if an inductor is connected to the DCC pin. | ||
| 1100 | // If an inductor is not detected, the device remains in LDO mode" | ||
| 1101 | pac::REGULATORS.vregmain().dcdcen().write(|w| w.set_val(true)); | ||
| 1102 | } | ||
| 1086 | 1103 | ||
| 1087 | // Init GPIOTE | 1104 | // Init GPIOTE |
| 1088 | #[cfg(not(feature = "_nrf54l"))] // TODO | 1105 | #[cfg(not(feature = "_nrf54l"))] // TODO |
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/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index d8706ee39..4cc48ed97 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md | |||
| @@ -8,6 +8,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 8 | <!-- next-header --> | 8 | <!-- next-header --> |
| 9 | ## Unreleased - ReleaseDate | 9 | ## Unreleased - ReleaseDate |
| 10 | 10 | ||
| 11 | - fix: Fixed STM32H5 builds requiring time feature | ||
| 12 | - feat: Derive Clone, Copy for QSPI Config | ||
| 13 | - fix: stm32/i2c in master mode (blocking): subsequent transmissions failed after a NACK was received | ||
| 14 | - feat: stm32/timer: add set_polarity functions for main and complementary outputs in complementary_pwm | ||
| 15 | |||
| 11 | ## 0.4.0 - 2025-08-26 | 16 | ## 0.4.0 - 2025-08-26 |
| 12 | 17 | ||
| 13 | - feat: stm32/sai: make NODIV independent of MCKDIV | 18 | - feat: stm32/sai: make NODIV independent of MCKDIV |
| @@ -19,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 19 | - chore: Updated stm32-metapac and stm32-data dependencies | 24 | - chore: Updated stm32-metapac and stm32-data dependencies |
| 20 | - feat: stm32/adc/v3: allow DMA reads to loop through enable channels | 25 | - feat: stm32/adc/v3: allow DMA reads to loop through enable channels |
| 21 | - fix: Fix XSPI not disabling alternate bytes when they were previously enabled | 26 | - fix: Fix XSPI not disabling alternate bytes when they were previously enabled |
| 27 | - fix: Fix stm32h7rs init when using external flash via XSPI | ||
| 22 | 28 | ||
| 23 | ## 0.3.0 - 2025-08-12 | 29 | ## 0.3.0 - 2025-08-12 |
| 24 | 30 | ||
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs index 3b09f1b34..6b20a601b 100644 --- a/embassy-stm32/src/i2c/v2.rs +++ b/embassy-stm32/src/i2c/v2.rs | |||
| @@ -454,7 +454,8 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 454 | // (START has been ACKed or last byte when | 454 | // (START has been ACKed or last byte when |
| 455 | // through) | 455 | // through) |
| 456 | if let Err(err) = self.wait_txis(timeout) { | 456 | if let Err(err) = self.wait_txis(timeout) { |
| 457 | if send_stop { | 457 | if send_stop && err != Error::Nack { |
| 458 | // STOP is sent automatically if a NACK was received | ||
| 458 | self.master_stop(); | 459 | self.master_stop(); |
| 459 | } | 460 | } |
| 460 | return Err(err); | 461 | return Err(err); |
| @@ -548,7 +549,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 548 | (idx != last_slice_index) || (slice_len > 255), | 549 | (idx != last_slice_index) || (slice_len > 255), |
| 549 | timeout, | 550 | timeout, |
| 550 | ) { | 551 | ) { |
| 551 | self.master_stop(); | 552 | if err != Error::Nack { |
| 553 | self.master_stop(); | ||
| 554 | } | ||
| 552 | return Err(err); | 555 | return Err(err); |
| 553 | } | 556 | } |
| 554 | } | 557 | } |
| @@ -561,7 +564,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 561 | (number != last_chunk_idx) || (idx != last_slice_index), | 564 | (number != last_chunk_idx) || (idx != last_slice_index), |
| 562 | timeout, | 565 | timeout, |
| 563 | ) { | 566 | ) { |
| 564 | self.master_stop(); | 567 | if err != Error::Nack { |
| 568 | self.master_stop(); | ||
| 569 | } | ||
| 565 | return Err(err); | 570 | return Err(err); |
| 566 | } | 571 | } |
| 567 | } | 572 | } |
| @@ -571,7 +576,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 571 | // (START has been ACKed or last byte when | 576 | // (START has been ACKed or last byte when |
| 572 | // through) | 577 | // through) |
| 573 | if let Err(err) = self.wait_txis(timeout) { | 578 | if let Err(err) = self.wait_txis(timeout) { |
| 574 | self.master_stop(); | 579 | if err != Error::Nack { |
| 580 | self.master_stop(); | ||
| 581 | } | ||
| 575 | return Err(err); | 582 | return Err(err); |
| 576 | } | 583 | } |
| 577 | 584 | ||
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index e4a8ff0ab..3be98c462 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs | |||
| @@ -526,7 +526,7 @@ fn init_hw(config: Config) -> Peripherals { | |||
| 526 | } | 526 | } |
| 527 | }); | 527 | }); |
| 528 | 528 | ||
| 529 | #[cfg(not(any(stm32f1, stm32wb, stm32wl)))] | 529 | #[cfg(not(any(stm32f1, stm32wb, stm32wl, stm32h7rs)))] |
| 530 | rcc::enable_and_reset_with_cs::<peripherals::SYSCFG>(cs); | 530 | rcc::enable_and_reset_with_cs::<peripherals::SYSCFG>(cs); |
| 531 | #[cfg(not(any(stm32h5, stm32h7, stm32h7rs, stm32wb, stm32wl)))] | 531 | #[cfg(not(any(stm32h5, stm32h7, stm32h7rs, stm32wb, stm32wl)))] |
| 532 | rcc::enable_and_reset_with_cs::<peripherals::PWR>(cs); | 532 | rcc::enable_and_reset_with_cs::<peripherals::PWR>(cs); |
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/embassy-stm32/src/qspi/mod.rs b/embassy-stm32/src/qspi/mod.rs index 1e20d7cd3..c0cd216f0 100644 --- a/embassy-stm32/src/qspi/mod.rs +++ b/embassy-stm32/src/qspi/mod.rs | |||
| @@ -17,6 +17,7 @@ use crate::rcc::{self, RccPeripheral}; | |||
| 17 | use crate::{peripherals, Peri}; | 17 | use crate::{peripherals, Peri}; |
| 18 | 18 | ||
| 19 | /// QSPI transfer configuration. | 19 | /// QSPI transfer configuration. |
| 20 | #[derive(Clone, Copy)] | ||
| 20 | pub struct TransferConfig { | 21 | pub struct TransferConfig { |
| 21 | /// Instruction width (IMODE) | 22 | /// Instruction width (IMODE) |
| 22 | pub iwidth: QspiWidth, | 23 | pub iwidth: QspiWidth, |
| @@ -46,6 +47,7 @@ impl Default for TransferConfig { | |||
| 46 | } | 47 | } |
| 47 | 48 | ||
| 48 | /// QSPI driver configuration. | 49 | /// QSPI driver configuration. |
| 50 | #[derive(Clone, Copy)] | ||
| 49 | pub struct Config { | 51 | pub struct Config { |
| 50 | /// Flash memory size representend as 2^[0-32], as reasonable minimum 1KiB(9) was chosen. | 52 | /// Flash memory size representend as 2^[0-32], as reasonable minimum 1KiB(9) was chosen. |
| 51 | /// If you need other value the whose predefined use `Other` variant. | 53 | /// If you need other value the whose predefined use `Other` variant. |
diff --git a/embassy-stm32/src/rcc/h.rs b/embassy-stm32/src/rcc/h.rs index 837210b6a..331bab7a0 100644 --- a/embassy-stm32/src/rcc/h.rs +++ b/embassy-stm32/src/rcc/h.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | use core::ops::RangeInclusive; | 1 | use core::ops::RangeInclusive; |
| 2 | 2 | ||
| 3 | #[cfg(stm32h7rs)] | 3 | #[cfg(stm32h7rs)] |
| 4 | use stm32_metapac::rcc::vals::Plldivst; | 4 | use stm32_metapac::rcc::vals::{Plldivst, Xspisel}; |
| 5 | 5 | ||
| 6 | use crate::pac; | 6 | use crate::pac; |
| 7 | pub use crate::pac::rcc::vals::{ | 7 | pub use crate::pac::rcc::vals::{ |
| @@ -430,6 +430,13 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 430 | } | 430 | } |
| 431 | while !RCC.cr().read().hsirdy() {} | 431 | while !RCC.cr().read().hsirdy() {} |
| 432 | 432 | ||
| 433 | #[cfg(stm32h7rs)] | ||
| 434 | { | ||
| 435 | // Switch the XSPI clock source so it will use HSI | ||
| 436 | RCC.ahbperckselr().modify(|w| w.set_xspi1sel(Xspisel::HCLK5)); | ||
| 437 | RCC.ahbperckselr().modify(|w| w.set_xspi2sel(Xspisel::HCLK5)); | ||
| 438 | }; | ||
| 439 | |||
| 433 | // Use the HSI clock as system clock during the actual clock setup | 440 | // Use the HSI clock as system clock during the actual clock setup |
| 434 | RCC.cfgr().modify(|w| w.set_sw(Sysclk::HSI)); | 441 | RCC.cfgr().modify(|w| w.set_sw(Sysclk::HSI)); |
| 435 | while RCC.cfgr().read().sws() != Sysclk::HSI {} | 442 | while RCC.cfgr().read().sws() != Sysclk::HSI {} |
diff --git a/embassy-stm32/src/timer/complementary_pwm.rs b/embassy-stm32/src/timer/complementary_pwm.rs index b291fc155..7d6c2273e 100644 --- a/embassy-stm32/src/timer/complementary_pwm.rs +++ b/embassy-stm32/src/timer/complementary_pwm.rs | |||
| @@ -185,6 +185,16 @@ impl<'d, T: AdvancedInstance4Channel> ComplementaryPwm<'d, T> { | |||
| 185 | self.inner.set_complementary_output_polarity(channel, polarity); | 185 | self.inner.set_complementary_output_polarity(channel, polarity); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | /// Set the main output polarity for a given channel. | ||
| 189 | pub fn set_main_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||
| 190 | self.inner.set_output_polarity(channel, polarity); | ||
| 191 | } | ||
| 192 | |||
| 193 | /// Set the complementary output polarity for a given channel. | ||
| 194 | pub fn set_complementary_polarity(&mut self, channel: Channel, polarity: OutputPolarity) { | ||
| 195 | self.inner.set_complementary_output_polarity(channel, polarity); | ||
| 196 | } | ||
| 197 | |||
| 188 | /// Set the dead time as a proportion of max_duty | 198 | /// Set the dead time as a proportion of max_duty |
| 189 | pub fn set_dead_time(&mut self, value: u16) { | 199 | pub fn set_dead_time(&mut self, value: u16) { |
| 190 | let (ckd, value) = compute_dead_time_value(value); | 200 | let (ckd, value) = compute_dead_time_value(value); |
diff --git a/embassy-stm32/src/usb/usb.rs b/embassy-stm32/src/usb/usb.rs index 92c1601cc..54596aeae 100644 --- a/embassy-stm32/src/usb/usb.rs +++ b/embassy-stm32/src/usb/usb.rs | |||
| @@ -912,7 +912,16 @@ impl<'d, T: Instance> driver::EndpointOut for Endpoint<'d, T, Out> { | |||
| 912 | // Software should ensure that a small delay is included before accessing the SRAM contents. This delay should be | 912 | // Software should ensure that a small delay is included before accessing the SRAM contents. This delay should be |
| 913 | // 800 ns in Full Speed mode and 6.4 μs in Low Speed mode. | 913 | // 800 ns in Full Speed mode and 6.4 μs in Low Speed mode. |
| 914 | #[cfg(stm32h5)] | 914 | #[cfg(stm32h5)] |
| 915 | embassy_time::block_for(embassy_time::Duration::from_nanos(800)); | 915 | { |
| 916 | #[cfg(feature = "time")] | ||
| 917 | embassy_time::block_for(embassy_time::Duration::from_nanos(800)); | ||
| 918 | #[cfg(not(feature = "time"))] | ||
| 919 | { | ||
| 920 | let freq = unsafe { crate::rcc::get_freqs() }.sys.to_hertz().unwrap().0 as u64; | ||
| 921 | let cycles = freq * 800 / 1_000_000; | ||
| 922 | cortex_m::asm::delay(cycles as u32); | ||
| 923 | } | ||
| 924 | } | ||
| 916 | 925 | ||
| 917 | RX_COMPLETE[index].store(false, Ordering::Relaxed); | 926 | RX_COMPLETE[index].store(false, Ordering::Relaxed); |
| 918 | 927 | ||
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/Cargo.toml b/examples/nrf-rtos-trace/Cargo.toml index a2dc0c7ad..c9eeaaac7 100644 --- a/examples/nrf-rtos-trace/Cargo.toml +++ b/examples/nrf-rtos-trace/Cargo.toml | |||
| @@ -25,8 +25,8 @@ cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-sing | |||
| 25 | cortex-m-rt = "0.7.0" | 25 | cortex-m-rt = "0.7.0" |
| 26 | panic-probe = "1.0.0" | 26 | panic-probe = "1.0.0" |
| 27 | serde = { version = "1.0.136", default-features = false } | 27 | serde = { version = "1.0.136", default-features = false } |
| 28 | rtos-trace = "0.1.3" | 28 | rtos-trace = "0.2" |
| 29 | systemview-target = { version = "0.1.2", features = ["callbacks-app", "callbacks-os", "log", "cortex-m"] } | 29 | systemview-target = { version = "0.2", features = ["callbacks-app", "callbacks-os", "log", "cortex-m"] } |
| 30 | log = { version = "0.4.17", optional = true } | 30 | log = { version = "0.4.17", optional = true } |
| 31 | 31 | ||
| 32 | [[bin]] | 32 | [[bin]] |
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] |
| 37 | async fn main(spawner: Spawner) { | 37 | async 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] |
| 31 | async fn main(spawner: Spawner) { | 31 | async 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/nfct.rs b/examples/nrf52840/src/bin/nfct.rs index d559d006a..fafa37f48 100644 --- a/examples/nrf52840/src/bin/nfct.rs +++ b/examples/nrf52840/src/bin/nfct.rs | |||
| @@ -1,11 +1,12 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use defmt::*; | 4 | use defmt::{todo, *}; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_nrf::config::HfclkSource; | 6 | use embassy_nrf::config::HfclkSource; |
| 7 | use embassy_nrf::nfct::{Config as NfcConfig, NfcId, NfcT}; | 7 | use embassy_nrf::nfct::{Config as NfcConfig, NfcId, NfcT}; |
| 8 | use embassy_nrf::{bind_interrupts, nfct}; | 8 | use embassy_nrf::{bind_interrupts, nfct}; |
| 9 | use iso14443_4::{Card, IsoDep}; | ||
| 9 | use {defmt_rtt as _, embassy_nrf as _, panic_probe as _}; | 10 | use {defmt_rtt as _, embassy_nrf as _, panic_probe as _}; |
| 10 | 11 | ||
| 11 | bind_interrupts!(struct Irqs { | 12 | bind_interrupts!(struct Irqs { |
| @@ -30,12 +31,28 @@ async fn main(_spawner: Spawner) { | |||
| 30 | 31 | ||
| 31 | let mut buf = [0u8; 256]; | 32 | let mut buf = [0u8; 256]; |
| 32 | 33 | ||
| 34 | let cc = &[ | ||
| 35 | 0x00, 0x0f, /* CCEN_HI, CCEN_LOW */ | ||
| 36 | 0x20, /* VERSION */ | ||
| 37 | 0x00, 0x7f, /* MLe_HI, MLe_LOW */ | ||
| 38 | 0x00, 0x7f, /* MLc_HI, MLc_LOW */ | ||
| 39 | /* TLV */ | ||
| 40 | 0x04, 0x06, 0xe1, 0x04, 0x00, 0x7f, 0x00, 0x00, | ||
| 41 | ]; | ||
| 42 | |||
| 43 | let ndef = &[ | ||
| 44 | 0x00, 0x10, 0xd1, 0x1, 0xc, 0x55, 0x4, 0x65, 0x6d, 0x62, 0x61, 0x73, 0x73, 0x79, 0x2e, 0x64, 0x65, 0x76, | ||
| 45 | ]; | ||
| 46 | let mut selected: &[u8] = cc; | ||
| 47 | |||
| 33 | loop { | 48 | loop { |
| 34 | info!("activating"); | 49 | info!("activating"); |
| 35 | nfc.activate().await; | 50 | nfc.activate().await; |
| 51 | info!("activated!"); | ||
| 52 | |||
| 53 | let mut nfc = IsoDep::new(iso14443_3::Logger(&mut nfc)); | ||
| 36 | 54 | ||
| 37 | loop { | 55 | loop { |
| 38 | info!("rxing"); | ||
| 39 | let n = match nfc.receive(&mut buf).await { | 56 | let n = match nfc.receive(&mut buf).await { |
| 40 | Ok(n) => n, | 57 | Ok(n) => n, |
| 41 | Err(e) => { | 58 | Err(e) => { |
| @@ -44,25 +61,51 @@ async fn main(_spawner: Spawner) { | |||
| 44 | } | 61 | } |
| 45 | }; | 62 | }; |
| 46 | let req = &buf[..n]; | 63 | let req = &buf[..n]; |
| 47 | info!("received frame {:02x}", req); | 64 | info!("iso-dep rx {:02x}", req); |
| 48 | 65 | ||
| 49 | let mut deselect = false; | 66 | let Ok(apdu) = Apdu::parse(req) else { |
| 50 | let resp = match req { | 67 | error!("apdu parse error"); |
| 51 | [0xe0, ..] => { | 68 | break; |
| 52 | info!("Got RATS, tx'ing ATS"); | 69 | }; |
| 53 | &[0x06, 0x77, 0x77, 0x81, 0x02, 0x80][..] | 70 | |
| 71 | info!("apdu: {:?}", apdu); | ||
| 72 | |||
| 73 | let resp = match (apdu.cla, apdu.ins, apdu.p1, apdu.p2) { | ||
| 74 | (0, 0xa4, 4, 0) => { | ||
| 75 | info!("select app"); | ||
| 76 | &[0x90, 0x00][..] | ||
| 54 | } | 77 | } |
| 55 | [0xc2] => { | 78 | (0, 0xa4, 0, 12) => { |
| 56 | info!("Got deselect!"); | 79 | info!("select df"); |
| 57 | deselect = true; | 80 | match apdu.data { |
| 58 | &[0xc2] | 81 | [0xe1, 0x03] => { |
| 82 | selected = cc; | ||
| 83 | &[0x90, 0x00][..] | ||
| 84 | } | ||
| 85 | [0xe1, 0x04] => { | ||
| 86 | selected = ndef; | ||
| 87 | &[0x90, 0x00][..] | ||
| 88 | } | ||
| 89 | _ => todo!(), // return NOT FOUND | ||
| 90 | } | ||
| 91 | } | ||
| 92 | (0, 0xb0, p1, p2) => { | ||
| 93 | info!("read"); | ||
| 94 | let offs = u16::from_be_bytes([p1 & 0x7f, p2]) as usize; | ||
| 95 | let len = if apdu.le == 0 { usize::MAX } else { apdu.le as usize }; | ||
| 96 | let n = len.min(selected.len() - offs); | ||
| 97 | buf[..n].copy_from_slice(&selected[offs..][..n]); | ||
| 98 | buf[n..][..2].copy_from_slice(&[0x90, 0x00]); | ||
| 99 | &buf[..n + 2] | ||
| 59 | } | 100 | } |
| 60 | _ => { | 101 | _ => { |
| 61 | info!("Got unknown command!"); | 102 | info!("Got unknown command!"); |
| 62 | &[0xFF] | 103 | &[0xFF, 0xFF] |
| 63 | } | 104 | } |
| 64 | }; | 105 | }; |
| 65 | 106 | ||
| 107 | info!("iso-dep tx {:02x}", resp); | ||
| 108 | |||
| 66 | match nfc.transmit(resp).await { | 109 | match nfc.transmit(resp).await { |
| 67 | Ok(()) => {} | 110 | Ok(()) => {} |
| 68 | Err(e) => { | 111 | Err(e) => { |
| @@ -70,10 +113,211 @@ async fn main(_spawner: Spawner) { | |||
| 70 | break; | 113 | break; |
| 71 | } | 114 | } |
| 72 | } | 115 | } |
| 116 | } | ||
| 117 | } | ||
| 118 | } | ||
| 73 | 119 | ||
| 74 | if deselect { | 120 | #[derive(Debug, Clone, defmt::Format)] |
| 75 | break; | 121 | struct Apdu<'a> { |
| 122 | pub cla: u8, | ||
| 123 | pub ins: u8, | ||
| 124 | pub p1: u8, | ||
| 125 | pub p2: u8, | ||
| 126 | pub data: &'a [u8], | ||
| 127 | pub le: u16, | ||
| 128 | } | ||
| 129 | |||
| 130 | #[derive(Debug, Clone, Copy, PartialEq, Eq, defmt::Format)] | ||
| 131 | struct ApduParseError; | ||
| 132 | |||
| 133 | impl<'a> Apdu<'a> { | ||
| 134 | pub fn parse(apdu: &'a [u8]) -> Result<Self, ApduParseError> { | ||
| 135 | if apdu.len() < 4 { | ||
| 136 | return Err(ApduParseError); | ||
| 137 | } | ||
| 138 | |||
| 139 | let (data, le) = match apdu.len() - 4 { | ||
| 140 | 0 => (&[][..], 0), | ||
| 141 | 1 => (&[][..], apdu[4]), | ||
| 142 | n if n == 1 + apdu[4] as usize && apdu[4] != 0 => (&apdu[5..][..apdu[4] as usize], 0), | ||
| 143 | n if n == 2 + apdu[4] as usize && apdu[4] != 0 => (&apdu[5..][..apdu[4] as usize], apdu[apdu.len() - 1]), | ||
| 144 | _ => return Err(ApduParseError), | ||
| 145 | }; | ||
| 146 | |||
| 147 | Ok(Apdu { | ||
| 148 | cla: apdu[0], | ||
| 149 | ins: apdu[1], | ||
| 150 | p1: apdu[2], | ||
| 151 | p2: apdu[3], | ||
| 152 | data, | ||
| 153 | le: le as _, | ||
| 154 | }) | ||
| 155 | } | ||
| 156 | } | ||
| 157 | |||
| 158 | mod iso14443_3 { | ||
| 159 | use core::future::Future; | ||
| 160 | |||
| 161 | use defmt::info; | ||
| 162 | use embassy_nrf::nfct::{Error, NfcT}; | ||
| 163 | |||
| 164 | pub trait Card { | ||
| 165 | type Error; | ||
| 166 | async fn receive(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error>; | ||
| 167 | async fn transmit(&mut self, buf: &[u8]) -> Result<(), Self::Error>; | ||
| 168 | } | ||
| 169 | |||
| 170 | impl<'a, T: Card> Card for &'a mut T { | ||
| 171 | type Error = T::Error; | ||
| 172 | |||
| 173 | fn receive(&mut self, buf: &mut [u8]) -> impl Future<Output = Result<usize, Self::Error>> { | ||
| 174 | T::receive(self, buf) | ||
| 175 | } | ||
| 176 | |||
| 177 | fn transmit(&mut self, buf: &[u8]) -> impl Future<Output = Result<(), Self::Error>> { | ||
| 178 | T::transmit(self, buf) | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 182 | impl<'a> Card for NfcT<'a> { | ||
| 183 | type Error = Error; | ||
| 184 | |||
| 185 | fn receive(&mut self, buf: &mut [u8]) -> impl Future<Output = Result<usize, Self::Error>> { | ||
| 186 | self.receive(buf) | ||
| 187 | } | ||
| 188 | |||
| 189 | fn transmit(&mut self, buf: &[u8]) -> impl Future<Output = Result<(), Self::Error>> { | ||
| 190 | self.transmit(buf) | ||
| 191 | } | ||
| 192 | } | ||
| 193 | |||
| 194 | pub struct Logger<T: Card>(pub T); | ||
| 195 | |||
| 196 | impl<T: Card> Card for Logger<T> { | ||
| 197 | type Error = T::Error; | ||
| 198 | |||
| 199 | async fn receive(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 200 | let n = T::receive(&mut self.0, buf).await?; | ||
| 201 | info!("<- {:02x}", &buf[..n]); | ||
| 202 | Ok(n) | ||
| 203 | } | ||
| 204 | |||
| 205 | fn transmit(&mut self, buf: &[u8]) -> impl Future<Output = Result<(), Self::Error>> { | ||
| 206 | info!("-> {:02x}", buf); | ||
| 207 | T::transmit(&mut self.0, buf) | ||
| 208 | } | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | mod iso14443_4 { | ||
| 213 | use defmt::info; | ||
| 214 | |||
| 215 | use crate::iso14443_3; | ||
| 216 | |||
| 217 | #[derive(defmt::Format)] | ||
| 218 | pub enum Error<T> { | ||
| 219 | Deselected, | ||
| 220 | Protocol, | ||
| 221 | Lower(T), | ||
| 222 | } | ||
| 223 | |||
| 224 | pub trait Card { | ||
| 225 | type Error; | ||
| 226 | async fn receive(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error>; | ||
| 227 | async fn transmit(&mut self, buf: &[u8]) -> Result<(), Self::Error>; | ||
| 228 | } | ||
| 229 | |||
| 230 | pub struct IsoDep<T: iso14443_3::Card> { | ||
| 231 | nfc: T, | ||
| 232 | |||
| 233 | /// Block count spin bit: 0 or 1 | ||
| 234 | block_num: u8, | ||
| 235 | |||
| 236 | /// true if deselected. This is permanent, you must create another IsoDep | ||
| 237 | /// instance if we get selected again. | ||
| 238 | deselected: bool, | ||
| 239 | |||
| 240 | /// last response, in case we need to retransmit. | ||
| 241 | resp: [u8; 256], | ||
| 242 | resp_len: usize, | ||
| 243 | } | ||
| 244 | |||
| 245 | impl<T: iso14443_3::Card> IsoDep<T> { | ||
| 246 | pub fn new(nfc: T) -> Self { | ||
| 247 | Self { | ||
| 248 | nfc, | ||
| 249 | block_num: 1, | ||
| 250 | deselected: false, | ||
| 251 | resp: [0u8; 256], | ||
| 252 | resp_len: 0, | ||
| 76 | } | 253 | } |
| 77 | } | 254 | } |
| 78 | } | 255 | } |
| 256 | |||
| 257 | impl<T: iso14443_3::Card> Card for IsoDep<T> { | ||
| 258 | type Error = Error<T::Error>; | ||
| 259 | |||
| 260 | async fn receive(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 261 | if self.deselected { | ||
| 262 | return Err(Error::Deselected); | ||
| 263 | } | ||
| 264 | |||
| 265 | let mut temp = [0u8; 256]; | ||
| 266 | |||
| 267 | loop { | ||
| 268 | let n = self.nfc.receive(&mut temp).await.map_err(Error::Lower)?; | ||
| 269 | assert!(n != 0); | ||
| 270 | match temp[0] { | ||
| 271 | 0x02 | 0x03 => { | ||
| 272 | self.block_num ^= 0x01; | ||
| 273 | assert!(temp[0] == 0x02 | self.block_num); | ||
| 274 | buf[..n - 1].copy_from_slice(&temp[1..n]); | ||
| 275 | return Ok(n - 1); | ||
| 276 | } | ||
| 277 | 0xb2 | 0xb3 => { | ||
| 278 | if temp[0] & 0x01 != self.block_num { | ||
| 279 | info!("Got NAK, transmitting ACK."); | ||
| 280 | let resp = &[0xA2 | self.block_num]; | ||
| 281 | self.nfc.transmit(resp).await.map_err(Error::Lower)?; | ||
| 282 | } else { | ||
| 283 | info!("Got NAK, retransmitting."); | ||
| 284 | let resp: &[u8] = &self.resp[..self.resp_len]; | ||
| 285 | self.nfc.transmit(resp).await.map_err(Error::Lower)?; | ||
| 286 | } | ||
| 287 | } | ||
| 288 | 0xe0 => { | ||
| 289 | info!("Got RATS, tx'ing ATS"); | ||
| 290 | let resp = &[0x06, 0x77, 0x77, 0x81, 0x02, 0x80]; | ||
| 291 | self.nfc.transmit(resp).await.map_err(Error::Lower)?; | ||
| 292 | } | ||
| 293 | 0xc2 => { | ||
| 294 | info!("Got deselect!"); | ||
| 295 | self.deselected = true; | ||
| 296 | let resp = &[0xC2]; | ||
| 297 | self.nfc.transmit(resp).await.map_err(Error::Lower)?; | ||
| 298 | return Err(Error::Deselected); | ||
| 299 | } | ||
| 300 | _ => { | ||
| 301 | info!("Got unknown command {:02x}!", temp[0]); | ||
| 302 | return Err(Error::Protocol); | ||
| 303 | } | ||
| 304 | }; | ||
| 305 | } | ||
| 306 | } | ||
| 307 | |||
| 308 | async fn transmit(&mut self, buf: &[u8]) -> Result<(), Self::Error> { | ||
| 309 | if self.deselected { | ||
| 310 | return Err(Error::Deselected); | ||
| 311 | } | ||
| 312 | |||
| 313 | self.resp[0] = 0x02 | self.block_num; | ||
| 314 | self.resp[1..][..buf.len()].copy_from_slice(buf); | ||
| 315 | self.resp_len = 1 + buf.len(); | ||
| 316 | |||
| 317 | let resp: &[u8] = &self.resp[..self.resp_len]; | ||
| 318 | self.nfc.transmit(resp).await.map_err(Error::Lower)?; | ||
| 319 | |||
| 320 | Ok(()) | ||
| 321 | } | ||
| 322 | } | ||
| 79 | } | 323 | } |
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 { | |||
| 14 | async fn my_task(spawner: Spawner, n: u32) { | 14 | async 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] |
| 21 | async fn main(spawner: Spawner) { | 21 | async 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] |
| 18 | async fn main(spawner: Spawner) { | 18 | async 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] |
| 26 | async fn main(spawner: Spawner) { | 26 | async 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 | ||
| 83 | struct Disconnected {} | 83 | struct 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] |
| 19 | async fn main(spawner: Spawner) { | 19 | async 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>) { | |||
| 25 | async fn main(spawner: Spawner) { | 25 | async 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>) { | |||
| 53 | async fn main(spawner: Spawner) { | 53 | async fn main(spawner: Spawner) { |
| 54 | let p = embassy_rp::init(Default::default()); | 54 | let p = embassy_rp::init(Default::default()); |
| 55 | let driver = Driver::new(p.USB, Irqs); | 55 | let driver = Driver::new(p.USB, Irqs); |
| 56 | spawner.spawn(logger_task(driver)).unwrap(); | 56 | spawner.spawn(logger_task(driver).unwrap()); |
| 57 | 57 | ||
| 58 | let mut counter = 0; | 58 | let mut counter = 0; |
| 59 | loop { | 59 | loop { |
diff --git a/examples/rp/src/bin/wifi_ap_tcp_server.rs b/examples/rp/src/bin/wifi_ap_tcp_server.rs index 856838a8c..128599e0d 100644 --- a/examples/rp/src/bin/wifi_ap_tcp_server.rs +++ b/examples/rp/src/bin/wifi_ap_tcp_server.rs | |||
| @@ -70,7 +70,7 @@ async fn main(spawner: Spawner) { | |||
| 70 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 70 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 71 | let state = STATE.init(cyw43::State::new()); | 71 | let state = STATE.init(cyw43::State::new()); |
| 72 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 72 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 73 | unwrap!(spawner.spawn(cyw43_task(runner))); | 73 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 74 | 74 | ||
| 75 | control.init(clm).await; | 75 | control.init(clm).await; |
| 76 | control | 76 | control |
| @@ -91,7 +91,7 @@ async fn main(spawner: Spawner) { | |||
| 91 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 91 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 92 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); | 92 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); |
| 93 | 93 | ||
| 94 | unwrap!(spawner.spawn(net_task(runner))); | 94 | spawner.spawn(unwrap!(net_task(runner))); |
| 95 | 95 | ||
| 96 | //control.start_ap_open("cyw43", 5).await; | 96 | //control.start_ap_open("cyw43", 5).await; |
| 97 | control.start_ap_wpa2("cyw43", "password", 5).await; | 97 | control.start_ap_wpa2("cyw43", "password", 5).await; |
diff --git a/examples/rp/src/bin/wifi_blinky.rs b/examples/rp/src/bin/wifi_blinky.rs index 6e91ce167..b2e08c517 100644 --- a/examples/rp/src/bin/wifi_blinky.rs +++ b/examples/rp/src/bin/wifi_blinky.rs | |||
| @@ -55,7 +55,7 @@ async fn main(spawner: Spawner) { | |||
| 55 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 55 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 56 | let state = STATE.init(cyw43::State::new()); | 56 | let state = STATE.init(cyw43::State::new()); |
| 57 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 57 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 58 | unwrap!(spawner.spawn(cyw43_task(runner))); | 58 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 59 | 59 | ||
| 60 | control.init(clm).await; | 60 | control.init(clm).await; |
| 61 | control | 61 | control |
diff --git a/examples/rp/src/bin/wifi_scan.rs b/examples/rp/src/bin/wifi_scan.rs index fe9c363d9..c884aa2ba 100644 --- a/examples/rp/src/bin/wifi_scan.rs +++ b/examples/rp/src/bin/wifi_scan.rs | |||
| @@ -59,7 +59,7 @@ async fn main(spawner: Spawner) { | |||
| 59 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 59 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 60 | let state = STATE.init(cyw43::State::new()); | 60 | let state = STATE.init(cyw43::State::new()); |
| 61 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 61 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 62 | unwrap!(spawner.spawn(cyw43_task(runner))); | 62 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 63 | 63 | ||
| 64 | control.init(clm).await; | 64 | control.init(clm).await; |
| 65 | control | 65 | control |
diff --git a/examples/rp/src/bin/wifi_tcp_server.rs b/examples/rp/src/bin/wifi_tcp_server.rs index ed1a03fcf..126475779 100644 --- a/examples/rp/src/bin/wifi_tcp_server.rs +++ b/examples/rp/src/bin/wifi_tcp_server.rs | |||
| @@ -74,7 +74,7 @@ async fn main(spawner: Spawner) { | |||
| 74 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 74 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 75 | let state = STATE.init(cyw43::State::new()); | 75 | let state = STATE.init(cyw43::State::new()); |
| 76 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 76 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 77 | unwrap!(spawner.spawn(cyw43_task(runner))); | 77 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 78 | 78 | ||
| 79 | control.init(clm).await; | 79 | control.init(clm).await; |
| 80 | control | 80 | control |
| @@ -95,7 +95,7 @@ async fn main(spawner: Spawner) { | |||
| 95 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 95 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 96 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); | 96 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); |
| 97 | 97 | ||
| 98 | unwrap!(spawner.spawn(net_task(runner))); | 98 | spawner.spawn(unwrap!(net_task(runner))); |
| 99 | 99 | ||
| 100 | while let Err(err) = control | 100 | while let Err(err) = control |
| 101 | .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) | 101 | .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) |
diff --git a/examples/rp/src/bin/wifi_webrequest.rs b/examples/rp/src/bin/wifi_webrequest.rs index a75253bb0..079def370 100644 --- a/examples/rp/src/bin/wifi_webrequest.rs +++ b/examples/rp/src/bin/wifi_webrequest.rs | |||
| @@ -76,7 +76,7 @@ async fn main(spawner: Spawner) { | |||
| 76 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 76 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 77 | let state = STATE.init(cyw43::State::new()); | 77 | let state = STATE.init(cyw43::State::new()); |
| 78 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 78 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 79 | unwrap!(spawner.spawn(cyw43_task(runner))); | 79 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 80 | 80 | ||
| 81 | control.init(clm).await; | 81 | control.init(clm).await; |
| 82 | control | 82 | control |
| @@ -98,7 +98,7 @@ async fn main(spawner: Spawner) { | |||
| 98 | static RESOURCES: StaticCell<StackResources<5>> = StaticCell::new(); | 98 | static RESOURCES: StaticCell<StackResources<5>> = StaticCell::new(); |
| 99 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); | 99 | let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); |
| 100 | 100 | ||
| 101 | unwrap!(spawner.spawn(net_task(runner))); | 101 | spawner.spawn(unwrap!(net_task(runner))); |
| 102 | 102 | ||
| 103 | while let Err(err) = control | 103 | while let Err(err) = control |
| 104 | .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) | 104 | .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) |
diff --git a/examples/rp/src/bin/zerocopy.rs b/examples/rp/src/bin/zerocopy.rs index d1fb0eb00..d603e1ed3 100644 --- a/examples/rp/src/bin/zerocopy.rs +++ b/examples/rp/src/bin/zerocopy.rs | |||
| @@ -52,8 +52,8 @@ async fn main(spawner: Spawner) { | |||
| 52 | let channel = CHANNEL.init(Channel::new(buf)); | 52 | let channel = CHANNEL.init(Channel::new(buf)); |
| 53 | let (sender, receiver) = channel.split(); | 53 | let (sender, receiver) = channel.split(); |
| 54 | 54 | ||
| 55 | spawner.must_spawn(consumer(receiver)); | 55 | spawner.spawn(consumer(receiver).unwrap()); |
| 56 | spawner.must_spawn(producer(sender, adc_parts)); | 56 | spawner.spawn(producer(sender, adc_parts).unwrap()); |
| 57 | 57 | ||
| 58 | let mut ticker = Ticker::every(Duration::from_secs(1)); | 58 | let mut ticker = Ticker::every(Duration::from_secs(1)); |
| 59 | loop { | 59 | loop { |
diff --git a/examples/rp235x/src/bin/assign_resources.rs b/examples/rp235x/src/bin/assign_resources.rs index 341f54d22..4ee4278b5 100644 --- a/examples/rp235x/src/bin/assign_resources.rs +++ b/examples/rp235x/src/bin/assign_resources.rs | |||
| @@ -26,15 +26,13 @@ async fn main(spawner: Spawner) { | |||
| 26 | let p = embassy_rp::init(Default::default()); | 26 | let p = embassy_rp::init(Default::default()); |
| 27 | 27 | ||
| 28 | // 1) Assigning a resource to a task by passing parts of the peripherals. | 28 | // 1) Assigning a resource to a task by passing parts of the peripherals. |
| 29 | spawner | 29 | spawner.spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21).unwrap()); |
| 30 | .spawn(double_blinky_manually_assigned(spawner, p.PIN_20, p.PIN_21)) | ||
| 31 | .unwrap(); | ||
| 32 | 30 | ||
| 33 | // 2) Using the assign-resources macro to assign resources to a task. | 31 | // 2) Using the assign-resources macro to assign resources to a task. |
| 34 | // we perform the split, see further below for the definition of the resources struct | 32 | // we perform the split, see further below for the definition of the resources struct |
| 35 | let r = split_resources!(p); | 33 | let r = split_resources!(p); |
| 36 | // and then we can use them | 34 | // and then we can use them |
| 37 | spawner.spawn(double_blinky_macro_assigned(spawner, r.leds)).unwrap(); | 35 | spawner.spawn(double_blinky_macro_assigned(spawner, r.leds).unwrap()); |
| 38 | } | 36 | } |
| 39 | 37 | ||
| 40 | // 1) Assigning a resource to a task by passing parts of the peripherals. | 38 | // 1) Assigning a resource to a task by passing parts of the peripherals. |
diff --git a/examples/rp235x/src/bin/blinky_two_channels.rs b/examples/rp235x/src/bin/blinky_two_channels.rs index 51e139e94..87f3a3545 100644 --- a/examples/rp235x/src/bin/blinky_two_channels.rs +++ b/examples/rp235x/src/bin/blinky_two_channels.rs | |||
| @@ -27,8 +27,8 @@ async fn main(spawner: Spawner) { | |||
| 27 | let dt = 100 * 1_000_000; | 27 | let dt = 100 * 1_000_000; |
| 28 | let k = 1.003; | 28 | let k = 1.003; |
| 29 | 29 | ||
| 30 | unwrap!(spawner.spawn(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); | 30 | spawner.spawn(unwrap!(toggle_led(CHANNEL.sender(), Duration::from_nanos(dt)))); |
| 31 | unwrap!(spawner.spawn(toggle_led( | 31 | spawner.spawn(unwrap!(toggle_led( |
| 32 | CHANNEL.sender(), | 32 | CHANNEL.sender(), |
| 33 | Duration::from_nanos((dt as f64 * k) as u64) | 33 | Duration::from_nanos((dt as f64 * k) as u64) |
| 34 | ))); | 34 | ))); |
diff --git a/examples/rp235x/src/bin/blinky_two_tasks.rs b/examples/rp235x/src/bin/blinky_two_tasks.rs index 67a9108c0..aac7d928b 100644 --- a/examples/rp235x/src/bin/blinky_two_tasks.rs +++ b/examples/rp235x/src/bin/blinky_two_tasks.rs | |||
| @@ -30,8 +30,8 @@ async fn main(spawner: Spawner) { | |||
| 30 | let dt = 100 * 1_000_000; | 30 | let dt = 100 * 1_000_000; |
| 31 | let k = 1.003; | 31 | let k = 1.003; |
| 32 | 32 | ||
| 33 | unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos(dt)))); | 33 | spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos(dt)))); |
| 34 | unwrap!(spawner.spawn(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); | 34 | spawner.spawn(unwrap!(toggle_led(&LED, Duration::from_nanos((dt as f64 * k) as u64)))); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | #[embassy_executor::task(pool_size = 2)] | 37 | #[embassy_executor::task(pool_size = 2)] |
diff --git a/examples/rp235x/src/bin/blinky_wifi.rs b/examples/rp235x/src/bin/blinky_wifi.rs index ef6057a1c..b2201f0ae 100644 --- a/examples/rp235x/src/bin/blinky_wifi.rs +++ b/examples/rp235x/src/bin/blinky_wifi.rs | |||
| @@ -71,7 +71,7 @@ async fn main(spawner: Spawner) { | |||
| 71 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 71 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 72 | let state = STATE.init(cyw43::State::new()); | 72 | let state = STATE.init(cyw43::State::new()); |
| 73 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 73 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 74 | unwrap!(spawner.spawn(cyw43_task(runner))); | 74 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 75 | 75 | ||
| 76 | control.init(clm).await; | 76 | control.init(clm).await; |
| 77 | control | 77 | control |
diff --git a/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs b/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs index 0a5bccfb3..e6d6f687b 100644 --- a/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs +++ b/examples/rp235x/src/bin/blinky_wifi_pico_plus_2.rs | |||
| @@ -68,7 +68,7 @@ async fn main(spawner: Spawner) { | |||
| 68 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); | 68 | static STATE: StaticCell<cyw43::State> = StaticCell::new(); |
| 69 | let state = STATE.init(cyw43::State::new()); | 69 | let state = STATE.init(cyw43::State::new()); |
| 70 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 70 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 71 | unwrap!(spawner.spawn(cyw43_task(runner))); | 71 | spawner.spawn(unwrap!(cyw43_task(runner))); |
| 72 | 72 | ||
| 73 | control.init(clm).await; | 73 | control.init(clm).await; |
| 74 | control | 74 | control |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_icmp.rs b/examples/rp235x/src/bin/ethernet_w5500_icmp.rs index f1abd311c..f012c9589 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_icmp.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_icmp.rs | |||
| @@ -61,7 +61,7 @@ async fn main(spawner: Spawner) { | |||
| 61 | ) | 61 | ) |
| 62 | .await | 62 | .await |
| 63 | .unwrap(); | 63 | .unwrap(); |
| 64 | unwrap!(spawner.spawn(ethernet_task(runner))); | 64 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 65 | 65 | ||
| 66 | // Generate random seed | 66 | // Generate random seed |
| 67 | let seed = rng.next_u64(); | 67 | let seed = rng.next_u64(); |
| @@ -76,7 +76,7 @@ async fn main(spawner: Spawner) { | |||
| 76 | ); | 76 | ); |
| 77 | 77 | ||
| 78 | // Launch network task | 78 | // Launch network task |
| 79 | unwrap!(spawner.spawn(net_task(runner))); | 79 | spawner.spawn(unwrap!(net_task(runner))); |
| 80 | 80 | ||
| 81 | info!("Waiting for DHCP..."); | 81 | info!("Waiting for DHCP..."); |
| 82 | let cfg = wait_for_config(stack).await; | 82 | let cfg = wait_for_config(stack).await; |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs b/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs index 1f799a6b0..309d3e4f7 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_icmp_ping.rs | |||
| @@ -63,7 +63,7 @@ async fn main(spawner: Spawner) { | |||
| 63 | ) | 63 | ) |
| 64 | .await | 64 | .await |
| 65 | .unwrap(); | 65 | .unwrap(); |
| 66 | unwrap!(spawner.spawn(ethernet_task(runner))); | 66 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 67 | 67 | ||
| 68 | // Generate random seed | 68 | // Generate random seed |
| 69 | let seed = rng.next_u64(); | 69 | let seed = rng.next_u64(); |
| @@ -78,7 +78,7 @@ async fn main(spawner: Spawner) { | |||
| 78 | ); | 78 | ); |
| 79 | 79 | ||
| 80 | // Launch network task | 80 | // Launch network task |
| 81 | unwrap!(spawner.spawn(net_task(runner))); | 81 | spawner.spawn(unwrap!(net_task(runner))); |
| 82 | 82 | ||
| 83 | info!("Waiting for DHCP..."); | 83 | info!("Waiting for DHCP..."); |
| 84 | let cfg = wait_for_config(stack).await; | 84 | let cfg = wait_for_config(stack).await; |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs b/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs index fd8bc5c7a..7cfc00776 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_multisocket.rs | |||
| @@ -64,7 +64,7 @@ async fn main(spawner: Spawner) { | |||
| 64 | ) | 64 | ) |
| 65 | .await | 65 | .await |
| 66 | .unwrap(); | 66 | .unwrap(); |
| 67 | unwrap!(spawner.spawn(ethernet_task(runner))); | 67 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 68 | 68 | ||
| 69 | // Generate random seed | 69 | // Generate random seed |
| 70 | let seed = rng.next_u64(); | 70 | let seed = rng.next_u64(); |
| @@ -79,7 +79,7 @@ async fn main(spawner: Spawner) { | |||
| 79 | ); | 79 | ); |
| 80 | 80 | ||
| 81 | // Launch network task | 81 | // Launch network task |
| 82 | unwrap!(spawner.spawn(net_task(runner))); | 82 | spawner.spawn(unwrap!(net_task(runner))); |
| 83 | 83 | ||
| 84 | info!("Waiting for DHCP..."); | 84 | info!("Waiting for DHCP..."); |
| 85 | let cfg = wait_for_config(stack).await; | 85 | let cfg = wait_for_config(stack).await; |
| @@ -87,8 +87,8 @@ async fn main(spawner: Spawner) { | |||
| 87 | info!("IP address: {:?}", local_addr); | 87 | info!("IP address: {:?}", local_addr); |
| 88 | 88 | ||
| 89 | // Create two sockets listening to the same port, to handle simultaneous connections | 89 | // Create two sockets listening to the same port, to handle simultaneous connections |
| 90 | unwrap!(spawner.spawn(listen_task(stack, 0, 1234))); | 90 | spawner.spawn(unwrap!(listen_task(stack, 0, 1234))); |
| 91 | unwrap!(spawner.spawn(listen_task(stack, 1, 1234))); | 91 | spawner.spawn(unwrap!(listen_task(stack, 1, 1234))); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | #[embassy_executor::task(pool_size = 2)] | 94 | #[embassy_executor::task(pool_size = 2)] |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs b/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs index b726b9cc6..254aada9a 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_tcp_client.rs | |||
| @@ -67,7 +67,7 @@ async fn main(spawner: Spawner) { | |||
| 67 | ) | 67 | ) |
| 68 | .await | 68 | .await |
| 69 | .unwrap(); | 69 | .unwrap(); |
| 70 | unwrap!(spawner.spawn(ethernet_task(runner))); | 70 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 71 | 71 | ||
| 72 | // Generate random seed | 72 | // Generate random seed |
| 73 | let seed = rng.next_u64(); | 73 | let seed = rng.next_u64(); |
| @@ -82,7 +82,7 @@ async fn main(spawner: Spawner) { | |||
| 82 | ); | 82 | ); |
| 83 | 83 | ||
| 84 | // Launch network task | 84 | // Launch network task |
| 85 | unwrap!(spawner.spawn(net_task(runner))); | 85 | spawner.spawn(unwrap!(net_task(runner))); |
| 86 | 86 | ||
| 87 | info!("Waiting for DHCP..."); | 87 | info!("Waiting for DHCP..."); |
| 88 | let cfg = wait_for_config(stack).await; | 88 | let cfg = wait_for_config(stack).await; |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs b/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs index 32b3880f6..ba812f4fd 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_tcp_server.rs | |||
| @@ -66,7 +66,7 @@ async fn main(spawner: Spawner) { | |||
| 66 | ) | 66 | ) |
| 67 | .await | 67 | .await |
| 68 | .unwrap(); | 68 | .unwrap(); |
| 69 | unwrap!(spawner.spawn(ethernet_task(runner))); | 69 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 70 | 70 | ||
| 71 | // Generate random seed | 71 | // Generate random seed |
| 72 | let seed = rng.next_u64(); | 72 | let seed = rng.next_u64(); |
| @@ -81,7 +81,7 @@ async fn main(spawner: Spawner) { | |||
| 81 | ); | 81 | ); |
| 82 | 82 | ||
| 83 | // Launch network task | 83 | // Launch network task |
| 84 | unwrap!(spawner.spawn(net_task(runner))); | 84 | spawner.spawn(unwrap!(net_task(runner))); |
| 85 | 85 | ||
| 86 | info!("Waiting for DHCP..."); | 86 | info!("Waiting for DHCP..."); |
| 87 | let cfg = wait_for_config(stack).await; | 87 | let cfg = wait_for_config(stack).await; |
diff --git a/examples/rp235x/src/bin/ethernet_w5500_udp.rs b/examples/rp235x/src/bin/ethernet_w5500_udp.rs index cd0824df1..ae74ad518 100644 --- a/examples/rp235x/src/bin/ethernet_w5500_udp.rs +++ b/examples/rp235x/src/bin/ethernet_w5500_udp.rs | |||
| @@ -64,7 +64,7 @@ async fn main(spawner: Spawner) { | |||
| 64 | ) | 64 | ) |
| 65 | .await | 65 | .await |
| 66 | .unwrap(); | 66 | .unwrap(); |
| 67 | unwrap!(spawner.spawn(ethernet_task(runner))); | 67 | spawner.spawn(unwrap!(ethernet_task(runner))); |
| 68 | 68 | ||
| 69 | // Generate random seed | 69 | // Generate random seed |
| 70 | let seed = rng.next_u64(); | 70 | let seed = rng.next_u64(); |
| @@ -79,7 +79,7 @@ async fn main(spawner: Spawner) { | |||
| 79 | ); | 79 | ); |
| 80 | 80 | ||
| 81 | // Launch network task | 81 | // Launch network task |
| 82 | unwrap!(spawner.spawn(net_task(runner))); | 82 | spawner.spawn(unwrap!(net_task(runner))); |
| 83 | 83 | ||
| 84 | info!("Waiting for DHCP..."); | 84 | info!("Waiting for DHCP..."); |
| 85 | let cfg = wait_for_config(stack).await; | 85 | let cfg = wait_for_config(stack).await; |
diff --git a/examples/rp235x/src/bin/i2c_slave.rs b/examples/rp235x/src/bin/i2c_slave.rs index 9fffb4646..02ad9a003 100644 --- a/examples/rp235x/src/bin/i2c_slave.rs +++ b/examples/rp235x/src/bin/i2c_slave.rs | |||
| @@ -105,7 +105,7 @@ async fn main(spawner: Spawner) { | |||
| 105 | config.addr = DEV_ADDR as u16; | 105 | config.addr = DEV_ADDR as u16; |
| 106 | let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); | 106 | let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); |
| 107 | 107 | ||
| 108 | unwrap!(spawner.spawn(device_task(device))); | 108 | spawner.spawn(unwrap!(device_task(device))); |
| 109 | 109 | ||
| 110 | let c_sda = p.PIN_1; | 110 | let c_sda = p.PIN_1; |
| 111 | let c_scl = p.PIN_0; | 111 | let c_scl = p.PIN_0; |
| @@ -113,5 +113,5 @@ async fn main(spawner: Spawner) { | |||
| 113 | config.frequency = 1_000_000; | 113 | config.frequency = 1_000_000; |
| 114 | let controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, config); | 114 | let controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, config); |
| 115 | 115 | ||
| 116 | unwrap!(spawner.spawn(controller_task(controller))); | 116 | spawner.spawn(unwrap!(controller_task(controller))); |
| 117 | } | 117 | } |
diff --git a/examples/rp235x/src/bin/interrupt.rs b/examples/rp235x/src/bin/interrupt.rs index e9ac76486..88513180c 100644 --- a/examples/rp235x/src/bin/interrupt.rs +++ b/examples/rp235x/src/bin/interrupt.rs | |||
| @@ -51,7 +51,7 @@ async fn main(spawner: Spawner) { | |||
| 51 | // No Mutex needed when sharing within the same executor/prio level | 51 | // No Mutex needed when sharing within the same executor/prio level |
| 52 | static AVG: StaticCell<Cell<u32>> = StaticCell::new(); | 52 | static AVG: StaticCell<Cell<u32>> = StaticCell::new(); |
| 53 | let avg = AVG.init(Default::default()); | 53 | let avg = AVG.init(Default::default()); |
| 54 | spawner.must_spawn(processing(avg)); | 54 | spawner.spawn(processing(avg).unwrap()); |
| 55 | 55 | ||
| 56 | let mut ticker = Ticker::every(Duration::from_secs(1)); | 56 | let mut ticker = Ticker::every(Duration::from_secs(1)); |
| 57 | loop { | 57 | loop { |
diff --git a/examples/rp235x/src/bin/multicore.rs b/examples/rp235x/src/bin/multicore.rs index f02dc3876..4f82801d6 100644 --- a/examples/rp235x/src/bin/multicore.rs +++ b/examples/rp235x/src/bin/multicore.rs | |||
| @@ -35,12 +35,12 @@ fn main() -> ! { | |||
| 35 | unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, | 35 | unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, |
| 36 | move || { | 36 | move || { |
| 37 | let executor1 = EXECUTOR1.init(Executor::new()); | 37 | let executor1 = EXECUTOR1.init(Executor::new()); |
| 38 | executor1.run(|spawner| unwrap!(spawner.spawn(core1_task(led)))); | 38 | executor1.run(|spawner| spawner.spawn(unwrap!(core1_task(led)))); |
| 39 | }, | 39 | }, |
| 40 | ); | 40 | ); |
| 41 | 41 | ||
| 42 | let executor0 = EXECUTOR0.init(Executor::new()); | 42 | let executor0 = EXECUTOR0.init(Executor::new()); |
| 43 | executor0.run(|spawner| unwrap!(spawner.spawn(core0_task()))); | 43 | executor0.run(|spawner| spawner.spawn(unwrap!(core0_task()))); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | #[embassy_executor::task] | 46 | #[embassy_executor::task] |
diff --git a/examples/rp235x/src/bin/multiprio.rs b/examples/rp235x/src/bin/multiprio.rs index 2b397f97d..96cdf8fb1 100644 --- a/examples/rp235x/src/bin/multiprio.rs +++ b/examples/rp235x/src/bin/multiprio.rs | |||
| @@ -130,16 +130,16 @@ fn main() -> ! { | |||
| 130 | // High-priority executor: SWI_IRQ_1, priority level 2 | 130 | // High-priority executor: SWI_IRQ_1, priority level 2 |
| 131 | interrupt::SWI_IRQ_1.set_priority(Priority::P2); | 131 | interrupt::SWI_IRQ_1.set_priority(Priority::P2); |
| 132 | let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1); | 132 | let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1); |
| 133 | unwrap!(spawner.spawn(run_high())); | 133 | spawner.spawn(unwrap!(run_high())); |
| 134 | 134 | ||
| 135 | // Medium-priority executor: SWI_IRQ_0, priority level 3 | 135 | // Medium-priority executor: SWI_IRQ_0, priority level 3 |
| 136 | interrupt::SWI_IRQ_0.set_priority(Priority::P3); | 136 | interrupt::SWI_IRQ_0.set_priority(Priority::P3); |
| 137 | let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0); | 137 | let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0); |
| 138 | unwrap!(spawner.spawn(run_med())); | 138 | spawner.spawn(unwrap!(run_med())); |
| 139 | 139 | ||
| 140 | // Low priority executor: runs in thread mode, using WFE/SEV | 140 | // Low priority executor: runs in thread mode, using WFE/SEV |
| 141 | let executor = EXECUTOR_LOW.init(Executor::new()); | 141 | let executor = EXECUTOR_LOW.init(Executor::new()); |
| 142 | executor.run(|spawner| { | 142 | executor.run(|spawner| { |
| 143 | unwrap!(spawner.spawn(run_low())); | 143 | spawner.spawn(unwrap!(run_low())); |
| 144 | }); | 144 | }); |
| 145 | } | 145 | } |
diff --git a/examples/rp235x/src/bin/pio_async.rs b/examples/rp235x/src/bin/pio_async.rs index a519b8a50..d76930f5c 100644 --- a/examples/rp235x/src/bin/pio_async.rs +++ b/examples/rp235x/src/bin/pio_async.rs | |||
| @@ -125,7 +125,7 @@ async fn main(spawner: Spawner) { | |||
| 125 | setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0); | 125 | setup_pio_task_sm0(&mut common, &mut sm0, p.PIN_0); |
| 126 | setup_pio_task_sm1(&mut common, &mut sm1); | 126 | setup_pio_task_sm1(&mut common, &mut sm1); |
| 127 | setup_pio_task_sm2(&mut common, &mut sm2); | 127 | setup_pio_task_sm2(&mut common, &mut sm2); |
| 128 | spawner.spawn(pio_task_sm0(sm0)).unwrap(); | 128 | spawner.spawn(pio_task_sm0(sm0).unwrap()); |
| 129 | spawner.spawn(pio_task_sm1(sm1)).unwrap(); | 129 | spawner.spawn(pio_task_sm1(sm1).unwrap()); |
| 130 | spawner.spawn(pio_task_sm2(irq3, sm2)).unwrap(); | 130 | spawner.spawn(pio_task_sm2(irq3, sm2).unwrap()); |
| 131 | } | 131 | } |
diff --git a/examples/rp235x/src/bin/pio_rotary_encoder.rs b/examples/rp235x/src/bin/pio_rotary_encoder.rs index e820d316d..610d1a40b 100644 --- a/examples/rp235x/src/bin/pio_rotary_encoder.rs +++ b/examples/rp235x/src/bin/pio_rotary_encoder.rs | |||
| @@ -50,6 +50,6 @@ async fn main(spawner: Spawner) { | |||
| 50 | let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg); | 50 | let encoder0 = PioEncoder::new(&mut common, sm0, p.PIN_4, p.PIN_5, &prg); |
| 51 | let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg); | 51 | let encoder1 = PioEncoder::new(&mut common, sm1, p.PIN_6, p.PIN_7, &prg); |
| 52 | 52 | ||
| 53 | spawner.must_spawn(encoder_0(encoder0)); | 53 | spawner.spawn(encoder_0(encoder0).unwrap()); |
| 54 | spawner.must_spawn(encoder_1(encoder1)); | 54 | spawner.spawn(encoder_1(encoder1).unwrap()); |
| 55 | } | 55 | } |
diff --git a/examples/rp235x/src/bin/pwm.rs b/examples/rp235x/src/bin/pwm.rs index da1acc18a..289480c85 100644 --- a/examples/rp235x/src/bin/pwm.rs +++ b/examples/rp235x/src/bin/pwm.rs | |||
| @@ -18,8 +18,8 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 18 | #[embassy_executor::main] | 18 | #[embassy_executor::main] |
| 19 | async fn main(spawner: Spawner) { | 19 | async 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] |
| 12 | async fn main(spawner: Spawner) { | 12 | async 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 { | |||
| 40 | async fn main(spawner: Spawner) { | 40 | async fn main(spawner: Spawner) { |
| 41 | let p = embassy_stm32::init(Default::default()); | 41 | let p = embassy_stm32::init(Default::default()); |
| 42 | 42 | ||
| 43 | unwrap!(spawner.spawn(blinky(p.PB1))); | 43 | spawner.spawn(unwrap!(blinky(p.PB1))); |
| 44 | // Connect PA8 and PA6 with a 1k Ohm resistor | 44 | // Connect PA8 and PA6 with a 1k Ohm resistor |
| 45 | let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull); | 45 | let ch1_pin = PwmPin::new(p.PA8, OutputType::PushPull); |
| 46 | let mut pwm = SimplePwm::new(p.TIM1, Some(ch1_pin), None, None, None, khz(1), Default::default()); | 46 | let mut pwm = SimplePwm::new(p.TIM1, Some(ch1_pin), None, None, None, khz(1), Default::default()); |
diff --git a/examples/stm32g4/src/bin/i2c_slave.rs b/examples/stm32g4/src/bin/i2c_slave.rs index 8b255b0e6..65aca1c1b 100644 --- a/examples/stm32g4/src/bin/i2c_slave.rs +++ b/examples/stm32g4/src/bin/i2c_slave.rs | |||
| @@ -139,11 +139,11 @@ async fn main(spawner: Spawner) { | |||
| 139 | let device = | 139 | let device = |
| 140 | i2c::I2c::new(p.I2C2, d_scl, d_sda, Irqs, p.DMA1_CH1, p.DMA1_CH2, config).into_slave_multimaster(d_addr_config); | 140 | i2c::I2c::new(p.I2C2, d_scl, d_sda, Irqs, p.DMA1_CH1, p.DMA1_CH2, config).into_slave_multimaster(d_addr_config); |
| 141 | 141 | ||
| 142 | unwrap!(spawner.spawn(device_task(device))); | 142 | spawner.spawn(unwrap!(device_task(device))); |
| 143 | 143 | ||
| 144 | let c_sda = p.PB8; | 144 | let c_sda = p.PB8; |
| 145 | let c_scl = p.PB7; | 145 | let c_scl = p.PB7; |
| 146 | let controller = i2c::I2c::new(p.I2C1, c_sda, c_scl, Irqs, p.DMA1_CH3, p.DMA1_CH4, config); | 146 | let controller = i2c::I2c::new(p.I2C1, c_sda, c_scl, Irqs, p.DMA1_CH3, p.DMA1_CH4, config); |
| 147 | 147 | ||
| 148 | unwrap!(spawner.spawn(controller_task(controller))); | 148 | spawner.spawn(unwrap!(controller_task(controller))); |
| 149 | } | 149 | } |
diff --git a/examples/stm32h5/src/bin/adc_dma.rs b/examples/stm32h5/src/bin/adc_dma.rs index 20073e22f..fb9fcbc5c 100644 --- a/examples/stm32h5/src/bin/adc_dma.rs +++ b/examples/stm32h5/src/bin/adc_dma.rs | |||
| @@ -42,8 +42,8 @@ async fn main(spawner: Spawner) { | |||
| 42 | } | 42 | } |
| 43 | let p = embassy_stm32::init(config); | 43 | let p = embassy_stm32::init(config); |
| 44 | 44 | ||
| 45 | spawner.must_spawn(adc1_task(p.ADC1, p.GPDMA1_CH0, p.PA0, p.PA2)); | 45 | spawner.spawn(unwrap!(adc1_task(p.ADC1, p.GPDMA1_CH0, p.PA0, p.PA2))); |
| 46 | spawner.must_spawn(adc2_task(p.ADC2, p.GPDMA1_CH1, p.PA1, p.PA3)); | 46 | spawner.spawn(unwrap!(adc2_task(p.ADC2, p.GPDMA1_CH1, p.PA1, p.PA3))); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | #[embassy_executor::task] | 49 | #[embassy_executor::task] |
diff --git a/examples/stm32h5/src/bin/eth.rs b/examples/stm32h5/src/bin/eth.rs index 1d85cc1e7..a84fe358b 100644 --- a/examples/stm32h5/src/bin/eth.rs +++ b/examples/stm32h5/src/bin/eth.rs | |||
| @@ -94,7 +94,7 @@ async fn main(spawner: Spawner) -> ! { | |||
| 94 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); | 94 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 95 | 95 | ||
| 96 | // Launch network task | 96 | // Launch network task |
| 97 | unwrap!(spawner.spawn(net_task(runner))); | 97 | spawner.spawn(unwrap!(net_task(runner))); |
| 98 | 98 | ||
| 99 | // Ensure DHCP configuration is up before trying connect | 99 | // Ensure DHCP configuration is up before trying connect |
| 100 | stack.wait_config_up().await; | 100 | stack.wait_config_up().await; |
diff --git a/examples/stm32h5/src/bin/stop.rs b/examples/stm32h5/src/bin/stop.rs index e650791c5..3c4f49f64 100644 --- a/examples/stm32h5/src/bin/stop.rs +++ b/examples/stm32h5/src/bin/stop.rs | |||
| @@ -18,7 +18,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 18 | #[cortex_m_rt::entry] | 18 | #[cortex_m_rt::entry] |
| 19 | fn main() -> ! { | 19 | fn 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] |
| 27 | async fn main(spawner: Spawner) { | 27 | async fn main(spawner: Spawner) { |
| 28 | let _p = embassy_stm32::init(Default::default()); | 28 | let _p = embassy_stm32::init(Default::default()); |
| 29 | unwrap!(spawner.spawn(my_sending_task())); | 29 | spawner.spawn(unwrap!(my_sending_task())); |
| 30 | 30 | ||
| 31 | loop { | 31 | loop { |
| 32 | let received_counter = SIGNAL.wait().await; | 32 | let received_counter = SIGNAL.wait().await; |
diff --git a/examples/stm32h7/src/bin/spi.rs b/examples/stm32h7/src/bin/spi.rs index ad4a8aaf7..dce30a4a7 100644 --- a/examples/stm32h7/src/bin/spi.rs +++ b/examples/stm32h7/src/bin/spi.rs | |||
| @@ -66,6 +66,6 @@ fn main() -> ! { | |||
| 66 | let executor = EXECUTOR.init(Executor::new()); | 66 | let executor = EXECUTOR.init(Executor::new()); |
| 67 | 67 | ||
| 68 | executor.run(|spawner| { | 68 | executor.run(|spawner| { |
| 69 | unwrap!(spawner.spawn(main_task(spi))); | 69 | spawner.spawn(unwrap!(main_task(spi))); |
| 70 | }) | 70 | }) |
| 71 | } | 71 | } |
diff --git a/examples/stm32h7/src/bin/spi_bdma.rs b/examples/stm32h7/src/bin/spi_bdma.rs index 5a7dff572..828f687b8 100644 --- a/examples/stm32h7/src/bin/spi_bdma.rs +++ b/examples/stm32h7/src/bin/spi_bdma.rs | |||
| @@ -80,6 +80,6 @@ fn main() -> ! { | |||
| 80 | let executor = EXECUTOR.init(Executor::new()); | 80 | let executor = EXECUTOR.init(Executor::new()); |
| 81 | 81 | ||
| 82 | executor.run(|spawner| { | 82 | executor.run(|spawner| { |
| 83 | unwrap!(spawner.spawn(main_task(spi))); | 83 | spawner.spawn(unwrap!(main_task(spi))); |
| 84 | }) | 84 | }) |
| 85 | } | 85 | } |
diff --git a/examples/stm32h7/src/bin/spi_dma.rs b/examples/stm32h7/src/bin/spi_dma.rs index 731c7fef5..2197fabce 100644 --- a/examples/stm32h7/src/bin/spi_dma.rs +++ b/examples/stm32h7/src/bin/spi_dma.rs | |||
| @@ -63,6 +63,6 @@ fn main() -> ! { | |||
| 63 | let executor = EXECUTOR.init(Executor::new()); | 63 | let executor = EXECUTOR.init(Executor::new()); |
| 64 | 64 | ||
| 65 | executor.run(|spawner| { | 65 | executor.run(|spawner| { |
| 66 | unwrap!(spawner.spawn(main_task(spi))); | 66 | spawner.spawn(unwrap!(main_task(spi))); |
| 67 | }) | 67 | }) |
| 68 | } | 68 | } |
diff --git a/examples/stm32h7/src/bin/usart.rs b/examples/stm32h7/src/bin/usart.rs index cc49c2fdb..264e7d582 100644 --- a/examples/stm32h7/src/bin/usart.rs +++ b/examples/stm32h7/src/bin/usart.rs | |||
| @@ -34,6 +34,6 @@ fn main() -> ! { | |||
| 34 | let executor = EXECUTOR.init(Executor::new()); | 34 | let executor = EXECUTOR.init(Executor::new()); |
| 35 | 35 | ||
| 36 | executor.run(|spawner| { | 36 | executor.run(|spawner| { |
| 37 | unwrap!(spawner.spawn(main_task())); | 37 | spawner.spawn(unwrap!(main_task())); |
| 38 | }) | 38 | }) |
| 39 | } | 39 | } |
diff --git a/examples/stm32h7/src/bin/usart_dma.rs b/examples/stm32h7/src/bin/usart_dma.rs index 6f340d40a..23d7f193a 100644 --- a/examples/stm32h7/src/bin/usart_dma.rs +++ b/examples/stm32h7/src/bin/usart_dma.rs | |||
| @@ -42,6 +42,6 @@ fn main() -> ! { | |||
| 42 | let executor = EXECUTOR.init(Executor::new()); | 42 | let executor = EXECUTOR.init(Executor::new()); |
| 43 | 43 | ||
| 44 | executor.run(|spawner| { | 44 | executor.run(|spawner| { |
| 45 | unwrap!(spawner.spawn(main_task())); | 45 | spawner.spawn(unwrap!(main_task())); |
| 46 | }) | 46 | }) |
| 47 | } | 47 | } |
diff --git a/examples/stm32h7/src/bin/usart_split.rs b/examples/stm32h7/src/bin/usart_split.rs index 2bb58be5e..464ce8d72 100644 --- a/examples/stm32h7/src/bin/usart_split.rs +++ b/examples/stm32h7/src/bin/usart_split.rs | |||
| @@ -27,7 +27,7 @@ async fn main(spawner: Spawner) -> ! { | |||
| 27 | 27 | ||
| 28 | let (mut tx, rx) = usart.split(); | 28 | let (mut tx, rx) = usart.split(); |
| 29 | 29 | ||
| 30 | unwrap!(spawner.spawn(reader(rx))); | 30 | spawner.spawn(unwrap!(reader(rx))); |
| 31 | 31 | ||
| 32 | loop { | 32 | loop { |
| 33 | let buf = CHANNEL.receive().await; | 33 | let buf = CHANNEL.receive().await; |
diff --git a/examples/stm32h735/src/bin/ltdc.rs b/examples/stm32h735/src/bin/ltdc.rs index a36fdef2c..8a99f745d 100644 --- a/examples/stm32h735/src/bin/ltdc.rs +++ b/examples/stm32h735/src/bin/ltdc.rs | |||
| @@ -47,7 +47,7 @@ async fn main(spawner: Spawner) { | |||
| 47 | 47 | ||
| 48 | // blink the led on another task | 48 | // blink the led on another task |
| 49 | let led = Output::new(p.PC3, Level::High, Speed::Low); | 49 | let led = Output::new(p.PC3, Level::High, Speed::Low); |
| 50 | unwrap!(spawner.spawn(led_task(led))); | 50 | spawner.spawn(unwrap!(led_task(led))); |
| 51 | 51 | ||
| 52 | // numbers from STMicroelectronics/STM32CubeH7 STM32H735G-DK C-based example | 52 | // numbers from STMicroelectronics/STM32CubeH7 STM32H735G-DK C-based example |
| 53 | const RK043FN48H_HSYNC: u16 = 41; // Horizontal synchronization | 53 | const RK043FN48H_HSYNC: u16 = 41; // Horizontal synchronization |
diff --git a/examples/stm32h755cm4/src/bin/intercore.rs b/examples/stm32h755cm4/src/bin/intercore.rs index d5e3e7648..f584e31e9 100644 --- a/examples/stm32h755cm4/src/bin/intercore.rs +++ b/examples/stm32h755cm4/src/bin/intercore.rs | |||
| @@ -128,7 +128,7 @@ async fn main(spawner: Spawner) -> ! { | |||
| 128 | let red_led = Output::new(p.PB14, Level::Low, Speed::Low); // LD3 (heartbeat) | 128 | let red_led = Output::new(p.PB14, Level::Low, Speed::Low); // LD3 (heartbeat) |
| 129 | 129 | ||
| 130 | // Start heartbeat task | 130 | // Start heartbeat task |
| 131 | unwrap!(spawner.spawn(blink_heartbeat(red_led))); | 131 | spawner.spawn(unwrap!(blink_heartbeat(red_led))); |
| 132 | 132 | ||
| 133 | // Track previous values to detect changes | 133 | // Track previous values to detect changes |
| 134 | let mut prev_green = false; | 134 | let mut prev_green = false; |
diff --git a/examples/stm32h7rs/src/bin/eth.rs b/examples/stm32h7rs/src/bin/eth.rs index d8002e9ba..67f541564 100644 --- a/examples/stm32h7rs/src/bin/eth.rs +++ b/examples/stm32h7rs/src/bin/eth.rs | |||
| @@ -94,7 +94,7 @@ async fn main(spawner: Spawner) -> ! { | |||
| 94 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); | 94 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 95 | 95 | ||
| 96 | // Launch network task | 96 | // Launch network task |
| 97 | unwrap!(spawner.spawn(net_task(runner))); | 97 | spawner.spawn(unwrap!(net_task(runner))); |
| 98 | 98 | ||
| 99 | // Ensure DHCP configuration is up before trying connect | 99 | // Ensure DHCP configuration is up before trying connect |
| 100 | //stack.wait_config_up().await; | 100 | //stack.wait_config_up().await; |
diff --git a/examples/stm32h7rs/src/bin/multiprio.rs b/examples/stm32h7rs/src/bin/multiprio.rs index b4620888f..2f2ffdea2 100644 --- a/examples/stm32h7rs/src/bin/multiprio.rs +++ b/examples/stm32h7rs/src/bin/multiprio.rs | |||
| @@ -135,16 +135,16 @@ fn main() -> ! { | |||
| 135 | // High-priority executor: UART4, priority level 6 | 135 | // High-priority executor: UART4, priority level 6 |
| 136 | interrupt::UART4.set_priority(Priority::P6); | 136 | interrupt::UART4.set_priority(Priority::P6); |
| 137 | let spawner = EXECUTOR_HIGH.start(interrupt::UART4); | 137 | let spawner = EXECUTOR_HIGH.start(interrupt::UART4); |
| 138 | unwrap!(spawner.spawn(run_high())); | 138 | spawner.spawn(unwrap!(run_high())); |
| 139 | 139 | ||
| 140 | // Medium-priority executor: UART5, priority level 7 | 140 | // Medium-priority executor: UART5, priority level 7 |
| 141 | interrupt::UART5.set_priority(Priority::P7); | 141 | interrupt::UART5.set_priority(Priority::P7); |
| 142 | let spawner = EXECUTOR_MED.start(interrupt::UART5); | 142 | let spawner = EXECUTOR_MED.start(interrupt::UART5); |
| 143 | unwrap!(spawner.spawn(run_med())); | 143 | spawner.spawn(unwrap!(run_med())); |
| 144 | 144 | ||
| 145 | // Low priority executor: runs in thread mode, using WFE/SEV | 145 | // Low priority executor: runs in thread mode, using WFE/SEV |
| 146 | let executor = EXECUTOR_LOW.init(Executor::new()); | 146 | let executor = EXECUTOR_LOW.init(Executor::new()); |
| 147 | executor.run(|spawner| { | 147 | executor.run(|spawner| { |
| 148 | unwrap!(spawner.spawn(run_low())); | 148 | spawner.spawn(unwrap!(run_low())); |
| 149 | }); | 149 | }); |
| 150 | } | 150 | } |
diff --git a/examples/stm32h7rs/src/bin/signal.rs b/examples/stm32h7rs/src/bin/signal.rs index b73360f32..97309798e 100644 --- a/examples/stm32h7rs/src/bin/signal.rs +++ b/examples/stm32h7rs/src/bin/signal.rs | |||
| @@ -26,7 +26,7 @@ async fn my_sending_task() { | |||
| 26 | #[embassy_executor::main] | 26 | #[embassy_executor::main] |
| 27 | async fn main(spawner: Spawner) { | 27 | async 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] |
| 16 | fn main() -> ! { | 16 | fn main() -> ! { |
| 17 | Executor::take().run(|spawner| { | 17 | Executor::take().run(|spawner| { |
| 18 | unwrap!(spawner.spawn(async_main(spawner))); | 18 | spawner.spawn(unwrap!(async_main(spawner))); |
| 19 | }) | 19 | }) |
| 20 | } | 20 | } |
| 21 | 21 | ||
| @@ -34,8 +34,8 @@ async fn async_main(spawner: Spawner) { | |||
| 34 | let rtc = RTC.init(rtc); | 34 | let rtc = RTC.init(rtc); |
| 35 | embassy_stm32::low_power::stop_with_rtc(rtc); | 35 | embassy_stm32::low_power::stop_with_rtc(rtc); |
| 36 | 36 | ||
| 37 | unwrap!(spawner.spawn(blinky(p.PC7.into()))); | 37 | spawner.spawn(unwrap!(blinky(p.PC7.into()))); |
| 38 | unwrap!(spawner.spawn(timeout())); | 38 | spawner.spawn(unwrap!(timeout())); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | #[embassy_executor::task] | 41 | #[embassy_executor::task] |
diff --git a/examples/stm32l5/src/bin/usb_ethernet.rs b/examples/stm32l5/src/bin/usb_ethernet.rs index 6c72132c6..25aa9ef69 100644 --- a/examples/stm32l5/src/bin/usb_ethernet.rs +++ b/examples/stm32l5/src/bin/usb_ethernet.rs | |||
| @@ -96,11 +96,11 @@ async fn main(spawner: Spawner) { | |||
| 96 | // Build the builder. | 96 | // Build the builder. |
| 97 | let usb = builder.build(); | 97 | let usb = builder.build(); |
| 98 | 98 | ||
| 99 | unwrap!(spawner.spawn(usb_task(usb))); | 99 | spawner.spawn(unwrap!(usb_task(usb))); |
| 100 | 100 | ||
| 101 | static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); | 101 | static NET_STATE: StaticCell<NetState<MTU, 4, 4>> = StaticCell::new(); |
| 102 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); | 102 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(NET_STATE.init(NetState::new()), our_mac_addr); |
| 103 | unwrap!(spawner.spawn(usb_ncm_task(runner))); | 103 | spawner.spawn(unwrap!(usb_ncm_task(runner))); |
| 104 | 104 | ||
| 105 | let config = embassy_net::Config::dhcpv4(Default::default()); | 105 | let config = embassy_net::Config::dhcpv4(Default::default()); |
| 106 | //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { | 106 | //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { |
| @@ -117,7 +117,7 @@ async fn main(spawner: Spawner) { | |||
| 117 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 117 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 118 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); | 118 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 119 | 119 | ||
| 120 | unwrap!(spawner.spawn(net_task(runner))); | 120 | spawner.spawn(unwrap!(net_task(runner))); |
| 121 | 121 | ||
| 122 | // And now we can use it! | 122 | // And now we can use it! |
| 123 | 123 | ||
diff --git a/examples/stm32u5/src/bin/ltdc.rs b/examples/stm32u5/src/bin/ltdc.rs index bd59a9148..46d1c120f 100644 --- a/examples/stm32u5/src/bin/ltdc.rs +++ b/examples/stm32u5/src/bin/ltdc.rs | |||
| @@ -50,7 +50,7 @@ async fn main(spawner: Spawner) { | |||
| 50 | 50 | ||
| 51 | // blink the led on another task | 51 | // blink the led on another task |
| 52 | let led = Output::new(p.PD2, Level::High, Speed::Low); | 52 | let led = Output::new(p.PD2, Level::High, Speed::Low); |
| 53 | unwrap!(spawner.spawn(led_task(led))); | 53 | spawner.spawn(unwrap!(led_task(led))); |
| 54 | 54 | ||
| 55 | // numbers from STM32U5G9J-DK2.ioc | 55 | // numbers from STM32U5G9J-DK2.ioc |
| 56 | const RK050HR18H_HSYNC: u16 = 5; // Horizontal synchronization | 56 | const RK050HR18H_HSYNC: u16 = 5; // Horizontal synchronization |
diff --git a/examples/stm32wb/src/bin/gatt_server.rs b/examples/stm32wb/src/bin/gatt_server.rs index 9864fa026..5d927bc00 100644 --- a/examples/stm32wb/src/bin/gatt_server.rs +++ b/examples/stm32wb/src/bin/gatt_server.rs | |||
| @@ -71,7 +71,7 @@ async fn main(spawner: Spawner) { | |||
| 71 | let config = Config::default(); | 71 | let config = Config::default(); |
| 72 | let mut mbox = TlMbox::init(p.IPCC, Irqs, config); | 72 | let mut mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 73 | 73 | ||
| 74 | spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); | 74 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 75 | let sys_event = mbox.sys_subsystem.read().await; | 75 | let sys_event = mbox.sys_subsystem.read().await; |
| 76 | info!("sys event: {}", sys_event.payload()); | 76 | info!("sys event: {}", sys_event.payload()); |
| 77 | 77 | ||
diff --git a/examples/stm32wb/src/bin/mac_ffd.rs b/examples/stm32wb/src/bin/mac_ffd.rs index d139aa61b..ede6cf4b9 100644 --- a/examples/stm32wb/src/bin/mac_ffd.rs +++ b/examples/stm32wb/src/bin/mac_ffd.rs | |||
| @@ -56,7 +56,7 @@ async fn main(spawner: Spawner) { | |||
| 56 | let config = Config::default(); | 56 | let config = Config::default(); |
| 57 | let mbox = TlMbox::init(p.IPCC, Irqs, config); | 57 | let mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 58 | 58 | ||
| 59 | spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); | 59 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 60 | 60 | ||
| 61 | let sys_event = mbox.sys_subsystem.read().await; | 61 | let sys_event = mbox.sys_subsystem.read().await; |
| 62 | info!("sys event: {}", sys_event.payload()); | 62 | info!("sys event: {}", sys_event.payload()); |
diff --git a/examples/stm32wb/src/bin/mac_ffd_net.rs b/examples/stm32wb/src/bin/mac_ffd_net.rs index 6a97daf4d..cc3b21e2e 100644 --- a/examples/stm32wb/src/bin/mac_ffd_net.rs +++ b/examples/stm32wb/src/bin/mac_ffd_net.rs | |||
| @@ -62,7 +62,7 @@ async fn main(spawner: Spawner) { | |||
| 62 | let config = Config::default(); | 62 | let config = Config::default(); |
| 63 | let mbox = TlMbox::init(p.IPCC, Irqs, config); | 63 | let mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 64 | 64 | ||
| 65 | spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); | 65 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 66 | 66 | ||
| 67 | let sys_event = mbox.sys_subsystem.read().await; | 67 | let sys_event = mbox.sys_subsystem.read().await; |
| 68 | info!("sys event: {}", sys_event.payload()); | 68 | info!("sys event: {}", sys_event.payload()); |
| @@ -168,7 +168,7 @@ async fn main(spawner: Spawner) { | |||
| 168 | static RUNNER: StaticCell<Runner> = StaticCell::new(); | 168 | static RUNNER: StaticCell<Runner> = StaticCell::new(); |
| 169 | let runner = RUNNER.init(Runner::new(mbox.mac_subsystem, tx_queue)); | 169 | let runner = RUNNER.init(Runner::new(mbox.mac_subsystem, tx_queue)); |
| 170 | 170 | ||
| 171 | spawner.spawn(run_mac(runner)).unwrap(); | 171 | spawner.spawn(run_mac(runner).unwrap()); |
| 172 | 172 | ||
| 173 | let (driver, control) = mac::new(runner).await; | 173 | let (driver, control) = mac::new(runner).await; |
| 174 | 174 | ||
diff --git a/examples/stm32wb/src/bin/mac_rfd.rs b/examples/stm32wb/src/bin/mac_rfd.rs index 9062bdcd2..d872104a8 100644 --- a/examples/stm32wb/src/bin/mac_rfd.rs +++ b/examples/stm32wb/src/bin/mac_rfd.rs | |||
| @@ -58,7 +58,7 @@ async fn main(spawner: Spawner) { | |||
| 58 | let config = Config::default(); | 58 | let config = Config::default(); |
| 59 | let mbox = TlMbox::init(p.IPCC, Irqs, config); | 59 | let mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 60 | 60 | ||
| 61 | spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); | 61 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 62 | 62 | ||
| 63 | let sys_event = mbox.sys_subsystem.read().await; | 63 | let sys_event = mbox.sys_subsystem.read().await; |
| 64 | info!("sys event: {}", sys_event.payload()); | 64 | info!("sys event: {}", sys_event.payload()); |
diff --git a/examples/stm32wb/src/bin/tl_mbox_mac.rs b/examples/stm32wb/src/bin/tl_mbox_mac.rs index 9224e626d..95c73872b 100644 --- a/examples/stm32wb/src/bin/tl_mbox_mac.rs +++ b/examples/stm32wb/src/bin/tl_mbox_mac.rs | |||
| @@ -53,7 +53,7 @@ async fn main(spawner: Spawner) { | |||
| 53 | let config = Config::default(); | 53 | let config = Config::default(); |
| 54 | let mbox = TlMbox::init(p.IPCC, Irqs, config); | 54 | let mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 55 | 55 | ||
| 56 | spawner.spawn(run_mm_queue(mbox.mm_subsystem)).unwrap(); | 56 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 57 | 57 | ||
| 58 | let sys_event = mbox.sys_subsystem.read().await; | 58 | let sys_event = mbox.sys_subsystem.read().await; |
| 59 | info!("sys event: {}", sys_event.payload()); | 59 | info!("sys event: {}", sys_event.payload()); |
diff --git a/examples/wasm/src/lib.rs b/examples/wasm/src/lib.rs index 71cf980dd..170c97fb7 100644 --- a/examples/wasm/src/lib.rs +++ b/examples/wasm/src/lib.rs | |||
| @@ -24,5 +24,5 @@ async fn ticker() { | |||
| 24 | #[embassy_executor::main] | 24 | #[embassy_executor::main] |
| 25 | async fn main(spawner: Spawner) { | 25 | async 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] |
| 20 | fn main() -> ! { | 20 | fn 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()); |
