Merge branch "preempt" in "trunk".
[bertos.git] / bertos / cfg / os.h
index cc1ebe696989011005908e04b0c13de6ef9ca2a6..2089cc4fc1e977b69333b09ce7214a9d1339d12f 100644 (file)
  * the GNU General Public License.
  *
  * Copyright 2004, 2005 Develer S.r.l. (http://www.develer.com/)
- *
+ * Copyright 2008 Bernie Innocenti <bernie@codewiz.org>
  * -->
  *
  * \brief OS-specific definitions
  *
  * \version $Id$
- *
  * \author Bernie Innocenti <bernie@codewiz.org>
  */
 
-#ifndef DEVLIB_OS_H
-#define DEVLIB_OS_H
+#ifndef CFG_OS_H
+#define CFG_OS_H
 
-/** Macro to include OS-specific versions of the headers. */
-#define OS_HEADER(module)  PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).h)
-#define OS_CSOURCE(module) PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).c)
+#include "cfg/cfg_proc.h"
 
 /*
  * OS autodetection (Some systems trigger multiple OS definitions)
@@ -52,7 +49,7 @@
        #define OS_ID     win32
 
        // FIXME: Maybe disable Win32 exceptions?
-       typedef int cpuflags_t;
+       typedef int cpu_flags_t;
        #define IRQ_DISABLE                FIXME
        #define IRQ_ENABLE                 FIXME
        #define IRQ_SAVE_DISABLE(old_sigs) FIXME
@@ -71,7 +68,7 @@
         * The POSIX moral equivalent of disabling IRQs is disabling signals.
         */
        #include <signal.h>
-       typedef sigset_t cpuflags_t;
+       typedef sigset_t cpu_flags_t;
 
        #define SET_ALL_SIGNALS(sigs) \
        do { \
                sigismember(&sigs__, SIGALRM) ? false : true; \
         })
 
+       #if CONFIG_KERN_PREEMPT
+               #define DECLARE_ISR_CONTEXT_SWITCH(vect)        \
+                       void vect(UNUSED_ARG(int, arg));        \
+                       INLINE void __isr_##vect(void);         \
+                       void vect(UNUSED_ARG(int, arg))         \
+                       {                                       \
+                               __isr_##vect();                 \
+                               IRQ_PREEMPT_HANDLER();          \
+                       }                                       \
+                       INLINE void __isr_##vect(void)
+               /**
+                * With task priorities enabled each ISR is used a point to
+                * check if we need to perform a context switch.
+                *
+                * Instead, without priorities a context switch can occur only
+                * when the running task expires its time quantum. In this last
+                * case, the context switch can only occur in the timer ISR,
+                * that must be always declared with the
+                * DECLARE_ISR_CONTEXT_SWITCH() macro.
+                */
+               #if CONFIG_KERN_PRI
+                       #define DECLARE_ISR(vect) \
+                               DECLARE_ISR_CONTEXT_SWITCH(vect)
+               #endif /* CONFIG_KERN_PRI */
+       #endif
+       #ifndef DECLARE_ISR
+               #define DECLARE_ISR(vect) \
+                               void vect(UNUSED_ARG(int, arg))
+       #endif
+       #ifndef DECLARE_ISR_CONTEXT_SWITCH
+               #define DECLARE_ISR_CONTEXT_SWITCH(vect) \
+                               void vect(UNUSED_ARG(int, arg))
+       #endif
+
 #else
        #define OS_UNIX   0
        #define OS_POSIX  0
        #define OS_DARWIN 0
 #endif
 
+
+#include "cfg/cfg_arch.h" /* For ARCH_QT */
+
 /*
  * We want Qt and other frameworks to look like OSes because you would
  * tipically want their portable abstractions if you're using one of these.
        #error Neither hosted nor embedded OS environment
 #endif
 
-#endif /* DEVLIB_OS_H */
+#if OS_HOSTED
+
+       /// Macro to include OS-specific headers.
+       #define OS_HEADER(module)  PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).h)
+
+       /// Macro to include OS-specific source files.
+       #define OS_CSOURCE(module) PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).c)
+
+#else
+       // Fallbacks for embedded systems
+       #define OS_HEADER(module)  CPU_HEADER(module)
+       #define OS_CSOURCE(module) CPU_CSOURCE(module)
+#endif
+
+#endif /* CFG_OS_H */