summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2021-07-01 02:25:23 +0700
committerGitHub <[email protected]>2021-07-01 02:25:23 +0700
commit9b3ec69b27b5d18d4c1f34d6730cec21afc8e628 (patch)
treea6e544264d7cf411ae244f1dde07da3f5dad48a9
parent3b539fdd8d8e9d48756cf5f6e0d605af3972651c (diff)
parent74b51d43e1e8e14def49c140f8f063eb56c9e4d2 (diff)
Merge pull request #940 from HiFiPhile/fifo_fix
Fix fifo overflow correction.
-rw-r--r--src/common/tusb_fifo.c4
-rw-r--r--test/test/test_fifo.c24
2 files changed, 26 insertions, 2 deletions
diff --git a/src/common/tusb_fifo.c b/src/common/tusb_fifo.c
index 1eb886aa1..73217cf75 100644
--- a/src/common/tusb_fifo.c
+++ b/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;
}
diff --git a/test/test/test_fifo.c b/test/test/test_fifo.c
index f9bfc5f03..0a5f4d3b9 100644
--- a/test/test/test_fifo.c
+++ b/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);
+} \ No newline at end of file