From b3a622c7200d4f2bda6bf89579168f49d1b249ed Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 9 May 2009 14:54:51 +0000 Subject: [PATCH] Fixed bug 2789383. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/stable_1.2.x@958 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- readme.txt | 1 + test/test.c | 9 ++-- test/test.h | 4 +- test/testmtx.c | 126 ++++++++++++++++++++++++++++--------------------- 4 files changed, 82 insertions(+), 58 deletions(-) diff --git a/readme.txt b/readme.txt index e28cf6ec9..2a2e81cdd 100644 --- a/readme.txt +++ b/readme.txt @@ -64,6 +64,7 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, - FIX: Fixed macro in test.h (bug 2781176). - FIX: Fixed @file tag in sam7x_serial.c (bug 2788573). - FIX: Fixed sequence assertion in test.c (bug 2789377). +- FIX: Fixed test_cpu_pulse() incorrect behavior (bug 2789383). *** 1.2.1 *** - FIX: Fixed regression in MinGW demo (bug 2745153). diff --git a/test/test.c b/test/test.c index 4372dce16..51bc88870 100644 --- a/test/test.c +++ b/test/test.c @@ -176,16 +176,17 @@ void test_wait_threads(void) { chThdWait(threads[i]); } -void test_cpu_pulse(unsigned ms) { +#if CH_DBG_THREADS_PROFILING +void test_cpu_pulse(unsigned duration) { - systime_t duration = MS2ST(ms); - systime_t start = chTimeNow(); - while (chTimeIsWithin(start, start + duration)) { + systime_t end = chThdSelf()->p_time + MS2ST(duration); + while (chThdSelf()->p_time < end) { #if defined(WIN32) ChkIntSources(); #endif } } +#endif systime_t test_wait_tick(void) { diff --git a/test/test.h b/test/test.h index b1d367e8f..0d2423d19 100644 --- a/test/test.h +++ b/test/test.h @@ -69,8 +69,10 @@ extern "C" { void test_terminate_threads(void); void test_wait_threads(void); systime_t test_wait_tick(void); - void test_cpu_pulse(unsigned ms); void test_start_timer(unsigned ms); +#if CH_DBG_THREADS_PROFILING + void test_cpu_pulse(unsigned duration); +#endif #if defined(WIN32) void ChkIntSources(void); #endif diff --git a/test/testmtx.c b/test/testmtx.c index 98b6f2142..121ffda3f 100644 --- a/test/testmtx.c +++ b/test/testmtx.c @@ -75,6 +75,7 @@ const struct testcase testmtx1 = { mtx1_execute }; +#if CH_DBG_THREADS_PROFILING static char *mtx2_gettest(void) { return "Mutexes, priority inheritance, simple case"; @@ -85,45 +86,54 @@ static void mtx2_setup(void) { chMtxInit(&m1); } -static msg_t thread2(void *p) { +/* Low priority thread */ +static msg_t thread2L(void *p) { - chThdSleepMilliseconds(10); chMtxLock(&m1); + test_cpu_pulse(40); chMtxUnlock(); - test_emit_token(*(char *)p); + test_cpu_pulse(10); + test_emit_token('C'); return 0; } -static msg_t thread3(void *p) { - - chMtxLock(&m1); - chThdSleepMilliseconds(40); - chMtxUnlock(); - test_emit_token(*(char *)p); - return 0; -} - -static msg_t thread4(void *p) { +/* Medium priority thread */ +static msg_t thread2M(void *p) { chThdSleepMilliseconds(20); - test_cpu_pulse(50); - test_emit_token(*(char *)p); + test_cpu_pulse(40); + test_emit_token('B'); + return 0; +} + +/* High priority thread */ +static msg_t thread2H(void *p) { + + chThdSleepMilliseconds(40); + chMtxLock(&m1); + test_cpu_pulse(10); + chMtxUnlock(); + test_emit_token('A'); return 0; } /* - * Time - * 0 ++++++++++++++++++AL+....2++++++++++++++AU0------------------------------ - * 1 .....................++-------------------------------------------------- - * 2 .......................++AL.............+++++++++AU++++++++++++++++++++++ + * Time ----> 0 10 20 30 40 50 60 70 80 90 100 + * 0 ......AL++++++++++............2+++++++++++AU0---------------++++++G... + * 1 ..................++++++++++++------------------++++++++++++G......... + * 2 .............................AL..........++++++AUG................... */ static void mtx2_execute(void) { + systime_t time; - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-1, thread2, "A"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-3, thread3, "C"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-2, thread4, "B"); + test_wait_tick(); + time = chTimeNow(); + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-1, thread2H, 0); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-2, thread2M, 0); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread2L, 0); test_wait_threads(); - test_assert_sequence("ABC"); + test_assert_sequence(1, "ABC"); + test_assert_time_window(2, time + MS2ST(100), time + MS2ST(100) + ALLOWED_DELAY); } const struct testcase testmtx2 = { @@ -140,78 +150,87 @@ static char *mtx3_gettest(void) { static void mtx3_setup(void) { - chMtxInit(&m1); - chMtxInit(&m2); + chMtxInit(&m1); // Mutex B + chMtxInit(&m2); // Mutex A } -static msg_t thread5(void *p) { +/* Lowest priority thread */ +static msg_t thread3LL(void *p) { chMtxLock(&m1); - test_cpu_pulse(50); + test_cpu_pulse(30); chMtxUnlock(); - test_emit_token(*(char *)p); + test_emit_token('E'); return 0; } -static msg_t thread6(void *p) { +/* Low priority thread */ +static msg_t thread3L(void *p) { chThdSleepMilliseconds(10); chMtxLock(&m2); test_cpu_pulse(20); chMtxLock(&m1); - test_cpu_pulse(50); + test_cpu_pulse(10); chMtxUnlock(); - test_cpu_pulse(20); + test_cpu_pulse(10); chMtxUnlock(); - test_emit_token(*(char *)p); + test_emit_token('D'); return 0; } -static msg_t thread7(void *p) { +/* Medium priority thread */ +static msg_t thread3M(void *p) { chThdSleepMilliseconds(20); chMtxLock(&m2); - test_cpu_pulse(50); + test_cpu_pulse(10); chMtxUnlock(); - test_emit_token(*(char *)p); + test_emit_token('C'); return 0; } -static msg_t thread8(void *p) { +/* High priority thread */ +static msg_t thread3H(void *p) { chThdSleepMilliseconds(40); - test_cpu_pulse(200); - test_emit_token(*(char *)p); + test_cpu_pulse(20); + test_emit_token('B'); return 0; } -static msg_t thread9(void *p) { +/* Highest priority thread */ +static msg_t thread3HH(void *p) { chThdSleepMilliseconds(50); chMtxLock(&m2); - test_cpu_pulse(50); + test_cpu_pulse(10); chMtxUnlock(); - test_emit_token(*(char *)p); + test_emit_token('A'); return 0; } /* - * Time 0 10 20 30 40 50 - * 0 +++BL++------------------2++++------4+++++BU0-------------------------- - * 1 .......++AL++--2+++++++++BL.........4.....++++++++BU4++++AU1----------- - * 2 .............++AL............................................------++AU - * 3 ..............................++++-------------------------------++.... - * 4 ..................................++AL...................++++AU++...... + * Time ----> 0 10 20 30 40 50 60 70 80 90 100 110 + * 0 ......BL++++------------2+++++------4+++++BU0---------------------------G..... + * 1 ............AL++++2+++++BL----------4-----++++++BU4+++AU1---------------G..... + * 2 ..................AL----------------------------------------------++++++AUG... + * 3 ..............................+++++++-----------------------++++++G........... + * 4 ....................................AL................++++++AUG............... */ static void mtx3_execute(void) { + systime_t time; - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-5, thread5, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-4, thread6, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread7, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-2, thread8, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread9, "A"); + test_wait_tick(); + time = chTimeNow(); + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-5, thread3LL, 0); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-4, thread3L, 0); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread3M, 0); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-2, thread3H, 0); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread3HH, 0); test_wait_threads(); - test_assert_sequence("ABCDE"); + test_assert_sequence(1, "ABCDE"); + test_assert_time_window(2, time + MS2ST(110), time + MS2ST(110) + ALLOWED_DELAY); } const struct testcase testmtx3 = { @@ -220,6 +239,7 @@ const struct testcase testmtx3 = { NULL, mtx3_execute }; +#endif /* CH_DBG_THREADS_PROFILING */ #if CH_USE_CONDVARS static char *mtx4_gettest(void) {