diff options
| author | xoviat <[email protected]> | 2023-07-30 20:22:14 -0500 |
|---|---|---|
| committer | xoviat <[email protected]> | 2023-07-30 20:22:14 -0500 |
| commit | ffa0c08140be6c90bde9f11e797eda95e4b8331b (patch) | |
| tree | 44950f793e823b5cc73db7332ddd0a4639170c27 | |
| parent | c38c85ef1fef86a5fc73d1329616df17afb3d385 (diff) | |
stm32/dma: fix condition check
| -rw-r--r-- | embassy-stm32/src/dma/ringbuffer.rs | 17 |
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 | ||
