X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fcoop.c;h=aa370ae589f6c5c589b851afe817030a1dd9e224;hb=2e550c2c1429d917fd7188c3a92bc7eb87536d98;hp=f49f9dce7b1565ad9933195b7148a9b0c618850f;hpb=8200b51bd42e69333cbb3d50532bbd8b45201da2;p=bertos.git diff --git a/bertos/kern/coop.c b/bertos/kern/coop.c index f49f9dce..aa370ae5 100644 --- a/bertos/kern/coop.c +++ b/bertos/kern/coop.c @@ -27,11 +27,10 @@ * the GNU General Public License. * * Copyright 2001, 2004, 2008 Develer S.r.l. (http://www.develer.com/) - * Copyright 1999, 2000, 2001 Bernie Innocenti + * Copyright 1999, 2000, 2001, 2008 Bernie Innocenti * --> * - * \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 $ * \author Bernie Innocenti @@ -57,24 +56,20 @@ * 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)); 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); @@ -101,6 +96,14 @@ void proc_schedule(void) IRQ_DISABLE; } IRQ_RESTORE(flags); +} + +void proc_switch(void) +{ + /* Remember old process to save its context later */ + Process * const old_process = CurrentProcess; + + proc_schedule(); /* * Optimization: don't switch contexts when the active @@ -108,12 +111,12 @@ void proc_schedule(void) */ if (CurrentProcess != 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), + CurrentProcess, proc_currentName()); #endif /* Save context of old process and switch to new process. If there is no @@ -136,6 +139,5 @@ void proc_schedule(void) void proc_yield(void) { ATOMIC(SCHED_ENQUEUE(CurrentProcess)); - - proc_schedule(); + proc_switch(); }