Răsfoiți Sursa

Merge pull request #940 from HiFiPhile/fifo_fix

Fix fifo overflow correction.
Ha Thach 4 ani în urmă
părinte
comite
9b3ec69b27
2 a modificat fișierele cu 26 adăugiri și 2 ștergeri
  1. 2 2
      src/common/tusb_fifo.c
  2. 24 0
      test/test/test_fifo.c

+ 2 - 2
src/common/tusb_fifo.c

@@ -325,7 +325,7 @@ static uint16_t advance_pointer(tu_fifo_t* f, uint16_t p, uint16_t offset)
   // We are exploiting the wrap around to the correct index
 
   // TODO warning: assuming signed overflow does not occur when assuming that (X + c) < X is always false [-Wstrict-overflow]
-  if ((p > p + offset) || (p + offset > f->max_pointer_idx))
+  if ((p > (uint16_t)(p + offset)) || ((uint16_t)(p + offset) > f->max_pointer_idx))
   {
     p = (p + offset) + f->non_used_index_space;
   }
@@ -342,7 +342,7 @@ static uint16_t backward_pointer(tu_fifo_t* f, uint16_t p, uint16_t offset)
   // We limit the index space of p such that a correct wrap around happens
   // Check for a wrap around or if we are in unused index space - This has to be checked first!!
   // We are exploiting the wrap around to the correct index
-  if ((p < p - offset) || (p - offset > f->max_pointer_idx))
+  if ((p < (uint16_t)(p - offset)) || ((uint16_t)(p - offset) > f->max_pointer_idx))
   {
     p = (p - offset) - f->non_used_index_space;
   }

+ 24 - 0
test/test/test_fifo.c

@@ -292,3 +292,27 @@ void test_full(void)
 
   // write info
 }
+
+void test_rd_idx_wrap()
+{
+  tu_fifo_t ff10;
+  uint8_t buf[10];
+  uint8_t dst[10];
+
+  tu_fifo_config(&ff10, buf, 10, 1, 1);
+
+  uint16_t n;
+
+  ff10.wr_idx = 6;
+  ff10.rd_idx = 15;
+
+  n = tu_fifo_read_n(&ff10, dst, 4);
+  TEST_ASSERT_EQUAL(n, 4);
+  TEST_ASSERT_EQUAL(ff10.rd_idx, 0);
+  n = tu_fifo_read_n(&ff10, dst, 4);
+  TEST_ASSERT_EQUAL(n, 4);
+  TEST_ASSERT_EQUAL(ff10.rd_idx, 4);
+  n = tu_fifo_read_n(&ff10, dst, 4);
+  TEST_ASSERT_EQUAL(n, 2);
+  TEST_ASSERT_EQUAL(ff10.rd_idx, 6);
+}