mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-25 23:38:06 +00:00
Merge pull request #940 from HiFiPhile/fifo_fix
Fix fifo overflow correction.
This commit is contained in:
commit
9b3ec69b27
@ -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
|
// 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]
|
// 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;
|
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
|
// 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!!
|
// 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
|
// 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;
|
p = (p - offset) - f->non_used_index_space;
|
||||||
}
|
}
|
||||||
|
@ -292,3 +292,27 @@ void test_full(void)
|
|||||||
|
|
||||||
// write info
|
// 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);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user