| .. _module-pw_third_party_freertos: |
| |
| ======== |
| FreeRTOS |
| ======== |
| |
| The ``$dir_pw_third_party/freertos/`` module contains various helpers to use |
| FreeRTOS, including Pigweed backend modules which depend on FreeRTOS. |
| |
| ------------- |
| Build Support |
| ------------- |
| This module provides support to compile FreeRTOS with GN, CMake, and Bazel. |
| This is required when compiling backends modules for FreeRTOS. |
| |
| GN |
| == |
| In order to use this you are expected to configure the following variables from |
| ``$dir_pw_third_party/freertos:freertos.gni``: |
| |
| #. Set the GN ``dir_pw_third_party_freertos`` to the path of the FreeRTOS |
| installation. |
| #. Set ``pw_third_party_freertos_CONFIG`` to a ``pw_source_set`` which provides |
| the FreeRTOS config header. |
| #. Set ``pw_third_party_freertos_PORT`` to a ``pw_source_set`` which provides |
| the FreeRTOS port specific includes and sources. |
| |
| After this is done a ``pw_source_set`` for the FreeRTOS library is created at |
| ``$dir_pw_third_party/freertos``. |
| |
| CMake |
| ===== |
| In order to use this you are expected to set the following variables from |
| ``third_party/freertos/CMakeLists.txt``: |
| |
| #. Set ``dir_pw_third_party_freertos`` to the path of the FreeRTOS installation. |
| #. Set ``pw_third_party_freertos_CONFIG`` to a library target which provides |
| the FreeRTOS config header. |
| #. Set ``pw_third_party_freertos_PORT`` to a library target which provides |
| the FreeRTOS port specific includes and sources. |
| |
| Bazel |
| ===== |
| Pigweed provides its own BUILD.bazel file for FreeRTOS, at |
| ``third_party/freertos/freertos.BUILD.bazel``. |
| |
| The FreeRTOS build is configured through `constraint_settings |
| <https://bazel.build/reference/be/platforms-and-toolchains#constraint_setting>`_. |
| The `platform <https://bazel.build/extending/platforms>`_ you are building for |
| must specify values for the following settings: |
| |
| * ``@freertos//:port``, to set which FreeRTOS port to use. You can |
| select a value from those defined in |
| ``third_party/freertos/freertos.BUILD.bazel``. |
| * ``@freertos//:malloc``, to set which FreeRTOS malloc implementation to use. |
| You can select a value from those defined in |
| ``third_party/freertos/BUILD.bazel``. |
| * ``@freertos//:disable_task_statics_setting``, to determine whether statics |
| should be disabled during compilation of the tasks.c source file (see next |
| section). This setting has only two possible values, also defined in |
| ``third_party/freertos/BUILD.bazel``. |
| |
| In addition, you need to set the ``@freertos//:freertos_config`` label flag to |
| point to the library target providing the FreeRTOS config header. See |
| :ref:`docs-build_system-bazel_configuration` for a discussion of how to work |
| with our label flags. |
| |
| |
| .. _third_party-freertos_disable_task_statics: |
| |
| Linking against FreeRTOS kernel's static internals |
| ================================================== |
| In order to link against internal kernel data structures through the use of |
| extern "C", statics can be optionally disabled for the tasks.c source file |
| to enable use of things like pw_thread_freertos/util.h's ``ForEachThread``. |
| |
| To facilitate this, Pigweed offers an opt-in option which can be enabled, |
| |
| * in GN through ``pw_third_party_freertos_DISABLE_TASKS_STATICS = true``, |
| * in CMake through ``set(pw_third_party_freertos_DISABLE_TASKS_STATICS ON |
| CACHE BOOL "" FORCE)``, |
| * in Bazel through ``@freertos//:disable_task_statics``. |
| |
| This redefines ``static`` to nothing for the ``Source/tasks.c`` FreeRTOS source |
| file when building through ``$dir_pw_third_party/freertos`` in GN and through |
| ``pw_third_party.freertos`` in CMake. |
| |
| .. attention:: If you use this, make sure that your FreeRTOSConfig.h and port |
| does not rely on any statics inside of tasks.c. For example, you cannot use |
| ``PW_CHECK`` for ``configASSERT`` when this is enabled. |
| |
| As a helper ``PW_THIRD_PARTY_FREERTOS_NO_STATICS=1`` is defined when statics are |
| disabled to help manage conditional configuration. |
| |
| We highly recommend :ref:`our configASSERT wrapper |
| <third_party-freertos_config_assert>` when using this configuration, which |
| correctly sets ``configASSERT`` to use ``PW_CHECK`` and ``PW_ASSERT`` for you. |
| |
| ----------------------------- |
| OS Abstraction Layers Support |
| ----------------------------- |
| Support for Pigweed's :ref:`docs-os` are provided for FreeRTOS via the following |
| modules: |
| |
| * :ref:`module-pw_chrono_freertos` |
| * :ref:`module-pw_sync_freertos` |
| * :ref:`module-pw_thread_freertos` |
| |
| .. _third_party-freertos_config_assert: |
| |
| -------------------------- |
| configASSERT and pw_assert |
| -------------------------- |
| To make it easier to use :ref:`module-pw_assert` with FreeRTOS a helper header |
| is provided under ``pw_third_party/freertos/config_assert.h`` which defines |
| ``configASSERT`` for you using Pigweed's assert system for your |
| ``FreeRTOSConfig.h`` if you chose to use it. |
| |
| .. code-block:: cpp |
| |
| // Instead of defining configASSERT, simply include this header in its place. |
| #include "pw_third_party/freertos/config_assert.h" |
| |