diff options
Diffstat (limited to 'embassy-hal-internal')
| -rw-r--r-- | embassy-hal-internal/Cargo.toml | 2 | ||||
| -rw-r--r-- | embassy-hal-internal/src/atomic_ring_buffer.rs | 43 | ||||
| -rw-r--r-- | embassy-hal-internal/src/interrupt.rs | 2 | ||||
| -rw-r--r-- | embassy-hal-internal/src/lib.rs | 1 | ||||
| -rw-r--r-- | embassy-hal-internal/src/macros.rs | 2 |
5 files changed, 45 insertions, 5 deletions
diff --git a/embassy-hal-internal/Cargo.toml b/embassy-hal-internal/Cargo.toml index 11dcc2466..c2e0bd30f 100644 --- a/embassy-hal-internal/Cargo.toml +++ b/embassy-hal-internal/Cargo.toml | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | [package] | 1 | [package] |
| 2 | name = "embassy-hal-internal" | 2 | name = "embassy-hal-internal" |
| 3 | version = "0.3.0" | 3 | version = "0.3.0" |
| 4 | edition = "2021" | 4 | edition = "2024" |
| 5 | license = "MIT OR Apache-2.0" | 5 | license = "MIT OR Apache-2.0" |
| 6 | description = "Internal implementation details for Embassy HALs. DO NOT USE DIRECTLY." | 6 | description = "Internal implementation details for Embassy HALs. DO NOT USE DIRECTLY." |
| 7 | repository = "https://github.com/embassy-rs/embassy" | 7 | repository = "https://github.com/embassy-rs/embassy" |
diff --git a/embassy-hal-internal/src/atomic_ring_buffer.rs b/embassy-hal-internal/src/atomic_ring_buffer.rs index 00b7a1249..8c3889b85 100644 --- a/embassy-hal-internal/src/atomic_ring_buffer.rs +++ b/embassy-hal-internal/src/atomic_ring_buffer.rs | |||
| @@ -133,6 +133,18 @@ impl RingBuffer { | |||
| 133 | self.len.load(Ordering::Relaxed) | 133 | self.len.load(Ordering::Relaxed) |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | /// Return number of items available to read. | ||
| 137 | pub fn available(&self) -> usize { | ||
| 138 | let end = self.end.load(Ordering::Relaxed); | ||
| 139 | let len = self.len.load(Ordering::Relaxed); | ||
| 140 | let start = self.start.load(Ordering::Relaxed); | ||
| 141 | if end >= start { | ||
| 142 | end - start | ||
| 143 | } else { | ||
| 144 | 2 * len - start + end | ||
| 145 | } | ||
| 146 | } | ||
| 147 | |||
| 136 | /// Check if buffer is full. | 148 | /// Check if buffer is full. |
| 137 | pub fn is_full(&self) -> bool { | 149 | pub fn is_full(&self) -> bool { |
| 138 | let len = self.len.load(Ordering::Relaxed); | 150 | let len = self.len.load(Ordering::Relaxed); |
| @@ -142,6 +154,11 @@ impl RingBuffer { | |||
| 142 | self.wrap(start + len) == end | 154 | self.wrap(start + len) == end |
| 143 | } | 155 | } |
| 144 | 156 | ||
| 157 | /// Check if buffer is at least half full. | ||
| 158 | pub fn is_half_full(&self) -> bool { | ||
| 159 | self.available() >= self.len.load(Ordering::Relaxed) / 2 | ||
| 160 | } | ||
| 161 | |||
| 145 | /// Check if buffer is empty. | 162 | /// Check if buffer is empty. |
| 146 | pub fn is_empty(&self) -> bool { | 163 | pub fn is_empty(&self) -> bool { |
| 147 | let start = self.start.load(Ordering::Relaxed); | 164 | let start = self.start.load(Ordering::Relaxed); |
| @@ -394,6 +411,7 @@ mod tests { | |||
| 394 | rb.init(b.as_mut_ptr(), 4); | 411 | rb.init(b.as_mut_ptr(), 4); |
| 395 | 412 | ||
| 396 | assert_eq!(rb.is_empty(), true); | 413 | assert_eq!(rb.is_empty(), true); |
| 414 | assert_eq!(rb.is_half_full(), false); | ||
| 397 | assert_eq!(rb.is_full(), false); | 415 | assert_eq!(rb.is_full(), false); |
| 398 | 416 | ||
| 399 | rb.writer().push(|buf| { | 417 | rb.writer().push(|buf| { |
| @@ -406,6 +424,7 @@ mod tests { | |||
| 406 | }); | 424 | }); |
| 407 | 425 | ||
| 408 | assert_eq!(rb.is_empty(), false); | 426 | assert_eq!(rb.is_empty(), false); |
| 427 | assert_eq!(rb.is_half_full(), true); | ||
| 409 | assert_eq!(rb.is_full(), true); | 428 | assert_eq!(rb.is_full(), true); |
| 410 | 429 | ||
| 411 | rb.writer().push(|buf| { | 430 | rb.writer().push(|buf| { |
| @@ -415,6 +434,7 @@ mod tests { | |||
| 415 | }); | 434 | }); |
| 416 | 435 | ||
| 417 | assert_eq!(rb.is_empty(), false); | 436 | assert_eq!(rb.is_empty(), false); |
| 437 | assert_eq!(rb.is_half_full(), true); | ||
| 418 | assert_eq!(rb.is_full(), true); | 438 | assert_eq!(rb.is_full(), true); |
| 419 | 439 | ||
| 420 | rb.reader().pop(|buf| { | 440 | rb.reader().pop(|buf| { |
| @@ -424,6 +444,7 @@ mod tests { | |||
| 424 | }); | 444 | }); |
| 425 | 445 | ||
| 426 | assert_eq!(rb.is_empty(), false); | 446 | assert_eq!(rb.is_empty(), false); |
| 447 | assert_eq!(rb.is_half_full(), true); | ||
| 427 | assert_eq!(rb.is_full(), false); | 448 | assert_eq!(rb.is_full(), false); |
| 428 | 449 | ||
| 429 | rb.reader().pop(|buf| { | 450 | rb.reader().pop(|buf| { |
| @@ -432,6 +453,7 @@ mod tests { | |||
| 432 | }); | 453 | }); |
| 433 | 454 | ||
| 434 | assert_eq!(rb.is_empty(), false); | 455 | assert_eq!(rb.is_empty(), false); |
| 456 | assert_eq!(rb.is_half_full(), true); | ||
| 435 | assert_eq!(rb.is_full(), false); | 457 | assert_eq!(rb.is_full(), false); |
| 436 | 458 | ||
| 437 | rb.reader().pop(|buf| { | 459 | rb.reader().pop(|buf| { |
| @@ -447,6 +469,7 @@ mod tests { | |||
| 447 | }); | 469 | }); |
| 448 | 470 | ||
| 449 | assert_eq!(rb.is_empty(), true); | 471 | assert_eq!(rb.is_empty(), true); |
| 472 | assert_eq!(rb.is_half_full(), false); | ||
| 450 | assert_eq!(rb.is_full(), false); | 473 | assert_eq!(rb.is_full(), false); |
| 451 | 474 | ||
| 452 | rb.reader().pop(|buf| { | 475 | rb.reader().pop(|buf| { |
| @@ -460,14 +483,28 @@ mod tests { | |||
| 460 | 1 | 483 | 1 |
| 461 | }); | 484 | }); |
| 462 | 485 | ||
| 486 | assert_eq!(rb.is_empty(), false); | ||
| 487 | assert_eq!(rb.is_half_full(), false); | ||
| 488 | assert_eq!(rb.is_full(), false); | ||
| 489 | |||
| 463 | rb.writer().push(|buf| { | 490 | rb.writer().push(|buf| { |
| 464 | assert_eq!(3, buf.len()); | 491 | assert_eq!(3, buf.len()); |
| 465 | buf[0] = 11; | 492 | buf[0] = 11; |
| 466 | buf[1] = 12; | 493 | 1 |
| 467 | 2 | 494 | }); |
| 495 | |||
| 496 | assert_eq!(rb.is_empty(), false); | ||
| 497 | assert_eq!(rb.is_half_full(), true); | ||
| 498 | assert_eq!(rb.is_full(), false); | ||
| 499 | |||
| 500 | rb.writer().push(|buf| { | ||
| 501 | assert_eq!(2, buf.len()); | ||
| 502 | buf[0] = 12; | ||
| 503 | 1 | ||
| 468 | }); | 504 | }); |
| 469 | 505 | ||
| 470 | assert_eq!(rb.is_empty(), false); | 506 | assert_eq!(rb.is_empty(), false); |
| 507 | assert_eq!(rb.is_half_full(), true); | ||
| 471 | assert_eq!(rb.is_full(), false); | 508 | assert_eq!(rb.is_full(), false); |
| 472 | 509 | ||
| 473 | rb.writer().push(|buf| { | 510 | rb.writer().push(|buf| { |
| @@ -477,6 +514,7 @@ mod tests { | |||
| 477 | }); | 514 | }); |
| 478 | 515 | ||
| 479 | assert_eq!(rb.is_empty(), false); | 516 | assert_eq!(rb.is_empty(), false); |
| 517 | assert_eq!(rb.is_half_full(), true); | ||
| 480 | assert_eq!(rb.is_full(), true); | 518 | assert_eq!(rb.is_full(), true); |
| 481 | } | 519 | } |
| 482 | } | 520 | } |
| @@ -490,6 +528,7 @@ mod tests { | |||
| 490 | rb.init(b.as_mut_ptr(), b.len()); | 528 | rb.init(b.as_mut_ptr(), b.len()); |
| 491 | 529 | ||
| 492 | assert_eq!(rb.is_empty(), true); | 530 | assert_eq!(rb.is_empty(), true); |
| 531 | assert_eq!(rb.is_half_full(), true); | ||
| 493 | assert_eq!(rb.is_full(), true); | 532 | assert_eq!(rb.is_full(), true); |
| 494 | 533 | ||
| 495 | rb.writer().push(|buf| { | 534 | rb.writer().push(|buf| { |
diff --git a/embassy-hal-internal/src/interrupt.rs b/embassy-hal-internal/src/interrupt.rs index 5e64dce9d..ce6057e2d 100644 --- a/embassy-hal-internal/src/interrupt.rs +++ b/embassy-hal-internal/src/interrupt.rs | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | //! Interrupt handling for cortex-m devices. | 1 | //! Interrupt handling for cortex-m devices. |
| 2 | use core::mem; | 2 | use core::mem; |
| 3 | use core::sync::atomic::{compiler_fence, Ordering}; | 3 | use core::sync::atomic::{Ordering, compiler_fence}; |
| 4 | 4 | ||
| 5 | use cortex_m::interrupt::InterruptNumber; | 5 | use cortex_m::interrupt::InterruptNumber; |
| 6 | use cortex_m::peripheral::NVIC; | 6 | use cortex_m::peripheral::NVIC; |
diff --git a/embassy-hal-internal/src/lib.rs b/embassy-hal-internal/src/lib.rs index 7addb71e2..729f97f0c 100644 --- a/embassy-hal-internal/src/lib.rs +++ b/embassy-hal-internal/src/lib.rs | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![allow(clippy::new_without_default)] | 2 | #![allow(clippy::new_without_default)] |
| 3 | #![allow(unsafe_op_in_unsafe_fn)] | ||
| 3 | #![doc = include_str!("../README.md")] | 4 | #![doc = include_str!("../README.md")] |
| 4 | #![warn(missing_docs)] | 5 | #![warn(missing_docs)] |
| 5 | 6 | ||
diff --git a/embassy-hal-internal/src/macros.rs b/embassy-hal-internal/src/macros.rs index ce72ded5c..0fcca2baf 100644 --- a/embassy-hal-internal/src/macros.rs +++ b/embassy-hal-internal/src/macros.rs | |||
| @@ -58,7 +58,7 @@ macro_rules! peripherals_struct { | |||
| 58 | ///Returns all the peripherals *once* | 58 | ///Returns all the peripherals *once* |
| 59 | #[inline] | 59 | #[inline] |
| 60 | pub(crate) fn take_with_cs(_cs: critical_section::CriticalSection) -> Self { | 60 | pub(crate) fn take_with_cs(_cs: critical_section::CriticalSection) -> Self { |
| 61 | #[no_mangle] | 61 | #[unsafe(no_mangle)] |
| 62 | static mut _EMBASSY_DEVICE_PERIPHERALS: bool = false; | 62 | static mut _EMBASSY_DEVICE_PERIPHERALS: bool = false; |
| 63 | 63 | ||
| 64 | // safety: OK because we're inside a CS. | 64 | // safety: OK because we're inside a CS. |
