doc: kernel: move cpu idling section to scheduling
Move cpu idling documentation to the scheduling section.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/doc/kernel/index.rst b/doc/kernel/index.rst
index 7bd0b67..e3fabb2 100644
--- a/doc/kernel/index.rst
+++ b/doc/kernel/index.rst
@@ -119,7 +119,6 @@
.. toctree::
:maxdepth: 1
- other/cpu_idle.rst
other/atomic.rst
other/float.rst
other/cxx_support.rst
diff --git a/doc/kernel/other/cpu_idle.rst b/doc/kernel/other/cpu_idle.rst
deleted file mode 100644
index 99ce9ad..0000000
--- a/doc/kernel/other/cpu_idle.rst
+++ /dev/null
@@ -1,141 +0,0 @@
-.. _cpu_idle:
-
-CPU Idling
-##########
-
-Although normally reserved for the idle thread, in certain special
-applications, a thread might want to make the CPU idle.
-
-.. contents::
- :local:
- :depth: 2
-
-Concepts
-********
-
-Making the CPU idle causes the kernel to pause all operations until an event,
-normally an interrupt, wakes up the CPU. In a regular system, the idle thread
-is responsible for this. However, in some constrained systems, it is possible
-that another thread takes this duty.
-
-Implementation
-**************
-
-Making the CPU idle
-===================
-
-Making the CPU idle is simple: call the k_cpu_idle() API. The CPU will stop
-executing instructions until an event occurs. Most likely, the function will
-be called within a loop. Note that in certain architectures, upon return,
-k_cpu_idle() unconditionally unmasks interrupts.
-
-.. code-block:: c
-
- static k_sem my_sem;
-
- void my_isr(void *unused)
- {
- k_sem_give(&my_sem);
- }
-
- void main(void)
- {
- k_sem_init(&my_sem, 0, 1);
-
- /* wait for semaphore from ISR, then do related work */
-
- for (;;) {
-
- /* wait for ISR to trigger work to perform */
- if (k_sem_take(&my_sem, K_NO_WAIT) == 0) {
-
- /* ... do processing */
-
- }
-
- /* put CPU to sleep to save power */
- k_cpu_idle();
- }
- }
-
-Making the CPU idle in an atomic fashion
-========================================
-
-It is possible that there is a need to do some work atomically before making
-the CPU idle. In such a case, k_cpu_atomic_idle() should be used instead.
-
-In fact, there is a race condition in the previous example: the interrupt could
-occur between the time the semaphore is taken, finding out it is not available
-and making the CPU idle again. In some systems, this can cause the CPU to idle
-until *another* interrupt occurs, which might be *never*, thus hanging the
-system completely. To prevent this, k_cpu_atomic_idle() should have been used,
-like in this example.
-
-.. code-block:: c
-
- static k_sem my_sem;
-
- void my_isr(void *unused)
- {
- k_sem_give(&my_sem);
- }
-
- void main(void)
- {
- k_sem_init(&my_sem, 0, 1);
-
- for (;;) {
-
- unsigned int key = irq_lock();
-
- /*
- * Wait for semaphore from ISR; if acquired, do related work, then
- * go to next loop iteration (the semaphore might have been given
- * again); else, make the CPU idle.
- */
-
- if (k_sem_take(&my_sem, K_NO_WAIT) == 0) {
-
- irq_unlock(key);
-
- /* ... do processing */
-
-
- } else {
- /* put CPU to sleep to save power */
- k_cpu_atomic_idle(key);
- }
- }
- }
-
-
-Suggested Uses
-**************
-
-Use k_cpu_atomic_idle() when a thread has to do some real work in addition to
-idling the CPU to wait for an event. See example above.
-
-Use k_cpu_idle() only when a thread is only responsible for idling the CPU,
-i.e. not doing any real work, like in this example below.
-
-.. code-block:: c
-
- void main(void)
- {
- /* ... do some system/application initialization */
-
-
- /* thread is only used for CPU idling from this point on */
- for (;;) {
- k_cpu_idle();
- }
- }
-
-.. note::
- **Do not use these APIs unless absolutely necessary.** In a normal system,
- the idle thread takes care of power management, including CPU idling.
-
-API Reference
-*************
-
-.. doxygengroup:: cpu_idle_apis
diff --git a/doc/kernel/scheduling/index.rst b/doc/kernel/scheduling/index.rst
index 629e9a0..d87da7e 100644
--- a/doc/kernel/scheduling/index.rst
+++ b/doc/kernel/scheduling/index.rst
@@ -254,3 +254,145 @@
Use preemptive threads to give priority to time-sensitive processing
over less time-sensitive processing.
+
+.. _cpu_idle:
+
+CPU Idling
+##########
+
+Although normally reserved for the idle thread, in certain special
+applications, a thread might want to make the CPU idle.
+
+.. contents::
+ :local:
+ :depth: 2
+
+Concepts
+********
+
+Making the CPU idle causes the kernel to pause all operations until an event,
+normally an interrupt, wakes up the CPU. In a regular system, the idle thread
+is responsible for this. However, in some constrained systems, it is possible
+that another thread takes this duty.
+
+Implementation
+**************
+
+Making the CPU idle
+===================
+
+Making the CPU idle is simple: call the k_cpu_idle() API. The CPU will stop
+executing instructions until an event occurs. Most likely, the function will
+be called within a loop. Note that in certain architectures, upon return,
+k_cpu_idle() unconditionally unmasks interrupts.
+
+.. code-block:: c
+
+ static k_sem my_sem;
+
+ void my_isr(void *unused)
+ {
+ k_sem_give(&my_sem);
+ }
+
+ void main(void)
+ {
+ k_sem_init(&my_sem, 0, 1);
+
+ /* wait for semaphore from ISR, then do related work */
+
+ for (;;) {
+
+ /* wait for ISR to trigger work to perform */
+ if (k_sem_take(&my_sem, K_NO_WAIT) == 0) {
+
+ /* ... do processing */
+
+ }
+
+ /* put CPU to sleep to save power */
+ k_cpu_idle();
+ }
+ }
+
+Making the CPU idle in an atomic fashion
+========================================
+
+It is possible that there is a need to do some work atomically before making
+the CPU idle. In such a case, k_cpu_atomic_idle() should be used instead.
+
+In fact, there is a race condition in the previous example: the interrupt could
+occur between the time the semaphore is taken, finding out it is not available
+and making the CPU idle again. In some systems, this can cause the CPU to idle
+until *another* interrupt occurs, which might be *never*, thus hanging the
+system completely. To prevent this, k_cpu_atomic_idle() should have been used,
+like in this example.
+
+.. code-block:: c
+
+ static k_sem my_sem;
+
+ void my_isr(void *unused)
+ {
+ k_sem_give(&my_sem);
+ }
+
+ void main(void)
+ {
+ k_sem_init(&my_sem, 0, 1);
+
+ for (;;) {
+
+ unsigned int key = irq_lock();
+
+ /*
+ * Wait for semaphore from ISR; if acquired, do related work, then
+ * go to next loop iteration (the semaphore might have been given
+ * again); else, make the CPU idle.
+ */
+
+ if (k_sem_take(&my_sem, K_NO_WAIT) == 0) {
+
+ irq_unlock(key);
+
+ /* ... do processing */
+
+
+ } else {
+ /* put CPU to sleep to save power */
+ k_cpu_atomic_idle(key);
+ }
+ }
+ }
+
+
+Suggested Uses
+**************
+
+Use k_cpu_atomic_idle() when a thread has to do some real work in addition to
+idling the CPU to wait for an event. See example above.
+
+Use k_cpu_idle() only when a thread is only responsible for idling the CPU,
+i.e. not doing any real work, like in this example below.
+
+.. code-block:: c
+
+ void main(void)
+ {
+ /* ... do some system/application initialization */
+
+
+ /* thread is only used for CPU idling from this point on */
+ for (;;) {
+ k_cpu_idle();
+ }
+ }
+
+.. note::
+ **Do not use these APIs unless absolutely necessary.** In a normal system,
+ the idle thread takes care of power management, including CPU idling.
+
+API Reference
+*************
+
+.. doxygengroup:: cpu_idle_apis