Tasks and Priority Management
=============================

**Target Platform: Arduino M0 Pro** (or legacy Arduino Zero or Zero Pro,
but not Arduino M0)

This lesson is designed to teach core OS concepts and strategies
encountered when building applications using Mynewt. Specifically, this
lesson will cover tasks, simple multitasking, and priority management
running on an Arduino M0 Pro.

.. contents::
   :local:
   :depth: 2

Prerequisites
-------------

Before starting, you should read about Mynewt in the
:doc:`Introduction <../../index>` section and
complete the
:doc:`QuickStart <../../get_started/index>`
guide and the
:doc:`Blinky <../blinky/arduino_zero>`
tutorial. Furthermore, it may be helpful to take a peek at the :doc:`task
documentation <../../../os/core_os/task/task>` for
additional insights.

Equipment
---------

You will need the following equipment:

-  Arduino M0 Pro (or legacy Arduino Zero or Zero Pro, but not Arduino
   M0)
-  Computer with Mynewt installed
-  USB to Micro USB Cable

Build Your Application
----------------------

To save time, we will simply modify the Blinky application. We’ll add
the Task Management code to the Blinky application. Follow the :doc:`Arduino
Zero Blinky
tutorial <../blinky/arduino_zero>` to
create a new project and build your bootloader and application. Finally,
build and load the application to your Arduino to verify that everything
is in order. Now let’s get started!

Default Main Task
-----------------

During Mynewt system startup, Mynewt creates a default main task and
executes the application ``main()`` function in the context of this
task. The main task priority defaults to 127 and can be configured with
the ``OS_MAIN_TASK_PRIO`` system configuration setting.

The blinky application only has the ``main`` task. The ``main()``
function executes an infinite loop that toggles the led and sleeps for
one second. 

Create a New Task
-----------------

The purpose of this section is to give an introduction to the important
aspects of tasks and how to properly initialize them. First, let’s
define a second task called ``work_task`` in main.c (located in
apps/blinky/src):

.. code-block:: c

   struct os_task work_task;

A task is represented by the
:doc:`os_task <../../../core_os/task/task>`
struct which will hold the task’s information (name, state, priority,
etc.). A task is made up of two main elements, a task function (also
known as a task handler) and a task stack.

Next, let’s take a look at what is required to initialize our new task.

Task Stack
~~~~~~~~~~

The task stack is an array of type ``os_stack_t`` which holds the
program stack frames. Mynewt gives us the ability to set the stack size
for a task giving the application developer room to optimize memory
usage. Since we’re not short on memory, our ``work_stack`` is plenty
large for the purpose of this lesson. Notice that the elements in our
task stack are of type ``os_stack_t`` which are generally 32 bits,
making our entire stack 1024 Bytes.

.. code-block:: c

     #define WORK_STACK_SIZE OS_STACK_ALIGN(256)

Note: The ``OS_STACK_ALIGN`` macro is used to align the stack based on
the hardware architecture.

Task Function
~~~~~~~~~~~~~

A task function is essentially an infinite loop that waits for some
“event” to wake it up. In general, the task function is where the
majority of work is done by a task. Let’s write a task function for
``work_task`` called ``work_task_handler()``:

.. code-block:: c

   void
   work_task_handler(void *arg)
   {
       struct os_task *t;

       g_led_pin = LED_BLINK_PIN;
       hal_gpio_init_out(g_led_pin, 1);
       
       while (1) {
           t = os_sched_get_current_task();
           assert(t->t_func == work_task_handler);
           /* Do work... */
       }
   }

The task function is called when the task is initially put into the
*running* state by the scheduler. We use an infinite loop to ensure that
the task function never returns. Our assertion that the current task’s
handler is the same as our task handler is for illustration purposes
only and does not need to be in most task functions.

Task Priority
~~~~~~~~~~~~~

As a preemptive, multitasking RTOS, Mynewt decides which tasks to run
based on which has a higher priority; the highest priority being 0 and
the lowest 255. Thus, before initializing our task, we must choose a
priority defined as a macro variable.

Let’s set the priority of ``work_task`` to 0, because everyone knows
that work is more important than blinking.

.. code-block:: c

     #define WORK_TASK_PRIO (0)

Initialization
~~~~~~~~~~~~~~

To initialize a new task we use ``os_task_init()``
which takes a number of arguments including our new task function,
stack, and priority.

Add the ``init_tasks()`` function to initialize ``work_task`` to keep
our main function clean.

.. code-block:: c

   int
   init_tasks(void)
   {
       /* … */
       os_stack_t *work_stack;
       work_stack = malloc(sizeof(os_stack_t)*WORK_STACK_SIZE);
       
       assert(work_stack);
       os_task_init(&work_task, "work", work_task_handler, NULL,
               WORK_TASK_PRIO, OS_WAIT_FOREVER, work_stack,
               WORK_STACK_SIZE);

       return 0;
   }

