#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
+#include <cfg/compiler.h>
+
+#if CONFIG_KERN
#include <kern/proc.h>
#endif
* 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();
+ MEMORY_BARRIER;
+#if CONFIG_KERN
+ if (proc_preemptAllowed())
+ proc_yield();
#endif
#if CONFIG_WATCHDOG
* 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)
{