1.. _threads_v2:
2
3Threads
4#######
5
6.. note::
7   There is also limited support for using :ref:`nothread`.
8
9.. contents::
10    :local:
11    :depth: 2
12
13This section describes kernel services for creating, scheduling, and deleting
14independently executable threads of instructions.
15
16A :dfn:`thread` is a kernel object that is used for application processing
17that is too lengthy or too complex to be performed by an ISR.
18
19Any number of threads can be defined by an application (limited only by
20available RAM). Each thread is referenced by a :dfn:`thread id` that is assigned
21when the thread is spawned.
22
23A thread has the following key properties:
24
25* A **stack area**, which is a region of memory used for the thread's stack.
26  The **size** of the stack area can be tailored to conform to the actual needs
27  of the thread's processing. Special macros exist to create and work with
28  stack memory regions.
29
30* A **thread control block** for private kernel bookkeeping of the thread's
31  metadata. This is an instance of type :c:struct:`k_thread`.
32
33* An **entry point function**, which is invoked when the thread is started.
34  Up to 3 **argument values** can be passed to this function.
35
36* A **scheduling priority**, which instructs the kernel's scheduler how to
37  allocate CPU time to the thread. (See :ref:`scheduling_v2`.)
38
39* A set of **thread options**, which allow the thread to receive special
40  treatment by the kernel under specific circumstances.
41  (See :ref:`thread_options_v2`.)
42
43* A **start delay**, which specifies how long the kernel should wait before
44  starting the thread.
45
46* An **execution mode**, which can either be supervisor or user mode.
47  By default, threads run in supervisor mode and allow access to
48  privileged CPU instructions, the entire memory address space, and
49  peripherals. User mode threads have a reduced set of privileges.
50  This depends on the :kconfig:option:`CONFIG_USERSPACE` option. See :ref:`usermode_api`.
51
52.. _lifecycle_v2:
53
54Lifecycle
55***********
56
57.. _spawning_thread:
58
59Thread Creation
60===============
61
62A thread must be created before it can be used. The kernel initializes
63the thread control block as well as one end of the stack portion. The remainder
64of the thread's stack is typically left uninitialized.
65
66Specifying a start delay of :c:macro:`K_NO_WAIT` instructs the kernel
67to start thread execution immediately. Alternatively, the kernel can be
68instructed to delay execution of the thread by specifying a timeout
69value -- for example, to allow device hardware used by the thread
70to become available.
71
72The kernel allows a delayed start to be canceled before the thread begins
73executing. A cancellation request has no effect if the thread has already
74started. A thread whose delayed start was successfully canceled must be
75re-spawned before it can be used.
76
77Thread Termination
78===================
79
80Once a thread is started it typically executes forever. However, a thread may
81synchronously end its execution by returning from its entry point function.
82This is known as **termination**.
83
84A thread that terminates is responsible for releasing any shared resources
85it may own (such as mutexes and dynamically allocated memory)
86prior to returning, since the kernel does *not* reclaim them automatically.
87
88In some cases a thread may want to sleep until another thread terminates.
89This can be accomplished with the :c:func:`k_thread_join` API. This
90will block the calling thread until either the timeout expires, the target
91thread self-exits, or the target thread aborts (either due to a
92:c:func:`k_thread_abort` call or triggering a fatal error).
93
94Once a thread has terminated, the kernel guarantees that no use will
95be made of the thread struct.  The memory of such a struct can then be
96re-used for any purpose, including spawning a new thread.  Note that
97the thread must be fully terminated, which presents race conditions
98where a thread's own logic signals completion which is seen by another
99thread before the kernel processing is complete.  Under normal
100circumstances, application code should use :c:func:`k_thread_join` or
101:c:func:`k_thread_abort` to synchronize on thread termination state
102and not rely on signaling from within application logic.
103
104Thread Aborting
105===============
106
107A thread may asynchronously end its execution by **aborting**. The kernel
108automatically aborts a thread if the thread triggers a fatal error condition,
109such as dereferencing a null pointer.
110
111A thread can also be aborted by another thread (or by itself)
112by calling :c:func:`k_thread_abort`. However, it is typically preferable
113to signal a thread to terminate itself gracefully, rather than aborting it.
114
115As with thread termination, the kernel does not reclaim shared resources
116owned by an aborted thread.
117
118.. note::
119    The kernel does not currently make any claims regarding an application's
120    ability to respawn a thread that aborts.
121
122Thread Suspension
123==================
124
125A thread can be prevented from executing for an indefinite period of time
126if it becomes **suspended**. The function :c:func:`k_thread_suspend`
127can be used to suspend any thread, including the calling thread.
128Suspending a thread that is already suspended has no additional effect.
129
130Once suspended, a thread cannot be scheduled until another thread calls
131:c:func:`k_thread_resume` to remove the suspension.
132
133.. note::
134   A thread can prevent itself from executing for a specified period of time
135   using :c:func:`k_sleep`. However, this is different from suspending
136   a thread since a sleeping thread becomes executable automatically when the
137   time limit is reached.
138
139.. _thread_states:
140
141Thread States
142*************
143
144A thread that has no factors that prevent its execution is deemed
145to be **ready**, and is eligible to be selected as the current thread.
146
147A thread that has one or more factors that prevent its execution
148is deemed to be **unready**, and cannot be selected as the current thread.
149
150The following factors make a thread unready:
151
152* The thread has not been started.
153* The thread is waiting for a kernel object to complete an operation.
154  (For example, the thread is taking a semaphore that is unavailable.)
155* The thread is waiting for a timeout to occur.
156* The thread has been suspended.
157* The thread has terminated or aborted.
158
159  .. image:: thread_states.svg
160     :align: center
161
162.. note::
163
164  Although the diagram above may appear to suggest that both **Ready** and
165  **Running** are distinct thread states, that is not the correct
166  interpretation. **Ready** is a thread state, and **Running** is a
167  schedule state that only applies to **Ready** threads.
168
169Thread Stack objects
170********************
171
172Every thread requires its own stack buffer for the CPU to push context.
173Depending on configuration, there are several constraints that must be
174met:
175
176- There may need to be additional memory reserved for memory management
177  structures
178- If guard-based stack overflow detection is enabled, a small write-
179  protected memory management region must immediately precede the stack buffer
180  to catch overflows.
181- If userspace is enabled, a separate fixed-size privilege elevation stack must
182  be reserved to serve as a private kernel stack for handling system calls.
183- If userspace is enabled, the thread's stack buffer must be appropriately
184  sized and aligned such that a memory protection region may be programmed
185  to exactly fit.
186
187The alignment constraints can be quite restrictive, for example some MPUs
188require their regions to be of some power of two in size, and aligned to its
189own size.
190
191Because of this, portable code can't simply pass an arbitrary character buffer
192to :c:func:`k_thread_create`. Special macros exist to instantiate stacks,
193prefixed with ``K_KERNEL_STACK`` and ``K_THREAD_STACK``.
194
195Kernel-only Stacks
196==================
197
198If it is known that a thread will never run in user mode, or the stack is
199being used for special contexts like handling interrupts, it is best to
200define stacks using the ``K_KERNEL_STACK`` macros.
201
202These stacks save memory because an MPU region will never need to be
203programmed to cover the stack buffer itself, and the kernel will not need
204to reserve additional room for the privilege elevation stack, or memory
205management data structures which only pertain to user mode threads.
206
207Attempts from user mode to use stacks declared in this way will result in
208a fatal error for the caller.
209
210If ``CONFIG_USERSPACE`` is not enabled, the set of ``K_THREAD_STACK`` macros
211have an identical effect to the ``K_KERNEL_STACK`` macros.
212
213Thread stacks
214=============
215
216If it is known that a stack will need to host user threads, or if this
217cannot be determined, define the stack with ``K_THREAD_STACK`` macros.
218This may use more memory but the stack object is suitable for hosting
219user threads.
220
221If ``CONFIG_USERSPACE`` is not enabled, the set of ``K_THREAD_STACK`` macros
222have an identical effect to the ``K_KERNEL_STACK`` macros.
223
224.. _thread_priorities:
225
226Thread Priorities
227******************
228
229A thread's priority is an integer value, and can be either negative or
230non-negative.
231Numerically lower priorities takes precedence over numerically higher values.
232For example, the scheduler gives thread A of priority 4 *higher* priority
233over thread B of priority 7; likewise thread C of priority -2 has higher
234priority than both thread A and thread B.
235
236The scheduler distinguishes between two classes of threads,
237based on each thread's priority.
238
239* A :dfn:`cooperative thread` has a negative priority value.
240  Once it becomes the current thread, a cooperative thread remains
241  the current thread until it performs an action that makes it unready.
242
243* A :dfn:`preemptible thread` has a non-negative priority value.
244  Once it becomes the current thread, a preemptible thread may be supplanted
245  at any time if a cooperative thread, or a preemptible thread of higher
246  or equal priority, becomes ready.
247
248
249A thread's initial priority value can be altered up or down after the thread
250has been started. Thus it is possible for a preemptible thread to become
251a cooperative thread, and vice versa, by changing its priority.
252
253.. note::
254    The scheduler does not make heuristic decisions to re-prioritize threads.
255    Thread priorities are set and changed only at the application's request.
256
257The kernel supports a virtually unlimited number of thread priority levels.
258The configuration options :kconfig:option:`CONFIG_NUM_COOP_PRIORITIES` and
259:kconfig:option:`CONFIG_NUM_PREEMPT_PRIORITIES` specify the number of priority
260levels for each class of thread, resulting in the following usable priority
261ranges:
262
263* cooperative threads: (-:kconfig:option:`CONFIG_NUM_COOP_PRIORITIES`) to -1
264* preemptive threads: 0 to (:kconfig:option:`CONFIG_NUM_PREEMPT_PRIORITIES` - 1)
265
266.. image:: priorities.svg
267   :align: center
268
269For example, configuring 5 cooperative priorities and 10 preemptive priorities
270results in the ranges -5 to -1 and 0 to 9, respectively.
271
272.. _metairq_priorities:
273
274Meta-IRQ Priorities
275===================
276
277When enabled (see :kconfig:option:`CONFIG_NUM_METAIRQ_PRIORITIES`), there is a special
278subclass of cooperative priorities at the highest (numerically lowest)
279end of the priority space: meta-IRQ threads.  These are scheduled
280according to their normal priority, but also have the special ability
281to preempt all other threads (and other meta-IRQ threads) at lower
282priorities, even if those threads are cooperative and/or have taken a
283scheduler lock. Meta-IRQ threads are still threads, however,
284and can still be interrupted by any hardware interrupt.
285
286This behavior makes the act of unblocking a meta-IRQ thread (by any
287means, e.g. creating it, calling k_sem_give(), etc.) into the
288equivalent of a synchronous system call when done by a lower
289priority thread, or an ARM-like "pended IRQ" when done from true
290interrupt context.  The intent is that this feature will be used to
291implement interrupt "bottom half" processing and/or "tasklet" features
292in driver subsystems.  The thread, once woken, will be guaranteed to
293run before the current CPU returns into application code.
294
295Unlike similar features in other OSes, meta-IRQ threads are true
296threads and run on their own stack (which must be allocated normally),
297not the per-CPU interrupt stack. Design work to enable the use of the
298IRQ stack on supported architectures is pending.
299
300Note that because this breaks the promise made to cooperative
301threads by the Zephyr API (namely that the OS won't schedule other
302thread until the current thread deliberately blocks), it should be
303used only with great care from application code.  These are not simply
304very high priority threads and should not be used as such.
305
306.. _thread_options_v2:
307
308Thread Options
309***************
310
311The kernel supports a small set of :dfn:`thread options` that allow a thread
312to receive special treatment under specific circumstances. The set of options
313associated with a thread are specified when the thread is spawned.
314
315A thread that does not require any thread option has an option value of zero.
316A thread that requires a thread option specifies it by name, using the
317:literal:`|` character as a separator if multiple options are needed
318(i.e. combine options using the bitwise OR operator).
319
320The following thread options are supported.
321
322:c:macro:`K_ESSENTIAL`
323    This option tags the thread as an :dfn:`essential thread`. This instructs
324    the kernel to treat the termination or aborting of the thread as a fatal
325    system error.
326
327    By default, the thread is not considered to be an essential thread.
328
329:c:macro:`K_SSE_REGS`
330    This x86-specific option indicate that the thread uses the CPU's
331    SSE registers. Also see :c:macro:`K_FP_REGS`.
332
333    By default, the kernel does not attempt to save and restore the contents
334    of these registers when scheduling the thread.
335
336:c:macro:`K_FP_REGS`
337    This option indicate that the thread uses the CPU's floating point
338    registers. This instructs the kernel to take additional steps to save
339    and restore the contents of these registers when scheduling the thread.
340    (For more information see :ref:`float_v2`.)
341
342    By default, the kernel does not attempt to save and restore the contents
343    of this register when scheduling the thread.
344
345:c:macro:`K_USER`
346    If :kconfig:option:`CONFIG_USERSPACE` is enabled, this thread will be created in
347    user mode and will have reduced privileges. See :ref:`usermode_api`. Otherwise
348    this flag does nothing.
349
350:c:macro:`K_INHERIT_PERMS`
351    If :kconfig:option:`CONFIG_USERSPACE` is enabled, this thread will inherit all
352    kernel object permissions that the parent thread had, except the parent
353    thread object.  See :ref:`usermode_api`.
354
355
356.. _custom_data_v2:
357
358Thread Custom Data
359******************
360
361Every thread has a 32-bit :dfn:`custom data` area, accessible only by
362the thread itself, and may be used by the application for any purpose
363it chooses. The default custom data value for a thread is zero.
364
365.. note::
366   Custom data support is not available to ISRs because they operate
367   within a single shared kernel interrupt handling context.
368
369By default, thread custom data support is disabled. The configuration option
370:kconfig:option:`CONFIG_THREAD_CUSTOM_DATA` can be used to enable support.
371
372The :c:func:`k_thread_custom_data_set` and
373:c:func:`k_thread_custom_data_get` functions are used to write and read
374a thread's custom data, respectively. A thread can only access its own
375custom data, and not that of another thread.
376
377The following code uses the custom data feature to record the number of times
378each thread calls a specific routine.
379
380.. note::
381    Obviously, only a single routine can use this technique,
382    since it monopolizes the use of the custom data feature.
383
384.. code-block:: c
385
386    int call_tracking_routine(void)
387    {
388        uint32_t call_count;
389
390        if (k_is_in_isr()) {
391	    /* ignore any call made by an ISR */
392        } else {
393            call_count = (uint32_t)k_thread_custom_data_get();
394            call_count++;
395            k_thread_custom_data_set((void *)call_count);
396	}
397
398        /* do rest of routine's processing */
399        ...
400    }
401
402Use thread custom data to allow a routine to access thread-specific information,
403by using the custom data as a pointer to a data structure owned by the thread.
404
405Implementation
406**************
407
408Spawning a Thread
409=================
410
411A thread is spawned by defining its stack area and its thread control block,
412and then calling :c:func:`k_thread_create`.
413
414The stack area must be defined using :c:macro:`K_THREAD_STACK_DEFINE` or
415:c:macro:`K_KERNEL_STACK_DEFINE` to ensure it is properly set up in memory.
416
417The size parameter for the stack must be one of three values:
418
419- The original requested stack size passed to
420  ``K_THREAD_STACK`` or ``K_KERNEL_STACK`` family of stack instantiation
421  macros.
422- For a stack object defined with the ``K_THREAD_STACK`` family of
423  macros, the return value of :c:macro:`K_THREAD_STACK_SIZEOF()` for that'
424  object.
425- For a stack object defined with the ``K_KERNEL_STACK`` family of
426  macros, the return value of :c:macro:`K_KERNEL_STACK_SIZEOF()` for that
427  object.
428
429The thread spawning function returns its thread id, which can be used
430to reference the thread.
431
432The following code spawns a thread that starts immediately.
433
434.. code-block:: c
435
436    #define MY_STACK_SIZE 500
437    #define MY_PRIORITY 5
438
439    extern void my_entry_point(void *, void *, void *);
440
441    K_THREAD_STACK_DEFINE(my_stack_area, MY_STACK_SIZE);
442    struct k_thread my_thread_data;
443
444    k_tid_t my_tid = k_thread_create(&my_thread_data, my_stack_area,
445                                     K_THREAD_STACK_SIZEOF(my_stack_area),
446                                     my_entry_point,
447                                     NULL, NULL, NULL,
448                                     MY_PRIORITY, 0, K_NO_WAIT);
449
450Alternatively, a thread can be declared at compile time by calling
451:c:macro:`K_THREAD_DEFINE`. Observe that the macro defines
452the stack area, control block, and thread id variables automatically.
453
454The following code has the same effect as the code segment above.
455
456.. code-block:: c
457
458    #define MY_STACK_SIZE 500
459    #define MY_PRIORITY 5
460
461    extern void my_entry_point(void *, void *, void *);
462
463    K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
464                    my_entry_point, NULL, NULL, NULL,
465                    MY_PRIORITY, 0, 0);
466
467.. note::
468   The delay parameter to :c:func:`k_thread_create` is a
469   :c:type:`k_timeout_t` value, so :c:macro:`K_NO_WAIT` means to start the
470   thread immediately. The corresponding parameter to :c:macro:`K_THREAD_DEFINE`
471   is a duration in integral milliseconds, so the equivalent argument is 0.
472
473User Mode Constraints
474---------------------
475
476This section only applies if :kconfig:option:`CONFIG_USERSPACE` is enabled, and a user
477thread tries to create a new thread. The :c:func:`k_thread_create` API is
478still used, but there are additional constraints which must be met or the
479calling thread will be terminated:
480
481* The calling thread must have permissions granted on both the child thread
482  and stack parameters; both are tracked by the kernel as kernel objects.
483
484* The child thread and stack objects must be in an uninitialized state,
485  i.e. it is not currently running and the stack memory is unused.
486
487* The stack size parameter passed in must be equal to or less than the
488  bounds of the stack object when it was declared.
489
490* The :c:macro:`K_USER` option must be used, as user threads can only create
491  other user threads.
492
493* The :c:macro:`K_ESSENTIAL` option must not be used, user threads may not be
494  considered essential threads.
495
496* The priority of the child thread must be a valid priority value, and equal to
497  or lower than the parent thread.
498
499Dropping Permissions
500====================
501
502If :kconfig:option:`CONFIG_USERSPACE` is enabled, a thread running in supervisor mode
503may perform a one-way transition to user mode using the
504:c:func:`k_thread_user_mode_enter` API. This is a one-way operation which
505will reset and zero the thread's stack memory. The thread will be marked
506as non-essential.
507
508Terminating a Thread
509====================
510
511A thread terminates itself by returning from its entry point function.
512
513The following code illustrates the ways a thread can terminate.
514
515.. code-block:: c
516
517    void my_entry_point(int unused1, int unused2, int unused3)
518    {
519        while (1) {
520            ...
521	    if (<some condition>) {
522	        return; /* thread terminates from mid-entry point function */
523	    }
524	    ...
525        }
526
527        /* thread terminates at end of entry point function */
528    }
529
530If :kconfig:option:`CONFIG_USERSPACE` is enabled, aborting a thread will additionally
531mark the thread and stack objects as uninitialized so that they may be re-used.
532
533Runtime Statistics
534******************
535
536Thread runtime statistics can be gathered and retrieved if
537:kconfig:option:`CONFIG_THREAD_RUNTIME_STATS` is enabled, for example, total number of
538execution cycles of a thread.
539
540By default, the runtime statistics are gathered using the default kernel
541timer. For some architectures, SoCs or boards, there are timers with higher
542resolution available via timing functions. Using of these timers can be
543enabled via :kconfig:option:`CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS`.
544
545Here is an example:
546
547.. code-block:: c
548
549   k_thread_runtime_stats_t rt_stats_thread;
550
551   k_thread_runtime_stats_get(k_current_get(), &rt_stats_thread);
552
553   printk("Cycles: %llu\n", rt_stats_thread.execution_cycles);
554
555Suggested Uses
556**************
557
558Use threads to handle processing that cannot be handled in an ISR.
559
560Use separate threads to handle logically distinct processing operations
561that can execute in parallel.
562
563
564Configuration Options
565**********************
566
567Related configuration options:
568
569* :kconfig:option:`CONFIG_MAIN_THREAD_PRIORITY`
570* :kconfig:option:`CONFIG_MAIN_STACK_SIZE`
571* :kconfig:option:`CONFIG_IDLE_STACK_SIZE`
572* :kconfig:option:`CONFIG_THREAD_CUSTOM_DATA`
573* :kconfig:option:`CONFIG_NUM_COOP_PRIORITIES`
574* :kconfig:option:`CONFIG_NUM_PREEMPT_PRIORITIES`
575* :kconfig:option:`CONFIG_TIMESLICING`
576* :kconfig:option:`CONFIG_TIMESLICE_SIZE`
577* :kconfig:option:`CONFIG_TIMESLICE_PRIORITY`
578* :kconfig:option:`CONFIG_USERSPACE`
579
580
581
582API Reference
583**************
584
585.. doxygengroup:: thread_apis
586
587.. doxygengroup:: thread_stack_api
588