X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fpreempt.c;h=f77dd85eff1c632bbd73adf1053b350140cfc1ca;hb=938512200c9fbd8e08c88dbdddbdc1f030d3b663;hp=2f44164b20174382c48355b08842fe2e314b5e51;hpb=6fa2660c8ba089bbf8a1d711f46f882604ff9a6c;p=bertos.git diff --git a/bertos/kern/preempt.c b/bertos/kern/preempt.c index 2f44164b..f77dd85e 100644 --- a/bertos/kern/preempt.c +++ b/bertos/kern/preempt.c @@ -91,7 +91,6 @@ #include #include -#include // idle_proc #include // CPU_IDLE #include // IRQ_DISABLE()... #include @@ -103,14 +102,6 @@ CONFIG_DEPEND(CONFIG_KERN_PREEMPT, CONFIG_KERN); MOD_DEFINE(preempt) -/** - * CPU dependent context switching routines. - * - * 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(cpu_stack_t **new_sp, cpu_stack_t **save_sp); - /* Global preemption nesting counter */ cpu_atomic_t preempt_count; @@ -137,39 +128,8 @@ void preempt_init(void); */ static void preempt_schedule(void) { - Process *old_process = current_process; - - IRQ_ASSERT_DISABLED(); - - /* Poll on the ready queue for the first ready process */ - LIST_ASSERT_VALID(&proc_ready_list); - current_process = (Process *)list_remHead(&proc_ready_list); - if (UNLIKELY(!current_process)) - current_process = idle_proc; _proc_quantum = CONFIG_KERN_QUANTUM; - /* - * Optimization: don't switch contexts when the active process has not - * changed. - */ - if (LIKELY(old_process != current_process)) - { - cpu_stack_t *dummy; - - /* - * Save context of old process and switch to new process. If - * there is no old process, we save the old stack pointer into - * a dummy variable that we ignore. In fact, this happens only - * when the old process has just exited. - * - * \todo Instead of physically clearing the process at exit - * time, a zombie list should be created. - */ - asm_switch_context(¤t_process->stack, - old_process ? &old_process->stack : &dummy); - } - - /* This RET resumes the execution on the new process */ - LOG_INFO("resuming %p:%s\n", current_process, proc_currentName()); + proc_schedule(); } /** @@ -196,8 +156,7 @@ void preempt_preempt(void) /* Perform the kernel preemption */ LOG_INFO("preempting %p:%s\n", current_process, proc_currentName()); /* We are inside a IRQ context, so ATOMIC is not needed here */ - if (current_process != idle_proc) - SCHED_ENQUEUE(current_process); + SCHED_ENQUEUE(current_process); preempt_schedule(); } @@ -239,6 +198,5 @@ void preempt_yield(void) void preempt_init(void) { - idle_init(); MOD_INIT(preempt); }