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