mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-30 18:41:11 +00:00
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>
142 lines
2.8 KiB
C
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);
|
|
}
|