diff options
| author | Adam Greig <[email protected]> | 2025-09-15 03:32:23 +0100 |
|---|---|---|
| committer | Adam Greig <[email protected]> | 2025-10-01 21:11:05 +0100 |
| commit | 2e9f3a815d440f33126d47cdcbf3bf1c9eab0ee1 (patch) | |
| tree | 804288b17bd9119dd4f22b7b27fd4227e9a94d28 /embassy-hal-internal | |
| parent | d382bf0b833e7d9a8e90b8064af1bb63030f0c68 (diff) | |
STM32: USART: Add `eager_reads` config option
Diffstat (limited to 'embassy-hal-internal')
| -rw-r--r-- | embassy-hal-internal/src/atomic_ring_buffer.rs | 39 |
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| { |
