From 339c8e993d31bc1585ade9d6b1e04d4bdceae630 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 13 Apr 2009 09:56:03 +0000 Subject: New benchmark added. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@900 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- readme.txt | 3 ++ test/testbmk.c | 139 ++++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 101 insertions(+), 41 deletions(-) diff --git a/readme.txt b/readme.txt index d5a1e3a72..9fb3876be 100644 --- a/readme.txt +++ b/readme.txt @@ -86,6 +86,9 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, - NEW: Added a code coverage analysis application under ./tests/coverage. - Added more test cases in order to improve the test suite code coverage (it was 74% in version 1.2.0). +- Added a new "naked" context switch benchmark that better defines the + real context switch time, for the STM32 the context switch is performed + under 1.48uS. *** 1.2.0 *** - Added license exception text to the 1.2.0 branch. diff --git a/test/testbmk.c b/test/testbmk.c index 8d02b8ae5..ad7f528e4 100644 --- a/test/testbmk.c +++ b/test/testbmk.c @@ -141,26 +141,51 @@ const struct testcase testbmk3 = { static char *bmk4_gettest(void) { - return "Benchmark, threads creation/termination, worst case"; + return "Benchmark, context switch #4, naked"; +} + +msg_t thread4(void *p) { + msg_t msg; + Thread *self = chThdSelf(); + + chSysLock(); + do { + chSchGoSleepS(PRSUSPENDED); + msg = self->p_rdymsg; + } while (msg == RDY_OK); + chSysUnlock(); + return 0; } static void bmk4_execute(void) { + Thread *tp; + tp = threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread4, NULL); uint32_t n = 0; - void *wap = wa[0]; - tprio_t prio = chThdGetPriority() - 1; test_wait_tick(); test_start_timer(1000); do { - chThdWait(chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL)); - n++; + chSysLock(); + chSchWakeupS(tp, RDY_OK); + chSchWakeupS(tp, RDY_OK); + chSchWakeupS(tp, RDY_OK); + chSchWakeupS(tp, RDY_OK); + chSysUnlock(); + n += 4; #if defined(WIN32) ChkIntSources(); #endif } while (!test_timer_done); + chSysLock(); + chSchWakeupS(tp, RDY_TIMEOUT); + chSysUnlock(); + + test_wait_threads(); test_print("--- Score : "); test_printn(n); - test_println(" threads/S"); + test_print(" msgs/S, "); + test_printn(n << 1); + test_println(" ctxswc/S"); } const struct testcase testbmk4 = { @@ -172,18 +197,18 @@ const struct testcase testbmk4 = { static char *bmk5_gettest(void) { - return "Benchmark, threads creation/termination, optimal"; + return "Benchmark, threads creation/termination, worst case"; } static void bmk5_execute(void) { uint32_t n = 0; void *wap = wa[0]; - tprio_t prio = chThdGetPriority() + 1; + tprio_t prio = chThdGetPriority() - 1; test_wait_tick(); test_start_timer(1000); do { - chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL); + chThdWait(chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL)); n++; #if defined(WIN32) ChkIntSources(); @@ -201,6 +226,37 @@ const struct testcase testbmk5 = { bmk5_execute }; +static char *bmk6_gettest(void) { + + return "Benchmark, threads creation/termination, optimal"; +} + +static void bmk6_execute(void) { + + uint32_t n = 0; + void *wap = wa[0]; + tprio_t prio = chThdGetPriority() + 1; + test_wait_tick(); + test_start_timer(1000); + do { + chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL); + n++; +#if defined(WIN32) + ChkIntSources(); +#endif + } while (!test_timer_done); + test_print("--- Score : "); + test_printn(n); + test_println(" threads/S"); +} + +const struct testcase testbmk6 = { + bmk6_gettest, + NULL, + NULL, + bmk6_execute +}; + static msg_t thread3(void *p) { while (!chThdShouldTerminate()) @@ -208,17 +264,17 @@ static msg_t thread3(void *p) { return 0; } -static char *bmk6_gettest(void) { +static char *bmk7_gettest(void) { return "Benchmark, mass reschedulation, 5 threads"; } -static void bmk6_setup(void) { +static void bmk7_setup(void) { chSemInit(&sem1, 0); } -static void bmk6_execute(void) { +static void bmk7_execute(void) { uint32_t n; threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread3, NULL); @@ -248,19 +304,19 @@ static void bmk6_execute(void) { test_println(" ctxswc/S"); } -const struct testcase testbmk6 = { - bmk6_gettest, - bmk6_setup, +const struct testcase testbmk7 = { + bmk7_gettest, + bmk7_setup, NULL, - bmk6_execute + bmk7_execute }; -static char *bmk7_gettest(void) { +static char *bmk8_gettest(void) { return "Benchmark, I/O Queues throughput"; } -static void bmk7_execute(void) { +static void bmk8_execute(void) { static uint8_t ib[16]; static Queue iq; @@ -287,21 +343,21 @@ static void bmk7_execute(void) { test_println(" bytes/S"); } -const struct testcase testbmk7 = { - bmk7_gettest, +const struct testcase testbmk8 = { + bmk8_gettest, NULL, NULL, - bmk7_execute + bmk8_execute }; -static char *bmk8_gettest(void) { +static char *bmk9_gettest(void) { return "Benchmark, virtual timers set/reset"; } static void tmo(void *param) {} -static void bmk8_execute(void) { +static void bmk9_execute(void) { static VirtualTimer vt1, vt2; uint32_t n = 0; @@ -324,24 +380,24 @@ static void bmk8_execute(void) { test_println(" timers/S"); } -const struct testcase testbmk8 = { - bmk8_gettest, +const struct testcase testbmk9 = { + bmk9_gettest, NULL, NULL, - bmk8_execute + bmk9_execute }; -static char *bmk9_gettest(void) { +static char *bmk10_gettest(void) { return "Benchmark, semaphores wait/signal"; } -static void bmk9_setup(void) { +static void bmk10_setup(void) { chSemInit(&sem1, 1); } -static void bmk9_execute(void) { +static void bmk10_execute(void) { uint32_t n = 0; test_wait_tick(); @@ -365,25 +421,25 @@ static void bmk9_execute(void) { test_println(" wait+signal/S"); } -const struct testcase testbmk9 = { - bmk9_gettest, - bmk9_setup, +const struct testcase testbmk10 = { + bmk10_gettest, + bmk10_setup, NULL, - bmk9_execute + bmk10_execute }; #if CH_USE_MUTEXES -static char *bmk10_gettest(void) { +static char *bmk11_gettest(void) { return "Benchmark, mutexes lock/unlock"; } -static void bmk10_setup(void) { +static void bmk11_setup(void) { chMtxInit(&mtx1); } -static void bmk10_execute(void) { +static void bmk11_execute(void) { uint32_t n = 0; test_wait_tick(); @@ -407,11 +463,11 @@ static void bmk10_execute(void) { test_println(" lock+unlock/S"); } -const struct testcase testbmk10 = { - bmk10_gettest, - bmk10_setup, +const struct testcase testbmk11 = { + bmk11_gettest, + bmk11_setup, NULL, - bmk10_execute + bmk11_execute }; #endif @@ -429,8 +485,9 @@ const struct testcase * const patternbmk[] = { &testbmk7, &testbmk8, &testbmk9, -#if CH_USE_MUTEXES &testbmk10, +#if CH_USE_MUTEXES + &testbmk11, #endif #endif NULL -- cgit v1.2.3