Files
OpenCellular/core/host/timer.c
Vic (Chun-Ju) Yang a02d7fa148 emulator: Use udelay() for usleep() if task hasn't started
If the task scheduler hasn't started yet, use udelay() for any call to
usleep(). This is what we do for real core now.

BUG=chrome-os-partner:19235
TEST=Call usleep() in init hook
BRANCH=None

Change-Id: Ia5d14ee165ab25bfa231497af1aa8c87fbc324f0
Signed-off-by: Vic (Chun-Ju) Yang <victoryang@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/183271
Reviewed-by: Yung-chieh Lo <yjlou@chromium.org>
2014-01-21 16:15:20 +00:00

97 lines
1.7 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.
*/
/* Timer module */
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include "task.h"
#include "test_util.h"
#include "timer.h"
#include "util.h"
/*
* For test that need to test for longer than 10 seconds, adjust
* its time scale in test/build.mk by specifying
* <test_name>-scale=<new scale>.
*/
#ifndef TEST_TIME_SCALE
#define TEST_TIME_SCALE 1
#endif
static timestamp_t boot_time;
static int time_set;
void usleep(unsigned us)
{
if (!task_start_called()) {
udelay(us);
return;
}
ASSERT(!in_interrupt_context() &&
task_get_current() != TASK_ID_INT_GEN);
task_wait_event(us);
}
timestamp_t _get_time(void)
{
struct timespec ts;
timestamp_t ret;
clock_gettime(CLOCK_MONOTONIC, &ts);
ret.val = (1000000000 * (uint64_t)ts.tv_sec + ts.tv_nsec) *
TEST_TIME_SCALE / 1000;
return ret;
}
timestamp_t get_time(void)
{
timestamp_t ret = _get_time();
ret.val -= boot_time.val;
return ret;
}
void force_time(timestamp_t ts)
{
timestamp_t now = _get_time();
boot_time.val = now.val - ts.val;
time_set = 1;
}
void udelay(unsigned us)
{
timestamp_t deadline;
if (!in_interrupt_context() && task_get_current() == TASK_ID_INT_GEN) {
interrupt_generator_udelay(us);
return;
}
deadline.val = get_time().val + us;
while (get_time().val < deadline.val)
;
}
int timestamp_expired(timestamp_t deadline, const timestamp_t *now)
{
timestamp_t now_val;
if (!now) {
now_val = get_time();
now = &now_val;
}
return ((int64_t)(now->val - deadline.val) >= 0);
}
void timer_init(void)
{
if (!time_set)
boot_time = _get_time();
}