From 00c6f5ea40f97385dce7ab7b9d20bc0cb909ad23 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 6 Oct 2007 09:53:07 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@40 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/chinit.c | 10 +++++++--- src/chthreads.c | 21 +++++++++++++++++++++ src/include/threads.h | 1 + src/templates/chcore.c | 18 ++++++++++++++++-- 4 files changed, 45 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/chinit.c b/src/chinit.c index b86626fa6..55a69b1fc 100644 --- a/src/chinit.c +++ b/src/chinit.c @@ -37,8 +37,12 @@ static Thread idlethread; * chThdCreate(...); // Starts one or more user threads. * chSysPause(); * @endcode - * @note Interrupts should be still disabled when \p chSysInit() is invoked and - * are internally enabled. + * @note Interrupts should be still disabled when \p chSysInit() is invoked + * and are internally enabled. + * @note The idle thread has absolute priority when exiting from the + * \p chSysInit(), this is done to make sure that all the initializations + * performed in the \p main() procedure are completed before any thread + * starts. The priority is set to \p IDLEPRIO into the \p chSysPause(). */ void chSysInit(void) { @@ -49,7 +53,7 @@ void chSysInit(void) { /* * Now this instructions flow becomes the idle thread. */ - _InitThread(IDLEPRIO, 0, &idlethread); + _InitThread(ABSPRIO, 0, &idlethread); idlethread.p_state = PRCURR; currp = &idlethread; diff --git a/src/chthreads.c b/src/chthreads.c index 608dabe89..28b276db5 100644 --- a/src/chthreads.c +++ b/src/chthreads.c @@ -100,6 +100,27 @@ Thread *chThdCreate(t_prio prio, t_tmode mode, void *workspace, return tp; } +/** + * Changes the thread priority, reschedules if necessary. + * @param newprio the new priority of the invoking thread + */ +void chThdSetPriority(t_prio newprio) { + + chSysLock(); + +#ifdef CH_USE_RT_SEMAPHORES + if (currp->p_rtcnt) + currp->p_prio = newprio + MEPRIO; + else + currp->p_prio = newprio; +#else + currp->p_prio = newprio; +#endif + chSchRescheduleI(); + + chSysUnlock(); +} + #ifdef CH_USE_RESUME /** * Resumes a thread created with the \p P_SUSPENDED option. diff --git a/src/include/threads.h b/src/include/threads.h index 2ed92fa39..0440b6007 100644 --- a/src/include/threads.h +++ b/src/include/threads.h @@ -191,6 +191,7 @@ extern "C" { #endif Thread *chThdCreate(t_prio prio, t_tmode mode, void *workspace, t_size wsize, t_tfunc pf, void *arg); + void chThdSetPriority(t_prio newprio); void chThdResume(Thread *tp); void chThdExit(t_msg msg); #ifdef CH_USE_TERMINATE diff --git a/src/templates/chcore.c b/src/templates/chcore.c index f39441ed5..bc8c68b90 100644 --- a/src/templates/chcore.c +++ b/src/templates/chcore.c @@ -33,14 +33,28 @@ /** * This function implements the idle thread infinite loop. The function should * put the processor in the lowest power mode capable to serve interrupts. + * The priority is internally set to the minimum system value so that this + * thread is executed only if there are no other ready threads in the system. */ -void chSysPause(void) {} +void chSysPause(void) { + + chThdSetPriority(IDLEPRIO); + + while (TRUE) + ; +} /** * Abonormal system termination handler. Invoked by the ChibiOS/RT when an * abnormal unrecoverable condition is met. */ -void chSysHalt(void) {} +void chSysHalt(void) { + + chSysLock(); + + while (TRUE) + ; +} /** * Context switch. -- cgit v1.2.3