summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cts/pingpong/cts.tasklist22
-rw-r--r--cts/pingpong/dut.c70
-rw-r--r--cts/pingpong/th.c70
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);
+}