X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fcoop.c;h=aa370ae589f6c5c589b851afe817030a1dd9e224;hb=e62ca0b357f09804d7d894949df44224c9d74bb7;hp=4b2e6b88a5c303598391e776789e4007f67e7681;hpb=c0cf049d091313c15e32ab9e521e4dcbc4662698;p=bertos.git diff --git a/bertos/kern/coop.c b/bertos/kern/coop.c index 4b2e6b88..aa370ae5 100644 --- a/bertos/kern/coop.c +++ b/bertos/kern/coop.c @@ -56,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); @@ -100,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 @@ -107,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 @@ -135,6 +139,5 @@ void proc_schedule(void) void proc_yield(void) { ATOMIC(SCHED_ENQUEUE(CurrentProcess)); - - proc_schedule(); + proc_switch(); }