diff --git a/mcan/CHANGELOG.md b/mcan/CHANGELOG.md index 4210429..2a221ea 100644 --- a/mcan/CHANGELOG.md +++ b/mcan/CHANGELOG.md @@ -3,6 +3,7 @@ Tagging in git follows a pattern: `mcan/`. ## [Unreleased] +- Improve performance of RxDedicatedBuffer::receive_any (#50) ## [0.5.0] - 2024-03-04 diff --git a/mcan/src/rx_dedicated_buffers.rs b/mcan/src/rx_dedicated_buffers.rs index 0970ef2..f17ff79 100644 --- a/mcan/src/rx_dedicated_buffers.rs +++ b/mcan/src/rx_dedicated_buffers.rs @@ -124,17 +124,12 @@ impl<'a, P: mcan_core::CanId, M: rx::AnyMessage> DynRxDedicatedBuffer } fn receive_any(&mut self) -> nb::Result { - self.memory - .iter() - .enumerate() - .filter(|&(i, _)| self.has_new_data(i)) - .map(|(i, m)| (i, m.get())) - .min_by_key(|(_, m)| m.id()) - .map(|(i, m)| { - self.mark_buffer_read(i); - m - }) - .ok_or(nb::Error::WouldBlock) + let ndat = + (self.ndat1().read().bits() as u64) | ((self.ndat2().read().bits() as u64) << 32); + let idx = ndat.trailing_zeros() as usize; + let m = self.memory.get(idx).ok_or(nb::Error::WouldBlock)?; + self.mark_buffer_read(idx); + Ok(m.get()) } }