diff options
-rw-r--r-- | test/build.mk | 2 | ||||
-rw-r--r-- | test/timer_dos.c | 32 | ||||
-rw-r--r-- | test/timer_dos.py | 41 |
3 files changed, 32 insertions, 43 deletions
diff --git a/test/build.mk b/test/build.mk index daea926970..b0db597583 100644 --- a/test/build.mk +++ b/test/build.mk @@ -22,7 +22,7 @@ test-list-$(BOARD_SAMUS)= test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw power_button hooks test-list-host+=thermal flash queue kb_8042 extpwr_gpio console_edit system test-list-host+=sbs_charging adapter host_command thermal_falco -test-list-host+=bklight_lid bklight_passthru interrupt +test-list-host+=bklight_lid bklight_passthru interrupt timer_dos adapter-y=adapter.o bklight_lid-y=bklight_lid.o 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(); } diff --git a/test/timer_dos.py b/test/timer_dos.py deleted file mode 100644 index 5b7e1f7d40..0000000000 --- a/test/timer_dos.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -# -# Timers test -# - -import time - -# Test during 5s -DURATION=5 - -# Linear congruential pseudo random number generator*/ -def prng(x): - return (22695477 * x + 1) & 0xffffffff - -# period between 500us and 128ms -def period_us(num): - return (((num % 256) + 1) * 500) - -# build the same pseudo random sequence as the target -def build_sequence(): - # TODO(crosbug.com/p/23800): implement - return [] - -def test(helper): - helper.wait_output("[Timer task ") - deadline = time.time() + DURATION - seq = [] - while time.time() < deadline: - tmr = helper.wait_output("(?P<t>[0-9])", use_re=True, - timeout=1)["t"] - seq.append(tmr) - - # Check the results - model = build_sequence() - # TODO(crosbug.com/p/23800): implement - - helper.trace("Got %d timer IRQ\n" % len(seq)) - - return True # PASS ! |