mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-27 01:11:06 +00:00
timer_accuracy: generalize, automate, new base API
The old version was running with base-linux only and there was no run script that provided automated execution and evaluation. Ref #1987
This commit is contained in:
parent
9e8366b47c
commit
71525443c5
69
repos/os/run/timer_accuracy.run
Normal file
69
repos/os/run/timer_accuracy.run
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# build program images
|
||||||
|
build { core init drivers/timer test/timer_accuracy }
|
||||||
|
|
||||||
|
# create directory where boot files are written to
|
||||||
|
create_boot_directory
|
||||||
|
|
||||||
|
# define XML configuration for init
|
||||||
|
install_config {
|
||||||
|
<config>
|
||||||
|
<parent-provides>
|
||||||
|
<service name="ROM"/>
|
||||||
|
<service name="RAM"/>
|
||||||
|
<service name="IRQ"/>
|
||||||
|
<service name="IO_MEM"/>
|
||||||
|
<service name="IO_PORT"/>
|
||||||
|
<service name="PD"/>
|
||||||
|
<service name="RM"/>
|
||||||
|
<service name="CPU"/>
|
||||||
|
<service name="LOG"/>
|
||||||
|
</parent-provides>
|
||||||
|
<default-route>
|
||||||
|
<any-service><parent/><any-child/></any-service>
|
||||||
|
</default-route>
|
||||||
|
<start name="timer">
|
||||||
|
<resource name="RAM" quantum="1M"/>
|
||||||
|
<provides><service name="Timer"/></provides>
|
||||||
|
</start>
|
||||||
|
<start name="test-timer_accuracy">
|
||||||
|
<resource name="RAM" quantum="10M"/>
|
||||||
|
</start>
|
||||||
|
</config>
|
||||||
|
}
|
||||||
|
# build boot files from source binaries
|
||||||
|
build_boot_image { core ld.lib.so init timer test-timer_accuracy }
|
||||||
|
|
||||||
|
# configure Qemu
|
||||||
|
append qemu_args " -m 64 -nographic"
|
||||||
|
|
||||||
|
set err_cnt 0
|
||||||
|
set test_timeout 20
|
||||||
|
set rounds 9
|
||||||
|
|
||||||
|
# wait for initial tic
|
||||||
|
run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout
|
||||||
|
set serial_id [output_spawn_id]
|
||||||
|
|
||||||
|
# measure the delays between the following tics
|
||||||
|
for {set i 1} {$i <= $rounds} {incr i} {
|
||||||
|
set start_time($i) [clock milliseconds]
|
||||||
|
run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout $serial_id
|
||||||
|
set end_time($i) [clock milliseconds]
|
||||||
|
}
|
||||||
|
# print results and count errors
|
||||||
|
foreach i [lsort [array names start_time]] {
|
||||||
|
set class "Good:"
|
||||||
|
set test_result [expr $end_time($i) - $start_time($i)]
|
||||||
|
set host_result [expr $i * 1000]
|
||||||
|
set result_diff [expr abs($test_result - $host_result)]
|
||||||
|
if {[expr $result_diff > 500]} {
|
||||||
|
set class "Bad: "
|
||||||
|
set err_cnt [expr $err_cnt + 1]
|
||||||
|
}
|
||||||
|
puts "$class round $i, host measured $host_result ms, test measured $test_result ms"
|
||||||
|
}
|
||||||
|
# check the error count
|
||||||
|
if {[expr $err_cnt > 0]} {
|
||||||
|
puts "Test failed because of $err_cnt errors"
|
||||||
|
exit -1
|
||||||
|
}
|
@ -1,11 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* \brief Timer accuracy test for Linux
|
* \brief Timer accuracy test
|
||||||
* \author Norman Feske
|
* \author Norman Feske
|
||||||
|
* \author Martin Stein
|
||||||
* \date 2010-03-09
|
* \date 2010-03-09
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2010-2013 Genode Labs GmbH
|
* Copyright (C) 2010-2017 Genode Labs GmbH
|
||||||
*
|
*
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
* under the terms of the GNU General Public License version 2.
|
* under the terms of the GNU General Public License version 2.
|
||||||
@ -13,45 +14,30 @@
|
|||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <timer_session/connection.h>
|
#include <timer_session/connection.h>
|
||||||
#include <base/printf.h>
|
#include <base/component.h>
|
||||||
|
|
||||||
/* Linux includes */
|
|
||||||
#include <linux_syscalls.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
inline int lx_gettimeofday(struct timeval *tv, struct timeval *tz)
|
|
||||||
{
|
|
||||||
return lx_syscall(SYS_gettimeofday, tv, tz);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
int main(int, char **)
|
|
||||||
|
struct Main
|
||||||
{
|
{
|
||||||
printf("--- timer accuracy test ---\n");
|
Timer::Connection timer;
|
||||||
|
Signal_handler<Main> timer_handler;
|
||||||
|
unsigned duration_us { 0 };
|
||||||
|
|
||||||
static Timer::Connection timer;
|
void handle_timer()
|
||||||
|
{
|
||||||
static struct timeval old_tv;
|
duration_us += 1000 * 1000;
|
||||||
static struct timeval new_tv;
|
timer.trigger_once(duration_us);
|
||||||
|
log("");
|
||||||
enum { ROUNDS = 10 };
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < ROUNDS; ++i) {
|
|
||||||
printf("Round [%d/%d] - calling msleep for 5 seconds...\n", i + 1, ROUNDS);
|
|
||||||
|
|
||||||
lx_gettimeofday(&old_tv, 0);
|
|
||||||
|
|
||||||
timer.msleep(5*1000);
|
|
||||||
|
|
||||||
lx_gettimeofday(&new_tv, 0);
|
|
||||||
|
|
||||||
printf("old: %ld seconds %ld microseconds\n", old_tv.tv_sec, old_tv.tv_usec);
|
|
||||||
printf("new: %ld seconds %ld microseconds\n", new_tv.tv_sec, new_tv.tv_usec);
|
|
||||||
printf("diff is about %ld seconds\n", new_tv.tv_sec - old_tv.tv_sec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("--- finished timer accuracy test ---\n");
|
Main(Env &env) : timer(env), timer_handler(env.ep(), *this, &Main::handle_timer)
|
||||||
return 0;
|
{
|
||||||
}
|
timer.sigh(timer_handler);
|
||||||
|
handle_timer();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void Component::construct(Env &env) { static Main main(env); }
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
TARGET = test-timer_accuracy
|
TARGET = test-timer_accuracy
|
||||||
REQUIRES = linux
|
|
||||||
SRC_CC = main.cc
|
SRC_CC = main.cc
|
||||||
LIBS = base syscall-linux
|
LIBS = base
|
||||||
|
Loading…
Reference in New Issue
Block a user