[rtems commit] sptests/spcpucounter01: Add some statistics
Sebastian Huber
sebh at rtems.org
Mon Jun 20 12:55:54 UTC 2016
Module: rtems
Branch: master
Commit: 3e2a3c49480b9888362d016dd202edd562d9e069
Changeset: http://git.rtems.org/rtems/commit/?id=3e2a3c49480b9888362d016dd202edd562d9e069
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Mon Jun 20 13:55:37 2016 +0200
sptests/spcpucounter01: Add some statistics
---
testsuites/sptests/spcpucounter01/init.c | 171 +++++++++++++++++----
.../sptests/spcpucounter01/spcpucounter01.doc | 2 +
.../sptests/spcpucounter01/spcpucounter01.scn | 106 ++++++++++---
3 files changed, 229 insertions(+), 50 deletions(-)
diff --git a/testsuites/sptests/spcpucounter01/init.c b/testsuites/sptests/spcpucounter01/init.c
index 77a70b3..3fe12b0 100644
--- a/testsuites/sptests/spcpucounter01/init.c
+++ b/testsuites/sptests/spcpucounter01/init.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -29,6 +29,17 @@ const char rtems_test_name[] = "SPCPUCOUNTER 1";
#define NS_PER_TICK 1000000
+#define N 10
+
+typedef struct {
+ rtems_counter_ticks delay_ns_t[N][2];
+ rtems_counter_ticks delay_ticks_t[N][2];
+ rtems_counter_ticks overhead_t[N][5];
+ rtems_counter_ticks overhead_delta;
+} test_context;
+
+static test_context test_instance;
+
static rtems_interval sync_with_clock_tick(void)
{
rtems_interval start = rtems_clock_get_ticks_since_boot();
@@ -52,56 +63,160 @@ static void test_converter(void)
rtems_test_assert(ns == 1000000000);
}
-static void test_delay_nanoseconds(void)
+static void test_delay_nanoseconds(test_context *ctx)
{
- rtems_counter_ticks start;
- rtems_counter_ticks end;
- rtems_counter_ticks delta;
- double ns_per_tick = NS_PER_TICK;
- uint64_t ns_delta;
- rtems_interval tick;
- int n = 10;
int i;
- printf("test delay nanoseconds (%i times)\n", n);
+ for (i = 0; i < N; ++i) {
+ rtems_counter_ticks t0;
+ rtems_counter_ticks t1;
+ rtems_interval tick;
- for (i = 0; i < n; ++i) {
tick = sync_with_clock_tick();
- start = rtems_counter_read();
+ t0 = rtems_counter_read();
rtems_counter_delay_nanoseconds(NS_PER_TICK);
- end = rtems_counter_read();
+ t1 = rtems_counter_read();
+
+ ctx->delay_ns_t[i][0] = t0;
+ ctx->delay_ns_t[i][1] = t1;
rtems_test_assert(tick < rtems_clock_get_ticks_since_boot());
+ }
+}
- delta = rtems_counter_difference(end, start);
- ns_delta = rtems_counter_ticks_to_nanoseconds(delta);
+static void test_delay_ticks(test_context *ctx)
+{
+ rtems_counter_ticks ticks = rtems_counter_nanoseconds_to_ticks(NS_PER_TICK);
+ int i;
- /* Special case for CPU counters using the clock driver counter */
- if (ns_delta < rtems_configuration_get_nanoseconds_per_tick()) {
- printf(
- "warning: the RTEMS counter seems to be unable to\n"
- " measure intervals greater than the clock tick interval\n"
- );
+ for (i = 0; i < N; ++i) {
+ rtems_counter_ticks t0;
+ rtems_counter_ticks t1;
+ rtems_interval tick;
+
+ tick = sync_with_clock_tick();
- ns_delta += rtems_configuration_get_nanoseconds_per_tick();
- }
+ t0 = rtems_counter_read();
+ rtems_counter_delay_ticks(ticks);
+ t1 = rtems_counter_read();
+
+ ctx->delay_ticks_t[i][0] = t0;
+ ctx->delay_ticks_t[i][1] = t1;
+
+ rtems_test_assert(tick < rtems_clock_get_ticks_since_boot());
+ }
+}
+
+static void test_overheads(test_context *ctx)
+{
+ int i;
+
+ for (i = 0; i < N; ++i) {
+ rtems_counter_ticks t0;
+ rtems_counter_ticks t1;
+ rtems_counter_ticks t2;
+ rtems_counter_ticks t3;
+ rtems_counter_ticks t4;
+ rtems_counter_ticks d;
+
+ t0 = rtems_counter_read();
+ t1 = rtems_counter_read();
+ d = rtems_counter_difference(t1, t0);
+ t2 = rtems_counter_read();
+ rtems_counter_delay_nanoseconds(0);
+ t3 = rtems_counter_read();
+ rtems_counter_delay_ticks(0);
+ t4 = rtems_counter_read();
+
+ ctx->overhead_t[i][0] = t0;
+ ctx->overhead_t[i][1] = t1;
+ ctx->overhead_t[i][2] = t2;
+ ctx->overhead_t[i][3] = t3;
+ ctx->overhead_t[i][4] = t4;
+ ctx->overhead_delta = d;
+ }
+}
+
+static void report_overhead(
+ const char *name,
+ rtems_counter_ticks t1,
+ rtems_counter_ticks t0
+)
+{
+ rtems_counter_ticks d;
+ uint64_t ns;
+
+ d = rtems_counter_difference(t1, t0);
+ ns = rtems_counter_ticks_to_nanoseconds(d);
+
+ printf(
+ "overhead %s: %" PRIu64 " ticks, %" PRIu64 "ns\n",
+ name,
+ (uint64_t) d,
+ ns
+ );
+}
+
+static void test_report(test_context *ctx)
+{
+ double ns_per_tick = NS_PER_TICK;
+ rtems_counter_ticks d;
+ uint64_t ns;
+ size_t i;
+
+ printf("test delay nanoseconds (%i times)\n", N);
+
+ for (i = 0; i < N; ++i) {
+ d = rtems_counter_difference(ctx->delay_ns_t[i][1], ctx->delay_ns_t[i][0]);
+ ns = rtems_counter_ticks_to_nanoseconds(d);
+
+ printf(
+ "ns busy wait duration: %" PRIu64 "ns\n"
+ "ns busy wait relative to clock tick: %f\n",
+ ns,
+ (ns - ns_per_tick) / ns_per_tick
+ );
+ }
+
+ printf("test delay ticks (%i times)\n", N);
+
+ for (i = 0; i < N; ++i) {
+ d = rtems_counter_difference(
+ ctx->delay_ticks_t[i][1],
+ ctx->delay_ticks_t[i][0]
+ );
+ ns = rtems_counter_ticks_to_nanoseconds(d);
printf(
- "busy wait duration: %" PRIu64 "ns\n"
- "busy wait relative to clock tick: %f\n",
- ns_delta,
- (ns_delta - ns_per_tick) / ns_per_tick
+ "ticks busy wait duration: %" PRIu64 "ns\n"
+ "ticks busy wait relative to clock tick: %f\n",
+ ns,
+ (ns - ns_per_tick) / ns_per_tick
);
}
+
+ printf("test overheads (%i times)\n", N);
+
+ for (i = 0; i < N; ++i) {
+ report_overhead("read", ctx->overhead_t[i][1], ctx->overhead_t[i][0]);
+ report_overhead("difference", ctx->overhead_t[i][2], ctx->overhead_t[i][1]);
+ report_overhead("delay ns", ctx->overhead_t[i][3], ctx->overhead_t[i][2]);
+ report_overhead("delay ticks", ctx->overhead_t[i][4], ctx->overhead_t[i][3]);
+ }
}
static void Init(rtems_task_argument arg)
{
+ test_context *ctx = &test_instance;
+
TEST_BEGIN();
+ test_delay_nanoseconds(ctx);
+ test_delay_ticks(ctx);
+ test_overheads(ctx);
test_converter();
- test_delay_nanoseconds();
+ test_report(ctx);
TEST_END();
diff --git a/testsuites/sptests/spcpucounter01/spcpucounter01.doc b/testsuites/sptests/spcpucounter01/spcpucounter01.doc
index 06ae34f..a48be4b 100644
--- a/testsuites/sptests/spcpucounter01/spcpucounter01.doc
+++ b/testsuites/sptests/spcpucounter01/spcpucounter01.doc
@@ -8,6 +8,8 @@ directives:
- rtems_counter_difference()
- rtems_counter_ticks_to_nanoseconds()
- rtems_counter_nanoseconds_to_ticks()
+ - rtems_counter_delay_nanoseconds()
+ - rtems_counter_delay_ticks()
concepts:
diff --git a/testsuites/sptests/spcpucounter01/spcpucounter01.scn b/testsuites/sptests/spcpucounter01/spcpucounter01.scn
index 62f86d7..4c4ec79 100644
--- a/testsuites/sptests/spcpucounter01/spcpucounter01.scn
+++ b/testsuites/sptests/spcpucounter01/spcpucounter01.scn
@@ -1,25 +1,87 @@
-*** TEST SPCPUCOUNTER 1 ***
-CPU counter frequency: 25000000Hz
+*** BEGIN OF TEST SPCPUCOUNTER 1 ***
+CPU counter frequency: 1500000000Hz
nanoseconds for frequency count ticks: 1000000000
test delay nanoseconds (10 times)
-busy wait duration: 1000840ns
-busy wait relative to clock tick: 0.000840
-busy wait duration: 1001200ns
-busy wait relative to clock tick: 0.001200
-busy wait duration: 1001480ns
-busy wait relative to clock tick: 0.001480
-busy wait duration: 1001200ns
-busy wait relative to clock tick: 0.001200
-busy wait duration: 1001120ns
-busy wait relative to clock tick: 0.001120
-busy wait duration: 1001280ns
-busy wait relative to clock tick: 0.001280
-busy wait duration: 1001120ns
-busy wait relative to clock tick: 0.001120
-busy wait duration: 1001240ns
-busy wait relative to clock tick: 0.001240
-busy wait duration: 1001120ns
-busy wait relative to clock tick: 0.001120
-busy wait duration: 1001280ns
-busy wait relative to clock tick: 0.001280
+ns busy wait duration: 1000062ns
+ns busy wait relative to clock tick: 0.000062
+ns busy wait duration: 1000017ns
+ns busy wait relative to clock tick: 0.000017
+ns busy wait duration: 1000025ns
+ns busy wait relative to clock tick: 0.000025
+ns busy wait duration: 1000017ns
+ns busy wait relative to clock tick: 0.000017
+ns busy wait duration: 1000043ns
+ns busy wait relative to clock tick: 0.000043
+ns busy wait duration: 1000040ns
+ns busy wait relative to clock tick: 0.000040
+ns busy wait duration: 1000043ns
+ns busy wait relative to clock tick: 0.000043
+ns busy wait duration: 1000022ns
+ns busy wait relative to clock tick: 0.000022
+ns busy wait duration: 1000028ns
+ns busy wait relative to clock tick: 0.000028
+ns busy wait duration: 1000023ns
+ns busy wait relative to clock tick: 0.000023
+test delay ticks (10 times)
+ticks busy wait duration: 1000038ns
+ticks busy wait relative to clock tick: 0.000038
+ticks busy wait duration: 1000028ns
+ticks busy wait relative to clock tick: 0.000028
+ticks busy wait duration: 1000010ns
+ticks busy wait relative to clock tick: 0.000010
+ticks busy wait duration: 1000036ns
+ticks busy wait relative to clock tick: 0.000036
+ticks busy wait duration: 1000031ns
+ticks busy wait relative to clock tick: 0.000031
+ticks busy wait duration: 1000062ns
+ticks busy wait relative to clock tick: 0.000062
+ticks busy wait duration: 1000026ns
+ticks busy wait relative to clock tick: 0.000026
+ticks busy wait duration: 1000031ns
+ticks busy wait relative to clock tick: 0.000031
+ticks busy wait duration: 1000016ns
+ticks busy wait relative to clock tick: 0.000016
+ticks busy wait duration: 1000033ns
+ticks busy wait relative to clock tick: 0.000033
+test overheads (10 times)
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 272 ticks, 181ns
+overhead delay ticks: 20 ticks, 13ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 20 ticks, 13ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 34 ticks, 22ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 34 ticks, 22ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 24 ticks, 16ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 23 ticks, 15ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 23 ticks, 15ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 23 ticks, 15ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 23 ticks, 15ns
+overhead delay ticks: 8 ticks, 5ns
+overhead read: 1 ticks, 0ns
+overhead difference: 1 ticks, 0ns
+overhead delay ns: 23 ticks, 15ns
+overhead delay ticks: 8 ticks, 5ns
*** END OF TEST SPCPUCOUNTER 1 ***
More information about the vc
mailing list