88 lines
2.8 KiB
ReStructuredText
88 lines
2.8 KiB
ReStructuredText
.. _system_threads_v2:
|
|
|
|
System Threads
|
|
##############
|
|
|
|
.. contents::
|
|
:local:
|
|
:depth: 2
|
|
|
|
A :dfn:`system thread` is a thread that the kernel spawns automatically
|
|
during system initialization.
|
|
|
|
The kernel spawns the following system threads:
|
|
|
|
**Main thread**
|
|
This thread performs kernel initialization, then calls the application's
|
|
:c:func:`main` function (if one is defined).
|
|
|
|
By default, the main thread uses the highest configured preemptible thread
|
|
priority (i.e. 0). If the kernel is not configured to support preemptible
|
|
threads, the main thread uses the lowest configured cooperative thread
|
|
priority (i.e. -1).
|
|
|
|
The main thread is an essential thread while it is performing kernel
|
|
initialization or executing the application's :c:func:`main` function;
|
|
this means a fatal system error is raised if the thread aborts. If
|
|
:c:func:`main` is not defined, or if it executes and then does a normal
|
|
return, the main thread terminates normally and no error is raised.
|
|
|
|
**Idle thread**
|
|
This thread executes when there is no other work for the system to do.
|
|
If possible, the idle thread activates the board's power management support
|
|
to save power; otherwise, the idle thread simply performs a "do nothing"
|
|
loop. The idle thread remains in existence as long as the system is running
|
|
and never terminates.
|
|
|
|
The idle thread always uses the lowest configured thread priority.
|
|
If this makes it a cooperative thread, the idle thread repeatedly
|
|
yields the CPU to allow the application's other threads to run when
|
|
they need to.
|
|
|
|
The idle thread is an essential thread, which means a fatal system error
|
|
is raised if the thread aborts.
|
|
|
|
Additional system threads may also be spawned, depending on the kernel
|
|
and board configuration options specified by the application. For example,
|
|
enabling the system workqueue spawns a system thread
|
|
that services the work items submitted to it. (See :ref:`workqueues_v2`.)
|
|
|
|
Implementation
|
|
**************
|
|
|
|
Writing a main() function
|
|
=========================
|
|
|
|
An application-supplied :c:func:`main` function begins executing once
|
|
kernel initialization is complete. The kernel does not pass any arguments
|
|
to the function.
|
|
|
|
The following code outlines a trivial :c:func:`main` function.
|
|
The function used by a real application can be as complex as needed.
|
|
|
|
.. code-block:: c
|
|
|
|
int main(void)
|
|
{
|
|
/* initialize a semaphore */
|
|
...
|
|
|
|
/* register an ISR that gives the semaphore */
|
|
...
|
|
|
|
/* monitor the semaphore forever */
|
|
while (1) {
|
|
/* wait for the semaphore to be given by the ISR */
|
|
...
|
|
/* do whatever processing is now needed */
|
|
...
|
|
}
|
|
}
|
|
|
|
Suggested Uses
|
|
**************
|
|
|
|
Use the main thread to perform thread-based processing in an application
|
|
that only requires a single thread, rather than defining an additional
|
|
application-specific thread.
|