From cf1b70f486a2696d523d585e91d0e4e5c7b8021c Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 18 Mar 2010 16:01:11 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1749 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- docs/src/atomic.dox | 16 ++++++++-------- os/kernel/include/chschd.h | 15 ++++++++++++++- os/kernel/include/chsys.h | 2 +- os/kernel/src/chschd.c | 18 ++++++++---------- os/ports/GCC/ARM7/chcoreasm.s | 8 +++++--- os/ports/GCC/PPC/SPC56x/ivor.s | 2 +- readme.txt | 6 +++--- test/testbmk.c | 10 +++++----- 8 files changed, 45 insertions(+), 32 deletions(-) diff --git a/docs/src/atomic.dox b/docs/src/atomic.dox index 0e9974ff1..d3bc43ba5 100644 --- a/docs/src/atomic.dox +++ b/docs/src/atomic.dox @@ -20,38 +20,38 @@ /** * @page article_atomic Invoking multiple primitives as a single atomic operation * It is often necessary to invoke multiple operations involving a - * reschedulation as a single atomic operation.
+ * reschedule as a single atomic operation.
* ChibiOS/RT already implements APIs that perform complex operations, as * example the API @p chSemSignalWait() performs two operations atomically.
* If more complex operations are required in your application then it is * possible to build macro-operations, see the following example: * @code chSysLock(); - + chSemSignalI(&sem1); chSemSignalI(&sem2); chMtxUnlockS(); chSchRescheduleS(); - + chSysUnlock(); * @endcode * The above example performs a signal operation on two semaphores, unlocks the - * last aquired mutex and finally performs a reschedulation. All the operations + * last acquired mutex and finally performs a reschedule. All the operations * are performed atomically.
- * An hypotetical @p chSemSignalSignalWait() operation could be implemented as + * An hypothetical @p chSemSignalSignalWait() operation could be implemented as * follow: * @code chSysLock(); - + chSemSignalI(&sem1); chSemSignalI(&sem2); chSemWaitS(&Sem3); /* May reschedule or not. */ chSchRescheduleS(); /* This one reschedules if necessary. */ - + chSysUnlock(); * @endcode * In general multiple @ref I-Class and (non rescheduling) @ref S-Class APIs * can be included and the block is terminated by a rescheduling @ref S-Class * API. An extra @p chSchRescheduleS() can be present at the very end of the - * block, it only reschedules if a reschedulation is still required. + * block, it only reschedules if a reschedule is still required. */ diff --git a/os/kernel/include/chschd.h b/os/kernel/include/chschd.h index b8406722b..d1b69cad5 100644 --- a/os/kernel/include/chschd.h +++ b/os/kernel/include/chschd.h @@ -105,14 +105,27 @@ register Thread *currp asm(CH_CURRP_REGISTER_CACHE); extern "C" { #endif void scheduler_init(void); +#if !defined(PORT_OPTIMIZED_READYI) Thread *chSchReadyI(Thread *tp); +#endif +#if !defined(PORT_OPTIMIZED_GOSLEEPS) void chSchGoSleepS(tstate_t newstate); +#endif +#if !defined(PORT_OPTIMIZED_GOSLEEPTIMEOUTS) msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time); +#endif +#if !defined(PORT_OPTIMIZED_WAKEUPS) void chSchWakeupS(Thread *tp, msg_t msg); +#endif +#if !defined(PORT_OPTIMIZED_DORESCHEDULEI) void chSchDoRescheduleI(void); +#endif +#if !defined(PORT_OPTIMIZED_RESCHEDULES) void chSchRescheduleS(void); +#endif +#if !defined(PORT_OPTIMIZED_ISRESCHREQUIREDEXI) bool_t chSchIsRescRequiredExI(void); - void chSchDoYieldS(void); +#endif #ifdef __cplusplus } #endif diff --git a/os/kernel/include/chsys.h b/os/kernel/include/chsys.h index 0a2fa67ad..5c773136f 100644 --- a/os/kernel/include/chsys.h +++ b/os/kernel/include/chsys.h @@ -148,7 +148,7 @@ /** * @brief IRQ handler exit code. * @note Usually IRQ handlers function are also declared naked. - * @note This macro usually performs the final reschedulation by using + * @note This macro usually performs the final reschedule by using * @p chSchRescRequiredI() and @p chSchDoRescheduleI(). */ #define CH_IRQ_EPILOGUE() PORT_IRQ_EPILOGUE() diff --git a/os/kernel/src/chschd.c b/os/kernel/src/chschd.c index 9bf34d43a..ac69c6661 100644 --- a/os/kernel/src/chschd.c +++ b/os/kernel/src/chschd.c @@ -105,23 +105,21 @@ void chSchGoSleepS(tstate_t newstate) { } #endif /* !defined(PORT_OPTIMIZED_GOSLEEPS) */ +#if !defined(PORT_OPTIMIZED_GOSLEEPTIMEOUTS) || defined(__DOXYGEN__) /* * Timeout wakeup callback. */ static void wakeup(void *p) { Thread *tp = (Thread *)p; -#if CH_USE_SEMAPHORES || CH_USE_MUTEXES || CH_USE_CONDVARS +#if CH_USE_SEMAPHORES || (CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT) switch (tp->p_state) { #if CH_USE_SEMAPHORES case THD_STATE_WTSEM: chSemFastSignalI((Semaphore *)tp->p_u.wtobjp); /* Falls into, intentional. */ #endif -#if CH_USE_MUTEXES - case THD_STATE_WTMTX: -#endif -#if CH_USE_CONDVARS +#if CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT case THD_STATE_WTCOND: #endif /* States requiring dequeuing.*/ @@ -166,6 +164,7 @@ msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time) { chSchGoSleepS(newstate); return currp->p_u.rdymsg; } +#endif /* !defined(PORT_OPTIMIZED_GOSLEEPTIMEOUTS) */ /** * @brief Wakes up a thread. @@ -191,8 +190,7 @@ void chSchWakeupS(Thread *ntp, msg_t msg) { if (ntp->p_prio <= currp->p_prio) chSchReadyI(ntp); else { - Thread *otp = currp; - chSchReadyI(otp); + Thread *otp = chSchReadyI(currp); #if CH_TIME_QUANTUM > 0 rlist.r_preempt = CH_TIME_QUANTUM; #endif @@ -225,7 +223,7 @@ void chSchDoRescheduleI(void) { #endif /* !defined(PORT_OPTIMIZED_DORESCHEDULEI) */ /** - * @brief Performs a reschedulation if a higher priority thread is runnable. + * @brief Performs a reschedule if a higher priority thread is runnable. * @details If a thread with a higher priority than the current thread is in * the ready list then make the higher priority thread running. */ @@ -238,14 +236,14 @@ void chSchRescheduleS(void) { #endif /* !defined(PORT_OPTIMIZED_RESCHEDULES) */ /** - * @brief Evaluates if a reschedulation is required. + * @brief Evaluates if a reschedule is required. * @details The decision is taken by comparing the relative priorities and * depending on the state of the round robin timeout counter. * @note This function is meant to be used in the timer interrupt handler * where @p chVTDoTickI() is invoked. * * @retval TRUE if there is a thread that should go in running state. - * @retval FALSE if a reschedulation is not required. + * @retval FALSE if a reschedule is not required. */ #if !defined(PORT_OPTIMIZED_ISRESCHREQUIREDEXI) || defined(__DOXYGEN__) bool_t chSchIsRescRequiredExI(void) { diff --git a/os/ports/GCC/ARM7/chcoreasm.s b/os/ports/GCC/ARM7/chcoreasm.s index 8726d0c28..098faf180 100644 --- a/os/ports/GCC/ARM7/chcoreasm.s +++ b/os/ports/GCC/ARM7/chcoreasm.s @@ -23,9 +23,10 @@ * @addtogroup ARM7_CORE * @{ */ -/** @cond never */ -#include +#include "chconf.h" + +#if !defined(__DOXYGEN__) .set MODE_USR, 0x10 .set MODE_FIQ, 0x11 @@ -230,5 +231,6 @@ jmpr4: bx r4 #endif /* !THUMB_NO_INTERWORKING */ -/** @endcond */ +#endif /* !defined(__DOXYGEN__) */ + /** @} */ diff --git a/os/ports/GCC/PPC/SPC56x/ivor.s b/os/ports/GCC/PPC/SPC56x/ivor.s index 0f4c85cf3..534e4b0d5 100644 --- a/os/ports/GCC/PPC/SPC56x/ivor.s +++ b/os/ports/GCC/PPC/SPC56x/ivor.s @@ -136,7 +136,7 @@ IVOR4: ori %r3, %r3, INTC_EOIR@l stw %r3, 0(%r3) /* Writing any value should do. */ - /* Verifies if a reschedulation is required.*/ + /* Verifies if a reschedule is required.*/ bl chSchIsRescRequiredExI cmpli cr0, %r3, 0 beq cr0, .ctxrestore diff --git a/readme.txt b/readme.txt index 5026e1ac5..915f7c498 100644 --- a/readme.txt +++ b/readme.txt @@ -91,7 +91,7 @@ *** 1.5.3 *** - FIX: Removed C99-style variables declarations (bug 2964418)(backported in 1.4.2). -- FIX: Fixed missing reschedulation in chEvtSignal() (bug 2961208)(backported +- FIX: Fixed missing reschedule in chEvtSignal() (bug 2961208)(backported in 1.4.2). - NEW: Added STM8 port and demo, the demo targets the Raisonance REva board with STM8S208RB piggyback. @@ -835,14 +835,14 @@ faster if the feature is not required. Threads at the same priority level are still supported when the feature is disabled but the scheduling among them becomes cooperative. -- OPT: Improved reschedulation time by reordering the sequence of operations, +- OPT: Improved reschedule time by reordering the sequence of operations, now during enqueuing the ready list contains one less element. This change also slightly improves the interrupt latency. - OPT: Optimization to the chSemReset(), reversed the order of dequeuing. - FIX: Fixed a bug in the chThdSetPriority() API. - FIX: Modified the structure names into nvic.h in order to not make them collide with external libraries. -- Added a benchmark to the test suit that measures the mass reschedulation +- Added a benchmark to the test suit that measures the mass reschedule performance. - Added a test_terminate_threads() function to the test framework. - Made the Cortex-M3 port preemption code more readable. diff --git a/test/testbmk.c b/test/testbmk.c index e07b7018b..46c30081e 100644 --- a/test/testbmk.c +++ b/test/testbmk.c @@ -356,7 +356,7 @@ const struct testcase testbmk6 = { }; /** - * @page test_benchmarks_007 Mass reschedulation performance + * @page test_benchmarks_007 Mass reschedule performance * *

Description

* Five threads are created and atomically reschedulated by resetting the @@ -376,7 +376,7 @@ static msg_t thread3(void *p) { static char *bmk7_gettest(void) { - return "Benchmark, mass reschedulation, 5 threads"; + return "Benchmark, mass reschedule, 5 threads"; } static void bmk7_setup(void) { @@ -409,7 +409,7 @@ static void bmk7_execute(void) { test_print("--- Score : "); test_printn(n); - test_print(" reschedulations/S, "); + test_print(" reschedules/S, "); test_printn(n * 6); test_println(" ctxswc/S"); } @@ -422,7 +422,7 @@ const struct testcase testbmk7 = { }; /** - * @page test_benchmarks_008 I/O Round-Robin voluntary reschedulation. + * @page test_benchmarks_008 I/O Round-Robin voluntary reschedule. * *

Description

* Five threads are created at equal priority, each thread just increases a @@ -469,7 +469,7 @@ static void bmk8_execute(void) { test_print("--- Score : "); test_printn(n); - test_print(" reschedulations/S, "); + test_print(" reschedules/S, "); test_printn(n); test_println(" ctxswc/S"); }