Merge branch "preempt" in "trunk".
[bertos.git] / bertos / cpu / power.h
index 04c06076d75330da1c9e47f0c15189e654ef0401..d73eb621a785ef17629ff03e25748820983d476f 100644 (file)
 #ifndef CPU_POWER_H
 #define CPU_POWER_H
 
-#include <cfg/cfg_kern.h>
-#include <cfg/cfg_wdt.h>
+#include "cfg/cfg_proc.h"
+#include "cfg/cfg_wdt.h"
 
-#if CONFIG_KERNEL
+#if CONFIG_KERN
        #include <kern/proc.h>
 #endif
 
@@ -52,7 +52,7 @@
  * Let the CPU rest in tight busy loops
  *
  * User code that sits in a busy loop should call cpu_relax() every
- * once in a while to perform system-depndent idle processing.
+ * once in a while to perform system-dependent idle processing.
  *
  * Depending on the system configuration, this might perform different
  * actions:
  *  - reset the watchdog timer to avoid it from triggering
  *  - scale the CPU speed down to save power (unimplemented)
  *  - let the event loop of the emulator process a few events
+ *
+ * \see proc_yield() cpu_pause()
  */
 INLINE void cpu_relax(void)
 {
-#if CONFIG_KERNEL
-       proc_yield();
+#if CONFIG_KERN
+       if (proc_preemptAllowed())
+               proc_yield();
 #endif
 
 #if CONFIG_WATCHDOG
@@ -90,10 +93,12 @@ INLINE void cpu_relax(void)
  *     IRQ_ENABLE();
  * \endcode
  *
- * \note Some implementations of cpu_pause() may return before any interrupt has occurred
- *       Caller code should be written taking this into account.
+ * \note Some implementations of cpu_pause() may return before any interrupt
+ *       has occurred.  Calling code should take this possibility into account.
  *
  * \note This function is currently unimplemented
+ *
+ * \see cpu_relax() cpu_yield()
  */
 INLINE void cpu_pause(void)
 {