diff options
| author | Ulf Lilleengen <[email protected]> | 2025-10-14 18:28:30 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-10-14 18:28:30 +0000 |
| commit | 751ed8f9a026dce742831ae34b205c40b075c8bc (patch) | |
| tree | a764e84ffea6ced9131297499ee257bd6755893e | |
| parent | 4d6763364d0eab3858eebfea9d98c4fdd208faf9 (diff) | |
| parent | dad58cf915c753602f6c6bcdc4db7123c31b2877 (diff) | |
Merge pull request #4752 from Kezii/main
[embassy nrf] remove panic on uarte overrun, return error on read instead
| -rw-r--r-- | embassy-nrf/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | embassy-nrf/src/buffered_uarte.rs | 20 |
2 files changed, 18 insertions, 3 deletions
diff --git a/embassy-nrf/CHANGELOG.md b/embassy-nrf/CHANGELOG.md index 0244dedab..9e8d29f67 100644 --- a/embassy-nrf/CHANGELOG.md +++ b/embassy-nrf/CHANGELOG.md | |||
| @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 8 | <!-- next-header --> | 8 | <!-- next-header --> |
| 9 | ## Unreleased - ReleaseDate | 9 | ## Unreleased - ReleaseDate |
| 10 | - changed: apply trimming values from FICR.TRIMCNF on nrf53/54l | 10 | - changed: apply trimming values from FICR.TRIMCNF on nrf53/54l |
| 11 | - changed: do not panic on BufferedUarte overrun | ||
| 11 | 12 | ||
| 12 | ## 0.8.0 - 2025-09-30 | 13 | ## 0.8.0 - 2025-09-30 |
| 13 | 14 | ||
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs index 4c946497d..b1eb5c81a 100644 --- a/embassy-nrf/src/buffered_uarte.rs +++ b/embassy-nrf/src/buffered_uarte.rs | |||
| @@ -40,6 +40,7 @@ pub(crate) struct State { | |||
| 40 | rx_started_count: AtomicU8, | 40 | rx_started_count: AtomicU8, |
| 41 | rx_ended_count: AtomicU8, | 41 | rx_ended_count: AtomicU8, |
| 42 | rx_ppi_ch: AtomicU8, | 42 | rx_ppi_ch: AtomicU8, |
| 43 | rx_overrun: AtomicBool, | ||
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | /// UART error. | 46 | /// UART error. |
| @@ -47,7 +48,8 @@ pub(crate) struct State { | |||
| 47 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 48 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 48 | #[non_exhaustive] | 49 | #[non_exhaustive] |
| 49 | pub enum Error { | 50 | pub enum Error { |
| 50 | // No errors for now | 51 | /// Buffer Overrun |
| 52 | Overrun, | ||
| 51 | } | 53 | } |
| 52 | 54 | ||
| 53 | impl State { | 55 | impl State { |
| @@ -61,6 +63,7 @@ impl State { | |||
| 61 | rx_started_count: AtomicU8::new(0), | 63 | rx_started_count: AtomicU8::new(0), |
| 62 | rx_ended_count: AtomicU8::new(0), | 64 | rx_ended_count: AtomicU8::new(0), |
| 63 | rx_ppi_ch: AtomicU8::new(0), | 65 | rx_ppi_ch: AtomicU8::new(0), |
| 66 | rx_overrun: AtomicBool::new(false), | ||
| 64 | } | 67 | } |
| 65 | } | 68 | } |
| 66 | } | 69 | } |
| @@ -87,7 +90,8 @@ impl<U: UarteInstance> interrupt::typelevel::Handler<U::Interrupt> for Interrupt | |||
| 87 | r.errorsrc().write_value(errs); | 90 | r.errorsrc().write_value(errs); |
| 88 | 91 | ||
| 89 | if errs.overrun() { | 92 | if errs.overrun() { |
| 90 | panic!("BufferedUarte overrun"); | 93 | s.rx_overrun.store(true, Ordering::Release); |
| 94 | ss.rx_waker.wake(); | ||
| 91 | } | 95 | } |
| 92 | } | 96 | } |
| 93 | 97 | ||
| @@ -689,6 +693,7 @@ impl<'d> BufferedUarteRx<'d> { | |||
| 689 | buffered_state.rx_started_count.store(0, Ordering::Relaxed); | 693 | buffered_state.rx_started_count.store(0, Ordering::Relaxed); |
| 690 | buffered_state.rx_ended_count.store(0, Ordering::Relaxed); | 694 | buffered_state.rx_ended_count.store(0, Ordering::Relaxed); |
| 691 | buffered_state.rx_started.store(false, Ordering::Relaxed); | 695 | buffered_state.rx_started.store(false, Ordering::Relaxed); |
| 696 | buffered_state.rx_overrun.store(false, Ordering::Relaxed); | ||
| 692 | let rx_len = rx_buffer.len().min(EASY_DMA_SIZE * 2); | 697 | let rx_len = rx_buffer.len().min(EASY_DMA_SIZE * 2); |
| 693 | unsafe { buffered_state.rx_buf.init(rx_buffer.as_mut_ptr(), rx_len) }; | 698 | unsafe { buffered_state.rx_buf.init(rx_buffer.as_mut_ptr(), rx_len) }; |
| 694 | 699 | ||
| @@ -762,6 +767,10 @@ impl<'d> BufferedUarteRx<'d> { | |||
| 762 | compiler_fence(Ordering::SeqCst); | 767 | compiler_fence(Ordering::SeqCst); |
| 763 | //trace!("poll_read"); | 768 | //trace!("poll_read"); |
| 764 | 769 | ||
| 770 | if s.rx_overrun.swap(false, Ordering::Acquire) { | ||
| 771 | return Poll::Ready(Err(Error::Overrun)); | ||
| 772 | } | ||
| 773 | |||
| 765 | // Read the RXDRDY counter. | 774 | // Read the RXDRDY counter. |
| 766 | timer.cc(0).capture(); | 775 | timer.cc(0).capture(); |
| 767 | let mut end = timer.cc(0).read() as usize; | 776 | let mut end = timer.cc(0).read() as usize; |
| @@ -820,6 +829,9 @@ impl<'d> BufferedUarteRx<'d> { | |||
| 820 | /// we are ready to read if there is data in the buffer | 829 | /// we are ready to read if there is data in the buffer |
| 821 | fn read_ready(&self) -> Result<bool, Error> { | 830 | fn read_ready(&self) -> Result<bool, Error> { |
| 822 | let state = self.buffered_state; | 831 | let state = self.buffered_state; |
| 832 | if state.rx_overrun.swap(false, Ordering::Acquire) { | ||
| 833 | return Err(Error::Overrun); | ||
| 834 | } | ||
| 823 | Ok(!state.rx_buf.is_empty()) | 835 | Ok(!state.rx_buf.is_empty()) |
| 824 | } | 836 | } |
| 825 | } | 837 | } |
| @@ -854,7 +866,9 @@ mod _embedded_io { | |||
| 854 | 866 | ||
| 855 | impl embedded_io_async::Error for Error { | 867 | impl embedded_io_async::Error for Error { |
| 856 | fn kind(&self) -> embedded_io_async::ErrorKind { | 868 | fn kind(&self) -> embedded_io_async::ErrorKind { |
| 857 | match *self {} | 869 | match *self { |
| 870 | Error::Overrun => embedded_io_async::ErrorKind::OutOfMemory, | ||
| 871 | } | ||
| 858 | } | 872 | } |
| 859 | } | 873 | } |
| 860 | 874 | ||
