summaryrefslogtreecommitdiff
path: root/test/timer_dos.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/timer_dos.c')
-rw-r--r--test/timer_dos.c32
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();
}