blob: 9ce4965fea6a5e225267f10f95497f0f2c6c87f8 [file] [log] [blame]
.. _nanokernel_tasks:
Task Services
#############
Concepts
********
A task is a preemptible thread of execution that implements a portion of
an application's processing. It is is normally used to perform processing that
is too lengthy or complex to be performed by a fiber or an ISR.
A nanokernel application can define only a single application task, known
as the *background task*, which executes when there is no fiber or ISR
that needs to execute. The entry point function for the background task
is :c:func:`main()`, and must be supplied by the application.
.. note::
The background task is very different from the tasks used by a microkernel
application; for more information see
:ref:`Microkernel Task Services <microkernel_tasks>`.
Task Lifecycle
==============
The kernel automatically starts the background task during system
initialization.
Once the background task is started it executes forever. If the task attempts
to terminate by returning from :c:func:`main()`, the kernel puts the task into
a permanant idling state since the background task must always be available
to execute.
Task Scheduling
===============
The nanokernel's scheduler executes the background task only when there is no
fiber or ISR that needs to execute, since fiber and ISR execution takes
precedence.
The kernel automatically takes care of saving the background task's CPU register
values when it performs a context switch to a fiber or an ISR. It restores
these values when the background task later resumes execution.
Usage
*****
Defining the Background Task
============================
The application must supply a function of the following form:
.. code-block:: c
void main(void)
{
/* background task processing */
...
/* (optional) enter permanent idling state */
return;
}
This function is used as the background task's entry point function. If a
nanokernel application does not need to perform any task-level processing
:c:func:`main()` can simply do an immediate return.
The :option:`MAIN_STACK_SIZE` configuration option specifies the size,
in bytes, of the memory region used for the background task's stack
and for other execution context information.
APIs
****
The nanokernel provides the following API for manipulating the background task.
:cpp:func:`task_sleep()`
Put the background task to sleep for a specified time period.