Add the call to ``init_tasks()`` in ``main()`` before the ``while``
loop:

.. code-block:: c


   int
   main(int argc, char **argv)
   {

           ...

       /* Initialize the work task */
       init_tasks();

       while (1) {
            ...
       }
   }

And that’s it! Now run your application using the newt run command.

.. code-block:: console

   $ newt run arduino_blinky 0.0.0

When GDB appears press C then Enter to continue and … *wait, why
doesn’t our LED blink anymore?*

Review
^^^^^^

Before we run our new app, let’s review what we need in
order to create a task. This is a general case for a new task called
mytask:

**1)** Define a new task, task stack, and priority:

.. code-block:: c

   /* My Task */
   struct os_task mytask
   /* My Task Stack */
   #define MYTASK_STACK_SIZE OS_STACK_ALIGN(256)
   os_stack_t mytask_stack[MYTASK_STACK_SIZE];
   /* My Task Priority */
   #define MYTASK_PRIO (0)

**2)** Define task function:

.. code-block:: c

   void 
   mytask_handler(void *arg)
   {
     while (1) {
         /* ... */
     }
   }

**3)** Initialize the task:

.. code-block:: c

   os_task_init(&mytask, "mytask", mytask_handler, NULL, 
               MYTASK_PRIO, OS_WAIT_FOREVER, mytask_stack,
               MYTASK_STACK_SIZE);

Task Priority, Preempting, and Context Switching
------------------------------------------------

A preemptive RTOS is one in which a higher priority task that is *ready
to run* will preempt (i.e. take the place of) the lower priority task
which is *running*. When a lower priority task is preempted by a higher
priority task, the lower priority task’s context data (stack pointer,
registers, etc.) is saved and the new task is switched in.

In our example, ``work_task`` (priority 0) has a higher priority than
the ``main`` task (priority 127). Since ``work_task`` is never put into
a *sleep* state, it holds the processor focus on its context.

Let’s give ``work_task`` a delay and some simulated work to keep it
busy. The delay is measured in os ticks and the actual number of ticks
per second is dependent on the board. We multiply ``OS_TICKS_PER_SEC``,
which is defined in the MCU, by the number of seconds we wish to delay.

.. code-block:: c

   void
   work_task_handler(void *arg)
   {
       struct os_task *t;

       g_led_pin = LED_BLINK_PIN;
       hal_gpio_init_out(g_led_pin, 1);

       while (1) {
           t = os_sched_get_current_t:ask();
           assert(t->t_func == work_task_handler);
           /* Do work... */
           int i;
           for(i = 0; i < 1000000; ++i) {
               /* Simulate doing a noticeable amount of work */
               hal_gpio_write(g_led_pin, 1);
           }
           os_time_delay(3 * OS_TICKS_PER_SEC);
       }
   }

In order to notice the LED changing, modify the time delay in
``main()`` to blink at a higher frequency.

.. code-block:: c

   os_time_delay(OS_TICKS_PER_SEC/10);

Before we run the app, let’s predict the behavior. With the newest
additions to ``work_task_handler()``, our first action will be to sleep
for three seconds. This allows the ``main`` task, running ``main()``, to
take over the CPU and blink to its heart’s content. After three seconds,
``work_task`` will wake up and be made *ready to run*. This causes it to
preempt the ``main`` task. The LED will then remain lit for a short
period while ``work_task`` loops, then blink again for another three
seconds while ``work_task`` sleeps.

You should see that our prediction was correct!

Priority Management Considerations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When projects grow in scope, from blinking LEDs into more sophisticated
applications, the number of tasks needed increases alongside complexity.
It remains important, then, that each of our tasks is capable of doing
its work within a reasonable amount of time.

Some tasks, such as the Shell task, execute quickly and require almost
instantaneous response. Therefore, the Shell task should be given a high
priority. On the other hand, tasks which may be communicating over a
network, or processing data, should be given a low priority in order to
not hog the CPU.

The diagram below shows the different scheduling patterns we would
expect when we set the ``work_task`` priority higher and lower than the
``main`` task priority.

.. figure:: ../pics/task_lesson.png
   :alt: Task Scheduling

   Task Scheduling

In the second case where the ``main`` task has a higher priority,
``work_task`` runs and executes “work” when the ``main`` task sleeps,
saving us idle time compared to the first case.

**Note:** Defining the same priority for two tasks fires an assert in
``os_task_init()`` and must be avoided. Priority 127 is reserved for main
task, 255 for idle task.
