From 71c2ba0854d57eef946bf786781563003afba5cf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 29 Oct 2025 16:01:41 +0100 Subject: [PATCH] fix portable atomic support --- Cargo.toml | 3 ++- README.md | 3 +++ justfile | 1 + src/lib.rs | 3 +++ src/seq_count.rs | 20 ++++++++++++-------- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b91cca0..9145993 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ num_enum = { version = ">0.5, <=0.7", default-features = false } num-traits = { version = "0.2", default-features = false } serde = { version = "1", optional = true, default-features = false, features = ["derive"] } arbitrary-int = { version = "2" } -portable-atomic = "1" +portable-atomic = { version = "1", optional = true } bitbybit = "1.4" time = { version = "0.3", default-features = false, optional = true } @@ -32,6 +32,7 @@ defmt = { version = "1", default-features = false, optional = true } [features] default = ["std"] std = ["alloc", "chrono/std", "chrono/clock", "thiserror/std"] +portable-atomic = ["dep:portable-atomic", "portable-atomic/require-cas"] defmt = ["dep:defmt", "arbitrary-int/defmt"] serde = ["dep:serde", "chrono?/serde", "arbitrary-int/serde"] alloc = ["chrono?/alloc", "defmt?/alloc", "serde?/alloc"] diff --git a/README.md b/README.md index 7f2e05a..c2fdb6a 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,9 @@ Currently, this includes the following components: - [`timelib`](https://crates.io/crates/time): Add basic support for the `time` time library. - [`defmt`](https://defmt.ferrous-systems.com/): Add support for the `defmt` by adding the [`defmt::Format`](https://defmt.ferrous-systems.com/format) derive on many types. + - [`portable-atomic`](https://github.com/taiki-e/portable-atomic): Basic support for `portable-atomic` + crate in addition to the support for core atomic types. This support requires atomic CAS support + enabled in the portable atomic crate. # Examples diff --git a/justfile b/justfile index 75d5aee..b442f56 100644 --- a/justfile +++ b/justfile @@ -11,6 +11,7 @@ check: embedded: cargo build --target thumbv7em-none-eabihf --no-default-features + cargo build --target thumbv6m-none-eabi --no-default-features test: cargo nextest r --all-features diff --git a/src/lib.rs b/src/lib.rs index 5012d86..77f93fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,9 @@ //! - [`timelib`](https://crates.io/crates/time): Add basic support for the `time` time library. //! - [`defmt`](https://defmt.ferrous-systems.com/): Add support for the `defmt` by adding the //! [`defmt::Format`](https://defmt.ferrous-systems.com/format) derive on many types. +//! - [`portable-atomic`]: Basic support for `portable-atomic` crate in addition to the support +//! for core atomic types. This support requires atomic CAS support enabled in the portable +//! atomic crate. //! //! ## Module //! diff --git a/src/seq_count.rs b/src/seq_count.rs index c52eb2b..20d6c38 100644 --- a/src/seq_count.rs +++ b/src/seq_count.rs @@ -184,59 +184,63 @@ impl SequenceCounter for core::sync::atomic::AtomicU64 { } } +#[cfg(feature = "portable-atomic")] impl SequenceCounter for portable_atomic::AtomicU8 { type Raw = u8; const MAX_BIT_WIDTH: usize = 8; fn get(&self) -> Self::Raw { - self.load(core::sync::atomic::Ordering::Relaxed) + self.load(portable_atomic::Ordering::Relaxed) } fn increment(&self) { - self.fetch_add(1, core::sync::atomic::Ordering::Relaxed); + self.fetch_add(1, portable_atomic::Ordering::Relaxed); } } +#[cfg(feature = "portable-atomic")] impl SequenceCounter for portable_atomic::AtomicU16 { type Raw = u16; const MAX_BIT_WIDTH: usize = 16; fn get(&self) -> Self::Raw { - self.load(core::sync::atomic::Ordering::Relaxed) + self.load(portable_atomic::Ordering::Relaxed) } fn increment(&self) { - self.fetch_add(1, core::sync::atomic::Ordering::Relaxed); + self.fetch_add(1, portable_atomic::Ordering::Relaxed); } } +#[cfg(feature = "portable-atomic")] impl SequenceCounter for portable_atomic::AtomicU32 { type Raw = u32; const MAX_BIT_WIDTH: usize = 32; fn get(&self) -> Self::Raw { - self.load(core::sync::atomic::Ordering::Relaxed) + self.load(portable_atomic::Ordering::Relaxed) } fn increment(&self) { - self.fetch_add(1, core::sync::atomic::Ordering::Relaxed); + self.fetch_add(1, portable_atomic::Ordering::Relaxed); } } +#[cfg(feature = "portable-atomic")] impl SequenceCounter for portable_atomic::AtomicU64 { type Raw = u64; const MAX_BIT_WIDTH: usize = 64; fn get(&self) -> Self::Raw { - self.load(core::sync::atomic::Ordering::Relaxed) + self.load(portable_atomic::Ordering::Relaxed) } fn increment(&self) { - self.fetch_add(1, core::sync::atomic::Ordering::Relaxed); + self.fetch_add(1, portable_atomic::Ordering::Relaxed); } }