* the GNU General Public License.
*
* Copyright 2001, 2004, 2008 Develer S.r.l. (http://www.develer.com/)
- * Copyright 1999, 2000, 2001 Bernie Innocenti <bernie@codewiz.org>
+ * Copyright 1999, 2000, 2001, 2008 Bernie Innocenti <bernie@codewiz.org>
* -->
*
- * \brief Simple realtime multitasking scheduler.
- * Context switching is only done cooperatively.
+ * \brief Simple cooperative multitasking scheduler.
*
- * \version $Id: proc.c 1616 2008-08-10 19:41:26Z bernie $
+ * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
* \author Stefano Fedrigo <aleph@develer.com>
*/
* Saving and restoring the context on the stack is done by a CPU-dependent
* support routine which usually needs to be written in assembly.
*/
-EXTERN_C void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
+EXTERN_C void asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **save_sp);
/**
* System scheduler: pass CPU control to the next process in
* the ready queue.
*/
-void proc_schedule(void)
+static void proc_schedule(void)
{
- struct Process *old_process;
- cpuflags_t flags;
+ cpu_flags_t flags;
- ATOMIC(LIST_ASSERT_VALID(&ProcReadyList));
+ ATOMIC(LIST_ASSERT_VALID(&proc_ready_list));
ASSERT_USER_CONTEXT();
- ASSERT_IRQ_ENABLED();
-
- /* Remember old process to save its context later */
- old_process = CurrentProcess;
+ IRQ_ASSERT_ENABLED();
/* Poll on the ready queue for the first ready process */
IRQ_SAVE_DISABLE(flags);
- while (!(CurrentProcess = (struct Process *)list_remHead(&ProcReadyList)))
+ while (!(current_process = (struct Process *)list_remHead(&proc_ready_list)))
{
/*
* Make sure we physically reenable interrupts here, no matter what
* process will ever wake up.
*
* During idle-spinning, an interrupt can occur and it may
- * modify \p ProcReadyList. To ensure that compiler reload this
+ * modify \p proc_ready_list. To ensure that compiler reload this
* variable every while cycle we call CPU_MEMORY_BARRIER.
* The memory barrier ensure that all variables used in this context
* are reloaded.
IRQ_DISABLE;
}
IRQ_RESTORE(flags);
+}
+
+void proc_switch(void)
+{
+ /* Remember old process to save its context later */
+ Process * const old_process = current_process;
+
+ proc_schedule();
/*
* Optimization: don't switch contexts when the active
* process has not changed.
*/
- if (CurrentProcess != old_process)
+ if (current_process != old_process)
{
- cpustack_t *dummy;
+ cpu_stack_t *dummy;
#if CONFIG_KERN_MONITOR
LOG_INFO("Switch from %p(%s) to %p(%s)\n",
- old_process, old_process ? old_process->monitor.name : "NONE",
- CurrentProcess, CurrentProcess->monitor.name);
+ old_process, proc_name(old_process),
+ current_process, proc_currentName());
#endif
/* Save context of old process and switch to new process. If there is no
* TODO: Instead of physically clearing the process at exit time, a zombie
* list should be created.
*/
- asm_switch_context(&CurrentProcess->stack, old_process ? &old_process->stack : &dummy);
+ asm_switch_context(¤t_process->stack, old_process ? &old_process->stack : &dummy);
}
/* This RET resumes the execution on the new process */
}
-
/**
* Co-operative context switch
*/
-void proc_switch(void)
+void proc_yield(void)
{
- ATOMIC(SCHED_ENQUEUE(CurrentProcess));
-
- proc_schedule();
+ ATOMIC(SCHED_ENQUEUE(current_process));
+ proc_switch();
}