aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2025-10-14 18:28:30 +0000
committerGitHub <[email protected]>2025-10-14 18:28:30 +0000
commit751ed8f9a026dce742831ae34b205c40b075c8bc (patch)
treea764e84ffea6ced9131297499ee257bd6755893e
parent4d6763364d0eab3858eebfea9d98c4fdd208faf9 (diff)
parentdad58cf915c753602f6c6bcdc4db7123c31b2877 (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.md1
-rw-r--r--embassy-nrf/src/buffered_uarte.rs20
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]
49pub enum Error { 50pub enum Error {
50 // No errors for now 51 /// Buffer Overrun
52 Overrun,
51} 53}
52 54
53impl State { 55impl 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