| .. _application_porting_guide: |
| |
| Legacy Applications Porting Guide |
| ################################## |
| |
| |
| .. note:: |
| |
| This document is still work in progress. |
| |
| This guide will help you move your applications from the nanokernel/microkernel |
| model to the unified kernel. The unified kernel was introduced with |
| :ref:`zephyr_1.6` which was released late 2016. |
| |
| A list of the major changes that came with the unified kernel can be found in |
| the section :ref:`changes_v2`. |
| |
| |
| API Changes |
| *********** |
| |
| As described in the section :ref:`kernel_api_changes` the kernel now has one |
| unified and consistent API with new naming. |
| |
| An application using the old APIs can still be compiled using a legacy interface |
| that translates old APIs to the new APIs. This legacy interface maintained in |
| :file:`include/legacy.h` can be used as a guide when porting a legacy |
| application to the new kernel. |
| |
| Same Arguments |
| ============== |
| |
| In many cases, a simple search and replace is enough to move from the legacy to |
| the new APIs, for example: |
| |
| * :cpp:func:`task_abort()` -> :cpp:func:`k_thread_abort()` |
| * :cpp:func:`task_sem_count_get()` -> :cpp:func:`k_sem_count_get()` |
| |
| Additional Arguments |
| ==================== |
| The number of arguments to some APIs have changed, |
| |
| * :cpp:func:`nano_sem_init()` -> :cpp:func:`k_sem_init()` |
| |
| This function now accepts 2 additional arguments: |
| |
| - Initial semaphore count |
| - Permitted semaphore count |
| |
| When porting your application, make sure you have set the right arguments. For |
| example, calls to the old API: |
| |
| .. code-block:: c |
| |
| nano_sem_init(sem) |
| |
| depending on the usage becomes in most cases: |
| |
| .. code-block:: c |
| |
| k_sem_init(sem, 0, UINT_MAX); |
| |
| Return Codes |
| ============ |
| |
| Many kernel APIs now return 0 to indicate success and a non-zero error code |
| to indicate the reason for failure. You should pay special attention to this |
| change when checking for return codes from kernel APIs, for example: |
| |
| * :cpp:func:`k_sem_take()` now returns 0 on on success, in the legacy API |
| :cpp:func:`nano_sem_take()` returned 1 when a semaphore is available. |
| |
| |
| Application Porting |
| ******************* |
| |
| The existing :ref:`synchronization_sample` from the Zephyr tree will be used to |
| guide you with porting a legacy application to the new kernel. |
| |
| The code has been ported to the new kernel and is shown below: |
| |
| .. literalinclude:: sync_v2.c |
| :linenos: |
| :language: c |
| :lines: 9- |
| |
| Porting a Nanokernel Application |
| ================================= |
| |
| Below is the code for the application using the legacy kernel: |
| |
| .. literalinclude:: sync_v1_nano.c |
| :linenos: |
| :language: c |
| :lines: 9- |
| |
| Porting a Microkernel Application |
| ================================= |
| |
| The MDEF feature of the legacy kernel has been eliminated. Consequently, all |
| kernel objects are now defined directly in code. |
| |
| Below is the code for the application using the legacy kernel: |
| |
| .. literalinclude:: sync_v1.c |
| :linenos: |
| :language: c |
| :lines: 9- |
| |
| |
| A microkernel application defines the used objects in an MDEF file, for this |
| porting sample using the :ref:`synchronization_sample`, the file is shown below: |
| |
| .. literalinclude:: v1.mdef |
| :linenos: |
| |
| In the unified kernel the semaphore will be defined in the code as follows: |
| |
| .. literalinclude:: sync_v2.c |
| :linenos: |
| :language: c |
| :lines: 51-54 |
| |
| The threads (previously named tasks) are defined in the code as follows, for |
| thread A: |
| |
| .. literalinclude:: sync_v2.c |
| :linenos: |
| :language: c |
| :lines: 88-89 |
| |
| Thread B (taskB in the microkernel) will be spawned dynamically from thread A |
| (See :ref:`spawning_thread` section): |
| |
| .. literalinclude:: sync_v2.c |
| :linenos: |
| :language: c |
| :lines: 80-82 |