Parametric scheduler approach.
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 18 Mar 2010 14:54:41 +0000 (14:54 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 18 Mar 2010 14:54:41 +0000 (14:54 +0000)
Define distinct functions for each implemented scheduler class. This is
a first step toward the "plugin-scheduler" approach.

In this way we can also get rid of mtask.c.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3240 38d2e660-2303-0410-9eaa-f027e97ec537

13 files changed:
bertos/cpu/irq.h
bertos/kern/coop.c
bertos/kern/mtask.c [deleted file]
bertos/kern/preempt.c
bertos/kern/preempt.h
bertos/kern/proc.c
bertos/kern/proc.h
bertos/kern/proc_p.h
examples/at91sam7/at91sam7s.mk
examples/at91sam7/at91sam7x.mk
examples/demo/demo.mk
test/get_source_list.sh
test/run_tests.sh

index 4e61f20a41590f3462d3e602f96289a683447f40..466b524da2959f637f495be8121a3ef7ab63f624 100644 (file)
@@ -44,7 +44,7 @@
 #include "detect.h"
 #include "types.h"
 
-#include <kern/preempt.h>
+#include <kern/proc.h> /* proc_needPreempt() / proc_preempt() */
 
 #include <cfg/compiler.h> /* for uintXX_t */
 #include "cfg/cfg_proc.h" /* CONFIG_KERN_PREEMPT */
index be3d6dfdb0756915bf339ab8e3bc8ab0476a0673..2173126017acf0ffb2187ae5b0a3fb6f085c1ef2 100644 (file)
@@ -63,7 +63,7 @@ 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.
  */
-static void proc_schedule(void)
+static void coop_schedule(void)
 {
        cpu_flags_t flags;
 
@@ -98,12 +98,12 @@ static void proc_schedule(void)
        IRQ_RESTORE(flags);
 }
 
-void proc_switch(void)
+void coop_switch(void)
 {
        /* Remember old process to save its context later */
        Process * const old_process = current_process;
 
-       proc_schedule();
+       coop_schedule();
 
        /*
         * Optimization: don't switch contexts when the active
@@ -135,7 +135,7 @@ void proc_switch(void)
 /**
  * Co-operative context switch
  */
-void proc_yield(void)
+void coop_yield(void)
 {
        ATOMIC(SCHED_ENQUEUE(current_process));
        proc_switch();
diff --git a/bertos/kern/mtask.c b/bertos/kern/mtask.c
deleted file mode 100644 (file)
index ee51e83..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * \file
- * <!--
- * This file is part of BeRTOS.
- *
- * Bertos is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * As a special exception, you may use this file as part of a free software
- * library without restriction.  Specifically, if other files instantiate
- * templates or use macros or inline functions from this file, or you compile
- * this file and link it with other files to produce an executable, this
- * file does not by itself cause the resulting executable to be covered by
- * the GNU General Public License.  This exception does not however
- * invalidate any other reasons why the executable file might be covered by
- * the GNU General Public License.
- *
- * Copyright 2001, 2004, 2008 Develer S.r.l. (http://www.develer.com/)
- * Copyright 1999, 2000, 2001, 2008 Bernie Innocenti <bernie@codewiz.org>
- * -->
- *
- * \brief Choose the multitasking scheduler.
- *
- * \author Francesco Sacchi <batt@develer.com>
- */
-
-
-#include "cfg/cfg_proc.h"
-
-/*
- * Choose which file to compile depending on
- * the multitasking type.
- */
-#if CONFIG_KERN_PREEMPT
-       #include "preempt.c"
-#else
-       #include "coop.c"
-#endif
-
index 3037c15cc47f4258fb342e896b15c3937d054cbb..d3d9badf98f18f688c77f873c91f81aed0ba2818 100644 (file)
@@ -39,7 +39,7 @@
  * the time sharing interval.
  *
  * When the quantum expires the handler proc_needPreempt() checks if the
- * preemption is enabled and in this case proc_schedule() is called, that
+ * preemption is enabled and in this case preempt_schedule() is called, that
  * possibly replaces the current running thread with a different one.
  *
  * The preemption can be disabled or enabled via proc_forbid() and
@@ -126,7 +126,7 @@ int _proc_quantum;
 /**
  * Call the scheduler and eventually replace the current running process.
  */
-static void proc_schedule(void)
+static void preempt_schedule(void)
 {
        Process *old_process = current_process;
 
@@ -166,7 +166,7 @@ static void proc_schedule(void)
 /**
  * Check if we need to schedule another task
  */
-int proc_needPreempt(void)
+int preempt_needPreempt(void)
 {
        if (UNLIKELY(current_process == NULL))
                return 0;
@@ -179,7 +179,7 @@ int proc_needPreempt(void)
 /**
  * Preempt the current task.
  */
-void proc_preempt(void)
+void preempt_preempt(void)
 {
        IRQ_ASSERT_DISABLED();
        ASSERT(current_process);
@@ -189,7 +189,7 @@ void proc_preempt(void)
        /* We are inside a IRQ context, so ATOMIC is not needed here */
        if (current_process != idle_proc)
                SCHED_ENQUEUE(current_process);
-       proc_schedule();
+       preempt_schedule();
 }
 
 /**
@@ -200,18 +200,18 @@ void proc_preempt(void)
  * \warning This should be considered an internal kernel function, even if it
  * is allowed, usage from application code is strongly discouraged.
  */
-void proc_switch(void)
+void preempt_switch(void)
 {
        ASSERT(proc_preemptAllowed());
        IRQ_ASSERT_ENABLED();
 
-       ATOMIC(proc_schedule());
+       ATOMIC(preempt_schedule());
 }
 
 /**
  * Voluntarily release the CPU.
  */
-void proc_yield(void)
+void preempt_yield(void)
 {
        /*
         * Voluntary preemption while preemption is disabled is considered
@@ -224,7 +224,7 @@ void proc_yield(void)
 
        ATOMIC(
                SCHED_ENQUEUE(current_process);
-               proc_schedule();
+               preempt_schedule();
        );
 }
 
index 49e6c43762c95e205458d5cf26b298fe244f7e54..9688e6c3f1508c4f9b0e035aff5cc4c86a64a19b 100644 (file)
 #include <cfg/compiler.h>
 
 #if CONFIG_KERN_PREEMPT
-       void preempt_init(void);
-       void proc_preempt(void);
-       int proc_needPreempt(void);
-
        INLINE void proc_decQuantum(void)
        {
                extern int _proc_quantum;
index 713c457f9c701820cf8d32a26e11d9d719b926db..c422e729c6912963f51bfcd89f75a7cee269e290 100644 (file)
@@ -139,10 +139,7 @@ void proc_init(void)
        monitor_init();
        monitor_add(current_process, "main");
 #endif
-
-#if CONFIG_KERN_PREEMPT
-       preempt_init();
-#endif
+       proc_schedInit();
 
        MOD_INIT(proc);
 }
index c78735e89d2e54aa0c8e5c47fe4bfb33de28240d..842566b9db08cc3a77488b7092c866f9eff12b2e 100644 (file)
@@ -37,7 +37,7 @@
  *
  * $WIZ$ module_name = "kernel"
  * $WIZ$ module_configuration = "bertos/cfg/cfg_proc.h"
- * $WIZ$ module_depends = "switch_ctx", "mtask"
+ * $WIZ$ module_depends = "switch_ctx", "coop", "preempt"
  * $WIZ$ module_supports = "not atmega103"
  */
 
@@ -54,6 +54,7 @@
 
 #if CONFIG_KERN_PREEMPT
        #include <cfg/debug.h> // ASSERT()
+       #include <kern/preempt.h>
 #endif
 
 #include <cpu/types.h> // cpu_stack_t
@@ -142,15 +143,44 @@ struct Process *proc_new_with_name(const char *name, void (*entry)(void), iptr_t
 void proc_exit(void);
 
 /**
- * Co-operative context switch.
- *
- * The process that calls this function will release the CPU before its cpu quantum
- * expires, the scheduler will run to select the next process that will take control
- * of the processor.
- * \note This function is available only if CONFIG_KERN is enabled
- * \sa cpu_relax(), which is the recommended method to release the cpu.
+ * Public scheduling class methods.
  */
 void proc_yield(void);
+void proc_preempt(void);
+int proc_needPreempt(void);
+
+/**
+ * Dummy function that defines unimplemented scheduler class methods.
+ */
+INLINE void __proc_noop(void)
+{
+}
+
+#if CONFIG_KERN_PREEMPT
+       /**
+        * Preemptive scheduler public methods.
+        */
+       #define preempt_yield           proc_yield
+       #define preempt_needPreempt     proc_needPreempt
+       #define preempt_preempt         proc_preempt
+       /**
+        * Preemptive scheduler: private methods.
+        */
+       #define preempt_switch          proc_switch
+       #define preempt_init            proc_schedInit
+#else
+       /**
+        * Co-operative scheduler: public methods.
+        */
+       #define coop_yield              proc_yield
+       #define proc_needPreempt        __proc_noop
+       #define proc_preempt            __proc_noop
+       /**
+        * Co-operative scheduler: private methods.
+        */
+       #define coop_switch             proc_switch
+       #define proc_schedInit          __proc_noop
+#endif
 
 void proc_rename(struct Process *proc, const char *name);
 const char *proc_name(struct Process *proc);
index f1b5aa34805503296c4954ea248cf17186fecdb1..5d106242de54a482a16f76f46b352fa626174a9f 100644 (file)
@@ -145,10 +145,15 @@ INLINE void sched_reenqueue(struct Process *proc)
 }
 #endif //CONFIG_KERN_PRI
 
-/// Schedule another process *without* adding the current one to the ready list.
-void proc_switch(void);
+/* Process trampoline */
 void proc_entry(void);
 
+/* Schedule another process *without* adding the current one to the ready list. */
+void proc_switch(void);
+
+/* Initialize a scheduler class. */
+void proc_schedInit(void);
+
 #if CONFIG_KERN_MONITOR
        /** Initialize the monitor */
        void monitor_init(void);
index 532a326c61dc9fd22999ec663a5e219ba530c066..c3beda99dea210dbb97f66f8356e03b0248dbf03 100644 (file)
@@ -28,7 +28,8 @@ at91sam7s_CSRC = \
        bertos/mware/sprintf.c \
        bertos/kern/kfile.c \
        bertos/kern/proc.c \
-       bertos/kern/mtask.c \
+       bertos/kern/coop.c \
+       bertos/kern/preempt.c \
        bertos/kern/idle.c \
        bertos/kern/proc_test.c \
        bertos/kern/monitor.c \
index 2ddbef290a3ac9329652077ca5e994cfff3c839e..d5d1871c5a34866841abc9a0d3c04afa3d04c85c 100644 (file)
@@ -29,7 +29,8 @@ at91sam7x_CSRC = \
        bertos/struct/heap.c \
        bertos/kern/kfile.c \
        bertos/kern/proc.c \
-       bertos/kern/mtask.c \
+       bertos/kern/coop.c \
+       bertos/kern/preempt.c \
        bertos/kern/idle.c \
        bertos/kern/proc_test.c \
        bertos/kern/monitor.c \
index 45ccdb365af69051d93e42bc4edc746e39c5df8d..d74afe135cdb9f4e71adb636d9172b6c9a67667e 100644 (file)
@@ -57,7 +57,8 @@ demo_CSRC = \
        bertos/mware/sprintf.c \
        bertos/struct/heap.c \
        bertos/kern/idle.c \
-       bertos/kern/mtask.c \
+       bertos/kern/coop.c \
+       bertos/kern/preempt.c \
        bertos/kern/irq.c \
        bertos/kern/proc.c \
        bertos/kern/proc_test.c \
index 93c2defd45c992a334fda7799c9c02422bdb70b5..c17fe74aa627e8be054fa291eeed0222bbb7377b 100755 (executable)
@@ -51,7 +51,7 @@ if [ $# \< 2 ] ; then
 fi
 CPU_TARGET=$1
 EXCLUDE_DIRS="$COPY_DIR $CPU_DIR $APP_DIR $OS_DIR $WIZARD_DIR $EMUL_DIR $FAT_DIR $NMEA_DIR"
-EXCLUDE_CMD="\.svn -or -name preempt.c -or -name coop.c -prune "
+EXCLUDE_CMD="\.svn -prune "
 for i in $EXCLUDE_DIRS; do 
        EXCLUDE_CMD="$EXCLUDE_CMD -o -path $i -prune ";
 done
index 367b98bb971115c00f3c280447f22c7ff7d8316a..7c6a9d8cf9946c142de5a388c425d64b4dba4f36 100755 (executable)
@@ -40,7 +40,8 @@ SRC_LIST="
        bertos/kern/proc.c
        bertos/kern/signal.c
        bertos/kern/sem.c
-       bertos/kern/mtask.c
+       bertos/kern/coop.c
+       bertos/kern/preempt.c
        bertos/mware/event.c
        bertos/mware/formatwr.c
        bertos/mware/hex.c