aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-internal
diff options
context:
space:
mode:
authorAdam Greig <[email protected]>2025-09-15 03:32:23 +0100
committerAdam Greig <[email protected]>2025-10-01 21:11:05 +0100
commit2e9f3a815d440f33126d47cdcbf3bf1c9eab0ee1 (patch)
tree804288b17bd9119dd4f22b7b27fd4227e9a94d28 /embassy-hal-internal
parentd382bf0b833e7d9a8e90b8064af1bb63030f0c68 (diff)
STM32: USART: Add `eager_reads` config option
Diffstat (limited to 'embassy-hal-internal')
-rw-r--r--embassy-hal-internal/src/atomic_ring_buffer.rs39
1 files changed, 37 insertions, 2 deletions
diff --git a/embassy-hal-internal/src/atomic_ring_buffer.rs b/embassy-hal-internal/src/atomic_ring_buffer.rs
index 00b7a1249..7de96e4e2 100644
--- a/embassy-hal-internal/src/atomic_ring_buffer.rs
+++ b/embassy-hal-internal/src/atomic_ring_buffer.rs
@@ -142,6 +142,19 @@ impl RingBuffer {
142 self.wrap(start + len) == end 142 self.wrap(start + len) == end
143 } 143 }
144 144
145 /// Check if buffer is at least half full.
146 pub fn is_half_full(&self) -> bool {
147 let len = self.len.load(Ordering::Relaxed);
148 let start = self.start.load(Ordering::Relaxed);
149 let end = self.end.load(Ordering::Relaxed);
150 let n = if end >= start {
151 end - start
152 } else {
153 2 * len - start + end
154 };
155 n >= len / 2
156 }
157
145 /// Check if buffer is empty. 158 /// Check if buffer is empty.
146 pub fn is_empty(&self) -> bool { 159 pub fn is_empty(&self) -> bool {
147 let start = self.start.load(Ordering::Relaxed); 160 let start = self.start.load(Ordering::Relaxed);
@@ -394,6 +407,7 @@ mod tests {
394 rb.init(b.as_mut_ptr(), 4); 407 rb.init(b.as_mut_ptr(), 4);
395 408
396 assert_eq!(rb.is_empty(), true); 409 assert_eq!(rb.is_empty(), true);
410 assert_eq!(rb.is_half_full(), false);
397 assert_eq!(rb.is_full(), false); 411 assert_eq!(rb.is_full(), false);
398 412
399 rb.writer().push(|buf| { 413 rb.writer().push(|buf| {
@@ -406,6 +420,7 @@ mod tests {
406 }); 420 });
407 421
408 assert_eq!(rb.is_empty(), false); 422 assert_eq!(rb.is_empty(), false);
423 assert_eq!(rb.is_half_full(), true);
409 assert_eq!(rb.is_full(), true); 424 assert_eq!(rb.is_full(), true);
410 425
411 rb.writer().push(|buf| { 426 rb.writer().push(|buf| {
@@ -415,6 +430,7 @@ mod tests {
415 }); 430 });
416 431
417 assert_eq!(rb.is_empty(), false); 432 assert_eq!(rb.is_empty(), false);
433 assert_eq!(rb.is_half_full(), true);
418 assert_eq!(rb.is_full(), true); 434 assert_eq!(rb.is_full(), true);
419 435
420 rb.reader().pop(|buf| { 436 rb.reader().pop(|buf| {
@@ -424,6 +440,7 @@ mod tests {
424 }); 440 });
425 441
426 assert_eq!(rb.is_empty(), false); 442 assert_eq!(rb.is_empty(), false);
443 assert_eq!(rb.is_half_full(), true);
427 assert_eq!(rb.is_full(), false); 444 assert_eq!(rb.is_full(), false);
428 445
429 rb.reader().pop(|buf| { 446 rb.reader().pop(|buf| {
@@ -432,6 +449,7 @@ mod tests {
432 }); 449 });
433 450
434 assert_eq!(rb.is_empty(), false); 451 assert_eq!(rb.is_empty(), false);
452 assert_eq!(rb.is_half_full(), true);
435 assert_eq!(rb.is_full(), false); 453 assert_eq!(rb.is_full(), false);
436 454
437 rb.reader().pop(|buf| { 455 rb.reader().pop(|buf| {
@@ -447,6 +465,7 @@ mod tests {
447 }); 465 });
448 466
449 assert_eq!(rb.is_empty(), true); 467 assert_eq!(rb.is_empty(), true);
468 assert_eq!(rb.is_half_full(), false);
450 assert_eq!(rb.is_full(), false); 469 assert_eq!(rb.is_full(), false);
451 470
452 rb.reader().pop(|buf| { 471 rb.reader().pop(|buf| {
@@ -460,14 +479,28 @@ mod tests {
460 1 479 1
461 }); 480 });
462 481
482 assert_eq!(rb.is_empty(), false);
483 assert_eq!(rb.is_half_full(), false);
484 assert_eq!(rb.is_full(), false);
485
463 rb.writer().push(|buf| { 486 rb.writer().push(|buf| {
464 assert_eq!(3, buf.len()); 487 assert_eq!(3, buf.len());
465 buf[0] = 11; 488 buf[0] = 11;
466 buf[1] = 12; 489 1
467 2 490 });
491
492 assert_eq!(rb.is_empty(), false);
493 assert_eq!(rb.is_half_full(), true);
494 assert_eq!(rb.is_full(), false);
495
496 rb.writer().push(|buf| {
497 assert_eq!(2, buf.len());
498 buf[0] = 12;
499 1
468 }); 500 });
469 501
470 assert_eq!(rb.is_empty(), false); 502 assert_eq!(rb.is_empty(), false);
503 assert_eq!(rb.is_half_full(), true);
471 assert_eq!(rb.is_full(), false); 504 assert_eq!(rb.is_full(), false);
472 505
473 rb.writer().push(|buf| { 506 rb.writer().push(|buf| {
@@ -477,6 +510,7 @@ mod tests {
477 }); 510 });
478 511
479 assert_eq!(rb.is_empty(), false); 512 assert_eq!(rb.is_empty(), false);
513 assert_eq!(rb.is_half_full(), true);
480 assert_eq!(rb.is_full(), true); 514 assert_eq!(rb.is_full(), true);
481 } 515 }
482 } 516 }
@@ -490,6 +524,7 @@ mod tests {
490 rb.init(b.as_mut_ptr(), b.len()); 524 rb.init(b.as_mut_ptr(), b.len());
491 525
492 assert_eq!(rb.is_empty(), true); 526 assert_eq!(rb.is_empty(), true);
527 assert_eq!(rb.is_half_full(), true);
493 assert_eq!(rb.is_full(), true); 528 assert_eq!(rb.is_full(), true);
494 529
495 rb.writer().push(|buf| { 530 rb.writer().push(|buf| {