Files
OpenCellular/cts/task/dut.c
Daisuke Nojiri 2ae311c901 eCTS: Test task priority
CTS task wakes up A and C then goes to sleep:

  CTS -> A, C -> A -> B -> C

Since C has a higher priority, C should run first. This should result
in C running one more time than A (or B).

BUG=chromium:663873
BRANCH=none
TEST=cts.py -m task

Change-Id: I89c733ba3aab09b293edf8583d6ed73791531e59
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/409535
Reviewed-by: Randall Spangler <rspangler@chromium.org>
2016-11-10 21:28:33 -08:00

142 lines
2.8 KiB
C

/* 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 "cts_common.h"
#include "task.h"
#include "timer.h"
static int repeat_count;
static int wake_count[3];
void clear_state(void)
{
wake_count[0] = wake_count[1] = wake_count[2] = 0;
}
void task_abc(void *data)
{
int task_id = task_get_current();
int id = task_id - TASK_ID_A;
task_id_t next = task_id + 1;
if (next > TASK_ID_C)
next = TASK_ID_A;
task_wait_event(-1);
CPRINTS("%c Starting", 'A' + id);
cflush();
while (1) {
wake_count[id]++;
if (id == 2 && wake_count[id] == repeat_count)
task_set_event(TASK_ID_CTS, TASK_EVENT_WAKE, 1);
else
task_set_event(next, TASK_EVENT_WAKE, 1);
}
}
void 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);
}
enum cts_rc test_task_switch(void)
{
uint32_t event;
repeat_count = 3000;
task_wake(TASK_ID_A);
event = task_wait_event(5 * SECOND);
if (event != TASK_EVENT_WAKE) {
CPRINTS("Woken up by unexpected event: 0x%08x", event);
return CTS_RC_FAILURE;
}
if (wake_count[0] != repeat_count || wake_count[1] != repeat_count) {
CPRINTS("Unexpected counter values: %d %d %d",
wake_count[0], wake_count[1], wake_count[2]);
return CTS_RC_FAILURE;
}
/* TODO: Verify no tasks are ready, no events are pending. */
if (*task_get_event_bitmap(TASK_ID_A)
|| *task_get_event_bitmap(TASK_ID_B)
|| *task_get_event_bitmap(TASK_ID_C)) {
CPRINTS("Events are pending");
return CTS_RC_FAILURE;
}
return CTS_RC_SUCCESS;
}
enum cts_rc test_task_priority(void)
{
uint32_t event;
repeat_count = 2;
task_wake(TASK_ID_A);
task_wake(TASK_ID_C);
event = task_wait_event(5 * SECOND);
if (event != TASK_EVENT_WAKE) {
CPRINTS("Woken up by unexpected event: 0x%08x", event);
return CTS_RC_FAILURE;
}
if (wake_count[0] != repeat_count - 1
|| wake_count[1] != repeat_count - 1) {
CPRINTS("Unexpected counter values: %d %d %d",
wake_count[0], wake_count[1], wake_count[2]);
return CTS_RC_FAILURE;
}
/* TODO: Verify no tasks are ready, no events are pending. */
if (*task_get_event_bitmap(TASK_ID_A)
|| *task_get_event_bitmap(TASK_ID_B)
|| *task_get_event_bitmap(TASK_ID_C)) {
CPRINTS("Events are pending");
return CTS_RC_FAILURE;
}
return CTS_RC_SUCCESS;
}
#include "cts_testlist.h"
void cts_task(void)
{
enum cts_rc rc;
int i;
task_wake(TASK_ID_TICK);
for (i = 0; i < CTS_TEST_ID_COUNT; i++) {
clear_state();
rc = tests[i].run();
CPRINTF("\n%s %d\n", tests[i].name, rc);
cflush();
}
CPRINTS("Task test suite finished");
cflush();
/* Sleep forever */
task_wait_event(-1);
}