aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-internal
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-hal-internal')
-rw-r--r--embassy-hal-internal/Cargo.toml2
-rw-r--r--embassy-hal-internal/src/atomic_ring_buffer.rs43
-rw-r--r--embassy-hal-internal/src/interrupt.rs2
-rw-r--r--embassy-hal-internal/src/lib.rs1
-rw-r--r--embassy-hal-internal/src/macros.rs2
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]
2name = "embassy-hal-internal" 2name = "embassy-hal-internal"
3version = "0.3.0" 3version = "0.3.0"
4edition = "2021" 4edition = "2024"
5license = "MIT OR Apache-2.0" 5license = "MIT OR Apache-2.0"
6description = "Internal implementation details for Embassy HALs. DO NOT USE DIRECTLY." 6description = "Internal implementation details for Embassy HALs. DO NOT USE DIRECTLY."
7repository = "https://github.com/embassy-rs/embassy" 7repository = "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.
2use core::mem; 2use core::mem;
3use core::sync::atomic::{compiler_fence, Ordering}; 3use core::sync::atomic::{Ordering, compiler_fence};
4 4
5use cortex_m::interrupt::InterruptNumber; 5use cortex_m::interrupt::InterruptNumber;
6use cortex_m::peripheral::NVIC; 6use 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.