diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-08-31 20:50:20 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-31 20:50:20 +0200 |
| commit | 4cd86e5e76ca8eaa2e2cb8bcca0ec9a0f574b409 (patch) | |
| tree | 3646ad79bdedf07b2530366c03c857ebac52a6ee /embassy-executor/src/raw | |
| parent | 629d224a7614989d79448a1cf17e345be79a0d4b (diff) | |
| parent | 71a2e81754c3fa56cf7e3e1135a5805d6e1b77ec (diff) | |
Merge branch 'main' into feat/name-main-task
Diffstat (limited to 'embassy-executor/src/raw')
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 10 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_atomics.rs | 21 | ||||
| -rw-r--r-- | embassy-executor/src/raw/state_critical_section.rs | 15 |
3 files changed, 34 insertions, 12 deletions
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index bdaa32951..4280c5750 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -12,8 +12,14 @@ | |||
| 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 = "_any_trace")] | 25 | #[cfg(feature = "_any_trace")] |
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); |
