aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/dma/ringbuffer.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/embassy-stm32/src/dma/ringbuffer.rs b/embassy-stm32/src/dma/ringbuffer.rs
index 8056a7c3a..c3e4f20c0 100644
--- a/embassy-stm32/src/dma/ringbuffer.rs
+++ b/embassy-stm32/src/dma/ringbuffer.rs
@@ -230,9 +230,10 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
230 let start = self.pos(dma.get_remaining_transfers()); 230 let start = self.pos(dma.get_remaining_transfers());
231 if start > self.end { 231 if start > self.end {
232 trace!( 232 trace!(
233 "[1]: start, end, complete_count: {}, {}, {}", 233 "[1]: start, end, len, complete_count: {}, {}, {}, {}",
234 start, 234 start,
235 self.end, 235 self.end,
236 buf.len(),
236 dma.get_complete_count() 237 dma.get_complete_count()
237 ); 238 );
238 239
@@ -242,8 +243,9 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
242 compiler_fence(Ordering::SeqCst); 243 compiler_fence(Ordering::SeqCst);
243 244
244 // Confirm that the DMA is not inside data we could have written 245 // Confirm that the DMA is not inside data we could have written
245 let pos = self.pos(dma.get_remaining_transfers()); 246 let (pos, complete_count) =
246 if (pos > self.end && pos <= start) || dma.get_complete_count() > 0 { 247 critical_section::with(|_| (self.pos(dma.get_remaining_transfers()), dma.get_complete_count()));
248 if (pos >= self.end && pos < start) || (complete_count > 0 && pos >= start) || complete_count > 1 {
247 Err(OverrunError) 249 Err(OverrunError)
248 } else { 250 } else {
249 self.end = (self.end + len) % self.cap(); 251 self.end = (self.end + len) % self.cap();
@@ -252,18 +254,20 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
252 } 254 }
253 } else if start == self.end && dma.get_complete_count() == 0 { 255 } else if start == self.end && dma.get_complete_count() == 0 {
254 trace!( 256 trace!(
255 "[2]: start, end, complete_count: {}, {}, {}", 257 "[2]: start, end, len, complete_count: {}, {}, {}, {}",
256 start, 258 start,
257 self.end, 259 self.end,
260 buf.len(),
258 dma.get_complete_count() 261 dma.get_complete_count()
259 ); 262 );
260 263
261 Ok((0, 0)) 264 Ok((0, 0))
262 } else if start <= self.end && self.end + buf.len() < self.cap() { 265 } else if start <= self.end && self.end + buf.len() < self.cap() {
263 trace!( 266 trace!(
264 "[3]: start, end, complete_count: {}, {}, {}", 267 "[3]: start, end, len, complete_count: {}, {}, {}, {}",
265 start, 268 start,
266 self.end, 269 self.end,
270 buf.len(),
267 dma.get_complete_count() 271 dma.get_complete_count()
268 ); 272 );
269 273
@@ -286,9 +290,10 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
286 } 290 }
287 } else { 291 } else {
288 trace!( 292 trace!(
289 "[4]: start, end, complete_count: {}, {}, {}", 293 "[4]: start, end, len, complete_count: {}, {}, {}, {}",
290 start, 294 start,
291 self.end, 295 self.end,
296 buf.len(),
292 dma.get_complete_count() 297 dma.get_complete_count()
293 ); 298 );
294 299