diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/chinit.c | 10 | ||||
-rw-r--r-- | src/chthreads.c | 21 | ||||
-rw-r--r-- | src/include/threads.h | 1 | ||||
-rw-r--r-- | src/templates/chcore.c | 18 |
4 files changed, 45 insertions, 5 deletions
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.
|