mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-27 14:04:56 +01:00
Started
This commit is contained in:
parent
7a2f605b52
commit
a76f650c46
3 changed files with 92 additions and 1 deletions
|
@ -28,6 +28,7 @@ portable-atomic = { version = "1", default-features = false }
|
||||||
embedded-hal = { version = "1.0", optional = true }
|
embedded-hal = { version = "1.0", optional = true }
|
||||||
embedded-hal-async = { version = "1.0", optional = true }
|
embedded-hal-async = { version = "1.0", optional = true }
|
||||||
embedded-hal-bus = { version = "0.1.0", optional = true, features = ["async"] }
|
embedded-hal-bus = { version = "0.1.0", optional = true, features = ["async"] }
|
||||||
|
bitflags = "2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tokio = { version = "1", features = ["rt", "macros", "time"] }
|
tokio = { version = "1", features = ["rt", "macros", "time"] }
|
||||||
|
|
89
rtic-sync/src/bit_channel.rs
Normal file
89
rtic-sync/src/bit_channel.rs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
//! A channel operating on bitflags.
|
||||||
|
|
||||||
|
use bitflags::{Bits, Flags};
|
||||||
|
use core::sync::atomic::{AtomicU16, AtomicU8, Ordering};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bit channel
|
||||||
|
//
|
||||||
|
|
||||||
|
pub struct BitChannel<T: Flags>
|
||||||
|
where
|
||||||
|
T: Flags,
|
||||||
|
T::Bits: AtomicType,
|
||||||
|
{
|
||||||
|
atomic: <T::Bits as AtomicType>::Atomic,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> BitChannel<T>
|
||||||
|
where
|
||||||
|
T: Flags,
|
||||||
|
T::Bits: AtomicType,
|
||||||
|
{
|
||||||
|
pub const fn new() -> Self {
|
||||||
|
BitChannel {
|
||||||
|
atomic: T::Bits::ATOMIC_ZERO,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test(&self) {
|
||||||
|
T::Bits::fetch_and(&self.atomic, T::Bits::EMPTY, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait AtomicType: Sized {
|
||||||
|
type Atomic: From<Self>;
|
||||||
|
|
||||||
|
const ATOMIC_ZERO: Self::Atomic;
|
||||||
|
|
||||||
|
fn fetch_and(a: &Self::Atomic, b: Self, order: Ordering) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AtomicType for u16 {
|
||||||
|
type Atomic = AtomicU16;
|
||||||
|
|
||||||
|
const ATOMIC_ZERO: Self::Atomic = AtomicU16::new(0);
|
||||||
|
|
||||||
|
fn fetch_and(a: &Self::Atomic, b: Self, order: Ordering) -> Self {
|
||||||
|
a.fetch_and(b, order)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AtomicType for u8 {
|
||||||
|
type Atomic = AtomicU8;
|
||||||
|
|
||||||
|
const ATOMIC_ZERO: Self::Atomic = AtomicU8::new(0);
|
||||||
|
|
||||||
|
fn fetch_and(a: &Self::Atomic, b: Self, order: Ordering) -> Self {
|
||||||
|
a.fetch_and(b, order)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// etc...
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use bitflags::bitflags;
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
struct FlagsU8: u8 {
|
||||||
|
const A = 1;
|
||||||
|
const B = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
struct FlagsU16: u16 {
|
||||||
|
const A = 1;
|
||||||
|
const B = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test() {
|
||||||
|
let a = BitChannel::<FlagsU8>::new();
|
||||||
|
let b = BitChannel::<FlagsU16>::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
//! Synchronization primitives for asynchronous contexts.
|
//! Synchronization primitives for asynchronous contexts.
|
||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![deny(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
pub mod arbiter;
|
pub mod arbiter;
|
||||||
|
pub mod bit_channel;
|
||||||
pub mod channel;
|
pub mod channel;
|
||||||
pub use portable_atomic;
|
pub use portable_atomic;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue