diff options
Diffstat (limited to 'test/timer_dos.c')
-rw-r--r-- | test/timer_dos.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/test/timer_dos.c b/test/timer_dos.c index f941adea51..0c0f48c0a2 100644 --- a/test/timer_dos.c +++ b/test/timer_dos.c @@ -17,11 +17,28 @@ #define TEST_TIME (3 * SECOND) +#define ERROR_MARGIN 5 + +static int calculate_golden(uint32_t seed) +{ + int golden = 0; + uint32_t elapsed = 0; + while (1) { + elapsed += PERIOD_US(seed); + ++golden; + if (elapsed >= TEST_TIME) + return golden; + seed = prng(seed); + } +} + int task_timer(void *seed) { - uint32_t num = (uint32_t)seed; + uint32_t num = (uint32_t)(uintptr_t)seed; + int golden_cnt = calculate_golden(num); task_id_t id = task_get_current(); timestamp_t start; + int cnt = 0; while (1) { task_wait_event(-1); @@ -33,9 +50,19 @@ int task_timer(void *seed) /* Wait for a "random" period */ task_wait_event(PERIOD_US(num)); ccprintf("%01d\n", id); + cnt++; /* next pseudo random delay */ num = prng(num); } + ccprintf("Task %d: Count=%d Golden=%d\n", id, cnt, golden_cnt); + cnt -= golden_cnt; + if (cnt < 0) + cnt = -cnt; + if (cnt > ERROR_MARGIN) { + ccprintf("Count differs from Golden by more than %d!\n", + ERROR_MARGIN); + test_fail(); + } } return EC_SUCCESS; @@ -43,8 +70,11 @@ int task_timer(void *seed) void run_test(void) { + wait_for_task_started(); task_wake(TASK_ID_TMRD); task_wake(TASK_ID_TMRC); task_wake(TASK_ID_TMRB); task_wake(TASK_ID_TMRA); + usleep(TEST_TIME + SECOND); + test_pass(); } |