*
* \brief Idle loop for preemptive scheduling
*
- * \version $Id: proc.c 1616 2008-08-10 19:41:26Z bernie $
+ * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
*/
#include "idle.h"
#include "proc.h"
+#include <cpu/power.h> // cpu_relax()
#include <cfg/module.h>
+#include <cpu/types.h> // INT_MIN
+#include <kern/proc_p.h>
-static cpu_stack_t idle_stack[CONFIG_KERN_MINSTACKSIZE / sizeof(cpu_stack_t)];
+struct Process *idle_proc;
+
+static PROC_DEFINE_STACK(idle_stack, KERN_MINSTACKSIZE);
/**
* The idle process
{
for (;;)
{
- TRACE;
- //monitor_report();
- proc_yield(); // FIXME: CPU_IDLE
+ PAUSE;
+ proc_switch();
}
}
void idle_init(void)
{
- struct Process *idle_proc = proc_new(idle, NULL, sizeof(idle_stack), idle_stack);
- proc_setPri(idle_proc, (int)~0);
+ /*
+ * Idle will be added to the ProcReadyList, but immediately removed
+ * after the first cpu_relax() execution.
+ *
+ * XXX: it would be better to never add idle_proc to the ProcReadyList,
+ * e.g., changing the prototype of proc_new() (or introducing a
+ * proc_new_nostart()) to allow the creation of "sleeping" tasks.
+ */
+ idle_proc = proc_new(idle, NULL, sizeof(idle_stack), idle_stack);
+ proc_setPri(idle_proc, INT_MIN);
}