| .. _module-pw_boot: |
| |
| ======= |
| pw_boot |
| ======= |
| .. pigweed-module:: |
| :name: pw_boot |
| |
| ``pw_boot`` provides a linker script and some early initialization of static |
| memory regions and C++ constructors. This is enough to get many targets booted |
| and ready to run C++ code. |
| |
| This module is split into two components: |
| |
| 1. This module, which provides the :ref:`facade <docs-facades>`. |
| 2. A backend module such as :ref:`module-pw_boot_cortex_m` that implements the |
| facade. |
| |
| .. _module-pw_boot-status: |
| |
| --------------------- |
| Status of this module |
| --------------------- |
| ``pw_boot`` can be used in production if it meets your needs. In practice |
| most production projects probably won't use it because they need their own |
| custom linker scripts. The ``pw_boot`` source code can still be a useful |
| example of how to set up a boot sequence. |
| |
| .. _module-pw_boot-sequence: |
| |
| -------- |
| Sequence |
| -------- |
| The high-level ``pw_boot`` sequence looks like the following pseudo-code |
| invocation of the user-implemented functions: |
| |
| .. code-block:: cpp |
| |
| void pw_boot_Entry() { // Boot entry point provided by backend. |
| pw_boot_PreStaticMemoryInit(); // User-implemented function. |
| // Static memory initialization. |
| pw_boot_PreStaticConstructorInit(); // User-implemented function. |
| // C++ static constructors are invoked. |
| pw_boot_PreMainInit(); // User-implemented function. |
| main(); // User-implemented function. |
| pw_boot_PostMain(); // User-implemented function. |
| PW_UNREACHABLE; |
| } |
| |
| .. _module-pw_boot-user: |
| |
| -------------------------- |
| User-implemented functions |
| -------------------------- |
| This module expects all of the following ``extern "C"`` functions to be defined |
| outside this module. If any of these functions are unimplemented, executables |
| will encounter a link error. |
| |
| .. _module-pw_boot-prestaticmemoryinit: |
| |
| ``pw_boot_PreStaticMemoryInit()`` |
| --------------------------------- |
| Signature: ``void pw_boot_PreStaticMemoryInit()`` |
| |
| This function executes just before static memory has been zeroed and static |
| data is initialized. This function should set up any early initialization that |
| should be done before static memory is initialized, such as: |
| |
| - Enabling the FPU or other coprocessors. |
| - Opting into extra restrictions such as disabling unaligned access to ensure |
| the restrictions are active during static RAM initialization. |
| - Initial CPU clock, flash, and memory configurations including potentially |
| enabling extra memory regions with ``.bss`` and ``.data`` sections, such as |
| SDRAM or backup powered SRAM. |
| - Fault handler initialization if required before static memory |
| initialization. |
| |
| .. warning:: |
| |
| Code running in this hook is violating the C spec as static values are not |
| yet initialized, meaning they have not been loaded (``.data``) nor |
| zero-initialized (``.bss``). |
| |
| .. _module-pw_boot-prestaticconstructorinit: |
| |
| ``pw_boot_PreStaticConstructorInit()`` |
| -------------------------------------- |
| Signature: ``void pw_boot_PreStaticConstructorInit()`` |
| |
| This function executes just before C++ static constructors are called. At this |
| point, other static memory has been zero-initialized or data-initialized. This |
| function should set up any early initialization that should be done before C++ |
| static constructors are run, such as: |
| |
| - Run time dependencies such as ``malloc``, and ergo sometimes the RTOS. |
| - Persistent memory that survives warm reboots. |
| - Enabling the MPU to catch ``nullptr`` dereferences during construction. |
| - Main stack watermarking. |
| - Further fault handling configuration necessary for your platform which |
| was not safe before ``pw_boot_PreStaticRamInit()``. |
| - Boot count and/or boot session UUID management. |
| |
| .. _module-pw_boot-premaininit: |
| |
| ``pw_boot_PreMainInit()`` |
| ------------------------- |
| Signature: ``void pw_boot_PreMainInit()`` |
| |
| This function executes just before ``main()``, and can be used for any device |
| initialization that isn't application-specific. Depending on your platform, |
| this might be turning on a UART, setting up default clocks, etc. |
| |
| .. _module-pw_boot-main: |
| |
| ``main()`` |
| ---------- |
| Signature: ``int main()`` |
| |
| This is where applications reside. |
| |
| .. _module-pw_boot-postmain: |
| |
| ``pw_boot_PostMain()`` |
| ---------------------- |
| Signature: ``PW_NO_RETURN void pw_boot_PostMain()`` |
| |
| This function executes after ``main()`` has returned. This could be used for |
| device-specific teardown such as an infinite loop, soft reset, or QEMU |
| shutdown. In addition, if relevant for your application, this would be the |
| place to invoke the global static destructors. This function must not return! |
| |
| .. _module-pw_boot-backend: |
| |
| ----------------------------- |
| Backend-implemented functions |
| ----------------------------- |
| ``pw_boot`` :ref:`backends <docs-facades-definition>` must implement the |
| following ``extern "C"`` functions. |
| |
| .. _module-pw_boot-entry: |
| |
| ``pw_boot_Entry()`` |
| ------------------- |
| Signature: ``void pw_boot_Entry()`` |
| |
| This function executes as the entry point for the application, and must |
| call the :ref:`module-pw_boot-user` in the correct |
| :ref:`module-pw_boot-sequence`. |
| |
| .. _module-pw_boot-dependencies: |
| |
| ------------ |
| Dependencies |
| ------------ |
| - :bdg-ref-primary-line:`module-pw_preprocessor` |
| |
| .. toctree:: |
| :hidden: |
| :maxdepth: 1 |
| |
| Backends <backends> |