From b0033f388edf3db04aec0901420a06bbc0f7ada7 Mon Sep 17 00:00:00 2001 From: bernie Date: Mon, 25 Aug 2008 19:18:20 +0000 Subject: [PATCH 1/1] proc_switch(): rename from proc_schedule(). Split out the real cooperative scheduler. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1700 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/kern/coop.c | 21 ++++++++++++--------- bertos/kern/preempt.c | 10 +++++----- bertos/kern/proc.c | 5 ++--- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/bertos/kern/coop.c b/bertos/kern/coop.c index 4b2e6b88..dd3aee21 100644 --- a/bertos/kern/coop.c +++ b/bertos/kern/coop.c @@ -63,18 +63,14 @@ EXTERN_C void asm_switch_context(cpustack_t **new_sp, cpustack_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; ATOMIC(LIST_ASSERT_VALID(&ProcReadyList)); ASSERT_USER_CONTEXT(); ASSERT_IRQ_ENABLED(); - /* Remember old process to save its context later */ - old_process = CurrentProcess; - /* Poll on the ready queue for the first ready process */ IRQ_SAVE_DISABLE(flags); while (!(CurrentProcess = (struct Process *)list_remHead(&ProcReadyList))) @@ -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 */ + const Process *old_process = CurrentProcess; + + proc_schedule(); /* * Optimization: don't switch contexts when the active @@ -111,8 +115,8 @@ void proc_schedule(void) #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(); } diff --git a/bertos/kern/preempt.c b/bertos/kern/preempt.c index af9555d0..e24da145 100644 --- a/bertos/kern/preempt.c +++ b/bertos/kern/preempt.c @@ -73,7 +73,7 @@ static Timer preempt_timer; void idle_init(void); -void proc_preempt(void) +void proc_schedule(void) { IRQ_DISABLE; @@ -87,7 +87,7 @@ void proc_preempt(void) TRACEMSG("launching %p:%s", CurrentProcess, proc_currentName()); } -void proc_preempt_timer(UNUSED_ARG(void *, param)) +void proc_preempt(UNUSED_ARG(void *, param) { if (!preempt_forbid_cnt) { @@ -104,7 +104,7 @@ void proc_preempt_timer(UNUSED_ARG(void *, param)) // FIXME: this still break havocs, probably because of some reentrancy issue #if 0 SCHED_ENQUEUE(CurrentProcess); - proc_preempt(); + proc_schedule(); #endif #if CONFIG_KERN_PRI } @@ -117,7 +117,7 @@ void proc_preempt_timer(UNUSED_ARG(void *, param)) timer_add(&preempt_timer); } -void proc_schedule(void) +void proc_switch(void) { ATOMIC(LIST_ASSERT_VALID(&ProcReadyList)); TRACEMSG("%p:%s", CurrentProcess, proc_currentName()); @@ -139,7 +139,7 @@ void proc_yield(void) SCHED_ENQUEUE(CurrentProcess); IRQ_ENABLE; - proc_schedule(); + proc_switch(); } void proc_entry(void (*user_entry)(void)) diff --git a/bertos/kern/proc.c b/bertos/kern/proc.c index 577f0db4..9137dfba 100644 --- a/bertos/kern/proc.c +++ b/bertos/kern/proc.c @@ -30,8 +30,7 @@ * 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$ * \author Bernie Innocenti @@ -354,7 +353,7 @@ void proc_exit(void) #endif /* ARCH_EMUL */ CurrentProcess = NULL; - proc_schedule(); + proc_switch(); /* not reached */ } -- 2.25.1