diff options
-rw-r--r-- | cts/pingpong/cts.tasklist | 22 | ||||
-rw-r--r-- | cts/pingpong/dut.c | 70 | ||||
-rw-r--r-- | cts/pingpong/th.c | 70 |
3 files changed, 162 insertions, 0 deletions
diff --git a/cts/pingpong/cts.tasklist b/cts/pingpong/cts.tasklist new file mode 100644 index 0000000000..bb41e4935f --- /dev/null +++ b/cts/pingpong/cts.tasklist @@ -0,0 +1,22 @@ +/* Copyright (c) 2013 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. + */ + +/** + * List of enabled tasks in the priority order + * + * The first one has the lowest priority. + * + * For each task, use the macro TASK_ALWAYS(n, r, d, s) where : + * 'n' in the name of the task + * 'r' in the main routine of the task + * 'd' in an opaque parameter passed to the routine at startup + * 's' is the stack size in bytes; must be a multiple of 8 + */ +#define CONFIG_CTS_TASK_LIST \ + TASK_ALWAYS(TESTA, task_abc, NULL, TASK_STACK_SIZE) \ + TASK_ALWAYS(TESTB, task_abc, NULL, TASK_STACK_SIZE) \ + TASK_ALWAYS(TESTC, task_abc, NULL, TASK_STACK_SIZE) \ + TASK_ALWAYS(TICK, task_tick, NULL, 256) \ + TASK_ALWAYS(CTS, cts_task, NULL, TASK_STACK_SIZE) diff --git a/cts/pingpong/dut.c b/cts/pingpong/dut.c new file mode 100644 index 0000000000..0dc0320adc --- /dev/null +++ b/cts/pingpong/dut.c @@ -0,0 +1,70 @@ +/* Copyright (c) 2013 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. + * + * Tasks for scheduling test. + */ + +#include "common.h" +#include "console.h" +#include "task.h" +#include "test_util.h" +#include "timer.h" +#include "util.h" + +#define TEST_COUNT 3000 + +static int wake_count[3]; + +int task_abc(void *data) +{ + int myid = task_get_current() - TASK_ID_TESTA; + task_id_t next = task_get_current() + 1; + + if (next > TASK_ID_TESTC) + next = TASK_ID_TESTA; + + task_wait_event(-1); + + ccprintf("\n[starting Task %c]\n", ('A' + myid)); + + while (1) { + wake_count[myid]++; + if (myid == 2 && wake_count[myid] == TEST_COUNT) { + if (wake_count[0] == TEST_COUNT && + wake_count[1] == TEST_COUNT) + test_pass(); + else + test_fail(); + wake_count[0] = wake_count[1] = wake_count[2] = 0; + task_wait_event(-1); + } else { + task_set_event(next, TASK_EVENT_WAKE, 1); + } + } + + return EC_SUCCESS; +} + +int task_tick(void *data) +{ + task_wait_event(-1); + ccprintf("\n[starting Task T]\n"); + + /* Wake up every tick */ + while (1) { + /* Wait for timer interrupt message */ + usleep(3000); + } + + return EC_SUCCESS; +} + +void cts_task(void) +{ + wait_for_task_started(); + task_wake(TASK_ID_TICK); + task_wake(TASK_ID_TESTA); + /* Sleep forever */ + task_wait_event(-1); +} diff --git a/cts/pingpong/th.c b/cts/pingpong/th.c new file mode 100644 index 0000000000..0dc0320adc --- /dev/null +++ b/cts/pingpong/th.c @@ -0,0 +1,70 @@ +/* Copyright (c) 2013 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. + * + * Tasks for scheduling test. + */ + +#include "common.h" +#include "console.h" +#include "task.h" +#include "test_util.h" +#include "timer.h" +#include "util.h" + +#define TEST_COUNT 3000 + +static int wake_count[3]; + +int task_abc(void *data) +{ + int myid = task_get_current() - TASK_ID_TESTA; + task_id_t next = task_get_current() + 1; + + if (next > TASK_ID_TESTC) + next = TASK_ID_TESTA; + + task_wait_event(-1); + + ccprintf("\n[starting Task %c]\n", ('A' + myid)); + + while (1) { + wake_count[myid]++; + if (myid == 2 && wake_count[myid] == TEST_COUNT) { + if (wake_count[0] == TEST_COUNT && + wake_count[1] == TEST_COUNT) + test_pass(); + else + test_fail(); + wake_count[0] = wake_count[1] = wake_count[2] = 0; + task_wait_event(-1); + } else { + task_set_event(next, TASK_EVENT_WAKE, 1); + } + } + + return EC_SUCCESS; +} + +int task_tick(void *data) +{ + task_wait_event(-1); + ccprintf("\n[starting Task T]\n"); + + /* Wake up every tick */ + while (1) { + /* Wait for timer interrupt message */ + usleep(3000); + } + + return EC_SUCCESS; +} + +void cts_task(void) +{ + wait_for_task_started(); + task_wake(TASK_ID_TICK); + task_wake(TASK_ID_TESTA); + /* Sleep forever */ + task_wait_event(-1); +} |