From 8292744ffd977bbe16d4fe4273a4acdc196e463d Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 26 Jun 2008 13:36:25 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@324 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- test/test.c | 30 +++++++- test/test.h | 4 + test/testbmk.c | 233 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/testbmk.h | 25 +++++++ 4 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 test/testbmk.c create mode 100644 test/testbmk.h (limited to 'test') diff --git a/test/test.c b/test/test.c index d6f9f0717..f9a185d03 100644 --- a/test/test.c +++ b/test/test.c @@ -24,6 +24,7 @@ #include "testsem.h" #include "testmtx.h" #include "testmsg.h" +#include "testbmk.h" /* * Array of all the test cases. @@ -37,6 +38,11 @@ static const struct testcase *tests[] = { &testmtx2, &testmtx3, &testmsg1, + &testbmk1, + &testbmk2, + &testbmk3, + &testbmk4, + &testbmk5, NULL }; @@ -159,6 +165,26 @@ void test_cpu_pulse(systime_t ms) { } } +systime_t test_wait_tick(void) { + + systime_t time = chSysGetTime() + 1; + if (time) { + while (chSysGetTime() < time) { +#if defined(WIN32) + ChkIntSources(); +#endif + } + } + else { + while (chSysGetTime() > time) { +#if defined(WIN32) + ChkIntSources(); +#endif + } + } + return time; +} + /* * Test suite execution. */ @@ -192,7 +218,7 @@ msg_t TestThread(void *p) { #if DELAY_BETWEEN_TESTS > 0 chThdSleep(DELAY_BETWEEN_TESTS); #endif - test_println("------------------------------------------------------------"); + test_println("---------------------------------------------------------------------------"); test_print("--- Test Case "); test_printn(i + 1); test_print(" ("); @@ -213,7 +239,7 @@ msg_t TestThread(void *p) { test_println("--- Result: SUCCESS"); i++; } - test_println("------------------------------------------------------------"); + test_println("---------------------------------------------------------------------------"); test_println(""); test_print("Final result: "); if (global_fail) diff --git a/test/test.h b/test/test.h index 9e2759ede..468505d01 100644 --- a/test/test.h +++ b/test/test.h @@ -42,12 +42,16 @@ struct testcase { extern "C" { #endif msg_t TestThread(void *p); + void test_printn(uint32_t n); + void test_print(char *msgp); + void test_println(char *msgp); void test_emit_token(char token); void test_fail(char * msg); void test_assert(bool_t condition, char * msg); void test_assert_sequence(char *expected); void test_assert_time_window(systime_t start, systime_t end); void test_wait_threads(void); + systime_t test_wait_tick(void); void test_cpu_pulse(systime_t ms); #ifdef __cplusplus } diff --git a/test/testbmk.c b/test/testbmk.c new file mode 100644 index 000000000..2dc349d92 --- /dev/null +++ b/test/testbmk.c @@ -0,0 +1,233 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +#include "test.h" + +__attribute__((noinline)) +static unsigned int msg_loop_test(Thread *tp) { + + uint32_t n = 0; + systime_t start = test_wait_tick(); + systime_t end = start + 1000; + while (chSysInTimeWindow(start, end)) { + (void)chMsgSend(tp, 0); + n++; +#if defined(WIN32) + ChkIntSources(); +#endif + } + return n; +} + +static char *bmk1_gettest(void) { + + return "Benchmark, context switch #1, optimal"; +} + +static void bmk1_setup(void) { +} + +static void bmk1_teardown(void) { +} + +static msg_t thread1(void *p) { + + while (!chThdShouldTerminate()) + chMsgRelease(chMsgWait()); + return 0; +} + +static void bmk1_execute(void) { + uint32_t n; + + threads[0] = chThdCreate(chThdGetPriority()-1, 0, wa[0], STKSIZE, thread1, 0); + n = msg_loop_test(threads[0]); + chThdTerminate(threads[0]); + test_wait_threads(); + test_print("--- Score : "); + test_printn(n); + test_print(" msgs/S, "); + test_printn(n << 1); + test_println(" ctxswc/S"); +} + +const struct testcase testbmk1 = { + bmk1_gettest, + bmk1_setup, + bmk1_teardown, + bmk1_execute +}; + +static char *bmk2_gettest(void) { + + return "Benchmark, context switch #2, empty ready list"; +} + +static void bmk2_setup(void) { +} + +static void bmk2_teardown(void) { +} + +static void bmk2_execute(void) { + uint32_t n; + + threads[0] = chThdCreate(chThdGetPriority()+1, 0, wa[0], STKSIZE, thread1, 0); + n = msg_loop_test(threads[0]); + chThdTerminate(threads[0]); + chMsgSend(threads[0], 0); + test_wait_threads(); + test_print("--- Score : "); + test_printn(n); + test_print(" msgs/S, "); + test_printn(n << 1); + test_println(" ctxswc/S"); +} + +const struct testcase testbmk2 = { + bmk2_gettest, + bmk2_setup, + bmk2_teardown, + bmk2_execute +}; + +static char *bmk3_gettest(void) { + + return "Benchmark, context switch #3, 4 threads in ready list"; +} + +static void bmk3_setup(void) { +} + +static void bmk3_teardown(void) { +} + +static msg_t thread2(void *p) { + + return 0; +} + +static void bmk3_execute(void) { + uint32_t n; + + threads[0] = chThdCreate(chThdGetPriority()+1, 0, wa[0], STKSIZE, thread1, 0); + threads[1] = chThdCreate(chThdGetPriority()-2, 0, wa[1], STKSIZE, thread2, 0); + threads[2] = chThdCreate(chThdGetPriority()-3, 0, wa[2], STKSIZE, thread2, 0); + threads[3] = chThdCreate(chThdGetPriority()-4, 0, wa[3], STKSIZE, thread2, 0); + threads[4] = chThdCreate(chThdGetPriority()-5, 0, wa[4], STKSIZE, thread2, 0); + n = msg_loop_test(threads[0]); + chThdTerminate(threads[0]); + chMsgSend(threads[0], 0); + test_wait_threads(); + test_print("--- Score : "); + test_printn(n); + test_print(" msgs/S, "); + test_printn(n << 1); + test_println(" ctxswc/S"); +} + +const struct testcase testbmk3 = { + bmk3_gettest, + bmk3_setup, + bmk3_teardown, + bmk3_execute +}; + +static char *bmk4_gettest(void) { + + return "Benchmark, threads creation/termination"; +} + +static void bmk4_setup(void) { +} + +static void bmk4_teardown(void) { +} + +static void bmk4_execute(void) { + + systime_t start = test_wait_tick(); + systime_t end = start + 1000; + uint32_t n = 0; + while (chSysInTimeWindow(start, end)) { + threads[0] = chThdCreate(chThdGetPriority()-1, 0, wa[0], STKSIZE, thread2, NULL); + chThdWait(threads[0]); + n++; +#if defined(WIN32) + ChkIntSources(); +#endif + } + test_print("--- Score : "); + test_printn(n); + test_println(" threads/S"); +} + +const struct testcase testbmk4 = { + bmk4_gettest, + bmk4_setup, + bmk4_teardown, + bmk4_execute +}; + +static char *bmk5_gettest(void) { + + return "Benchmark, I/O Queues throughput"; +} + +static void bmk5_setup(void) { +} + +static void bmk5_teardown(void) { +} + +static void bmk5_execute(void) { + static uint8_t ib[16]; + static Queue iq; + + chIQInit(&iq, ib, sizeof(ib), NULL); + systime_t start = test_wait_tick(); + systime_t end = start + 1000; + uint32_t n = 0; + while (chSysInTimeWindow(start, end)) { + chIQPutI(&iq, 0); + chIQPutI(&iq, 1); + chIQPutI(&iq, 2); + chIQPutI(&iq, 3); + (void)chIQGet(&iq); + (void)chIQGet(&iq); + (void)chIQGet(&iq); + (void)chIQGet(&iq); + n++; +#if defined(WIN32) + ChkIntSources(); +#endif + } + test_print("--- Score : "); + test_printn(n * 4); + test_println(" bytes/S"); +} + +const struct testcase testbmk5 = { + bmk5_gettest, + bmk5_setup, + bmk5_teardown, + bmk5_execute +}; diff --git a/test/testbmk.h b/test/testbmk.h new file mode 100644 index 000000000..346e4c842 --- /dev/null +++ b/test/testbmk.h @@ -0,0 +1,25 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _TESTBMK_H_ +#define _TESTBMK_H_ + +extern const struct testcase testbmk1, testbmk2, testbmk3, testbmk4, testbmk5; + +#endif /* _TESTBMK_H_ */ -- cgit v1.2.3