<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.memfault.com/embed/mcu</id>
    <title>Memfault Docs Blog</title>
    <updated>2023-06-29T19:45:26.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.memfault.com/embed/mcu"/>
    <subtitle>Memfault Docs Blog</subtitle>
    <icon>https://docs.memfault.com/img/memfault-favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[Espressif ESP32 ESP-IDF Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/espressif-esp32-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide"/>
        <updated>2023-06-29T19:45:26.000Z</updated>
        <content type="html"><![CDATA[<p>This tutorial will go over integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
a system that is using Espressif's
<a href="https://docs.espressif.com/projects/esp-idf" target="_blank" rel="noopener noreferrer" class="">ESP-IDF</a> for an ESP32 chip. It
assumes you already have a working project/toolchain for the ESP32. If you do
not, the
<a href="https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html" target="_blank" rel="noopener noreferrer" class="">official getting started guide</a>
is a great resource!</p>
<p>This integration is tested on the
<a href="https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32/esp-wrover-kit/user_guide.html" target="_blank" rel="noopener noreferrer" class="">ESP32-WROVER-KIT V4.1</a>
and several other variants (including ESP32-S3, ESP32-C3, and ESP32-C6 variants,
among others), but applies similarly to any ESP32-based board.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>An example project demonstrating the result of this integration can be found
here, for reference:</p><p><a href="https://github.com/memfault/esp32-standalone-example" target="_blank" rel="noopener noreferrer" class="">https://github.com/memfault/esp32-standalone-example</a></p><p>Memfault also maintains a full demonstration project in the Memfault Firmware
SDK, under
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/examples/esp32/README.md" target="_blank" rel="noopener noreferrer" class=""><code>examples/esp32</code></a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-esp-idf-versions">Supported ESP-IDF Versions<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#supported-esp-idf-versions" class="hash-link" aria-label="Direct link to Supported ESP-IDF Versions" title="Direct link to Supported ESP-IDF Versions" translate="no">​</a></h2>
<p>Memfault targets supporting new ESP-IDF releases as they arrive. If a version is
not included below, please <a href="https://mflt.io/contact-support" target="_blank">contact us</a> and we'll let you know the status!</p>
<ul>
<li class="">✅ &gt;= <strong>v4.4.0</strong>, &lt;= <strong>v6.0</strong> tested and supported</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-checklist">Integration Checklist<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#integration-checklist" class="hash-link" aria-label="Direct link to Integration Checklist" title="Direct link to Integration Checklist" translate="no">​</a></h2>
<p>Follow these steps to integrate the Memfault Firmware SDK into an ESP-IDF
project:</p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#clone-memfault-sdk" class="">1. Add the Memfault SDK</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#enable-coredump-collection-in-sdkconfig" class="">2. Enable Coredump Collection in <code>sdkconfig</code></a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#create-a-coredump-flash-partition" class="">3. Create a Coredump Flash Partition</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#implement-memfault_platform_get_device_info" class="">4. (Optional) Implement <code>memfault_platform_get_device_info()</code></a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#initializing-memfault" class="">5. Initializing Memfault</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#configure-memfault-project-key" class="">6. Configure Memfault Project Key</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#regenerate-sdkconfig-and-recompile" class="">7. Regenerate <code>sdkconfig</code> and recompile</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="detailed-walkthrough">Detailed Walkthrough<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#detailed-walkthrough" class="hash-link" aria-label="Direct link to Detailed Walkthrough" title="Direct link to Detailed Walkthrough" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="clone-memfault-sdk">1. Add the Memfault SDK<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#clone-memfault-sdk" class="hash-link" aria-label="Direct link to 1. Add the Memfault SDK" title="Direct link to 1. Add the Memfault SDK" translate="no">​</a></h3>
<p>Add the
<a href="https://components.espressif.com/components/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault ESP Component</a>
to your project using the IDF Component Manager:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py add-dependency "memfault/memfault-firmware-sdk^1.12.0"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-coredump-collection-in-sdkconfig">2. Enable Coredump Collection in <code>sdkconfig</code><a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#enable-coredump-collection-in-sdkconfig" class="hash-link" aria-label="Direct link to enable-coredump-collection-in-sdkconfig" title="Direct link to enable-coredump-collection-in-sdkconfig" translate="no">​</a></h3>
<p>By default, the esp-idf uses the <code>CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y</code>. You
will need to update <code>sdkconfig</code> (either via <code>idf.py menuconfig</code> or manually) to
<code>CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y</code>. The change you will see in the
<code>sdkconfig</code> file will look something like:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">diff --git a/sdkconfig b/sdkconfig</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">index a49446d..83a81a8 100644</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">--- a/sdkconfig</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+++ b/sdkconfig</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">@@ -274,7 +274,7 @@ CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> CONFIG_TRACEMEM_RESERVE_DRAM=0x0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">-CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y</span><br></span></code></pre></div></div>
<p>This can also be done in <code>sdkconfig.defaults</code> if your project does not version
control the <code>sdkconfig</code> file (will require a <code>fullclean</code> build to take effect).</p>
<p>Note: The remainder of the <code>COREDUMP</code> settings, including
<code>CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF</code>, do not affect the Memfault coredump. They
are specific to the ESP-IDF coredump features.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-coredump-flash-partition">3. Create a Coredump Flash Partition<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#create-a-coredump-flash-partition" class="hash-link" aria-label="Direct link to 3. Create a Coredump Flash Partition" title="Direct link to 3. Create a Coredump Flash Partition" translate="no">​</a></h3>
<p>You will need to allocate an internal flash partition to store panic data. Edit
your <code>partitions.csv</code> file to add a <em>coredump</em> partition. If you do not have a
<code>partitions.csv</code> file you can create one from the template below and place it in
your top-level project directory where the <code>sdkconfig</code> file is located.
Depending on your chip's Flash size you may need to modify the <em>storage</em>
partition size in order to fit the <em>coredump</em> partition. Check the Flash chip
size in <code>menuconfig</code>, see <code>(Top) → Serial flasher config</code> and check the "Flash
Size" entry. Be sure to specify a custom partition file in the sdkconfig (see
note below).</p>
<p>Depending on what data is included in the coredump, the size of the coredump
partition might also need to be increased to a larger size, like 512K. The
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/components/include/memfault/panics/coredump.h" target="_blank" rel="noopener noreferrer" class=""><code>memfault_coredump_storage_compute_size_required()</code></a>
function in the Memfault SDK can be used to compute the maximum coredump size,
which can vary depending on user configuration.</p>
<p>Note that the default Memfault coredump regions are defined by the
<code>memfault_platform_coredump_get_regions()</code> function in the Memfault SDK's
ESP-IDF port:
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/esp_idf/memfault/common/memfault_platform_coredump.c" target="_blank" rel="noopener noreferrer" class=""><code>ports/esp_idf/memfault/common/memfault_platform_coredump.c</code></a>,
but can be adjusted to suit the user's needs, either via Kconfig options or by
implementing a separate <code>memfault_platform_coredump_get_regions()</code> to override
the built-in weakly defined one.</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Name,   Type, SubType, Offset,  Size,  Flags</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">nvs,      data, nvs,     0x9000,  0x6000,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">phy_init, data, phy,     0xf000,  0x1000,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">factory,  app,  factory, 0x10000, 1M,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">storage,  data, fat,     ,        1M,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">coredump, data, coredump,,        256K,</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The coredump flash partition size <strong>must</strong> be aligned to 4096 bytes (4KB).</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Be sure to indicate the actual name you chose for the partition file in the
<code>sdkconfig</code> file. This can be done easily by running <code>idf.py menuconfig</code>,
selecting <code>(Top) → Partition Table</code>, and setting the name of the "Custom
partition CSV file". Optionally, you can edit the sdkconfig file directly
(search for the variables prefixed with <code>CONFIG_PARTITION_TABLE_</code>):</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_PARTITION_TABLE_CUSTOM=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partition-table.csv"</span><br></span></code></pre></div></div></div></div>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-memfault_platform_get_device_info">4. (Optional) Implement <code>memfault_platform_get_device_info()</code><a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#implement-memfault_platform_get_device_info" class="hash-link" aria-label="Direct link to implement-memfault_platform_get_device_info" title="Direct link to implement-memfault_platform_get_device_info" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Memfault SDK 1.4.0+</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Memfault SDK &lt;1.4.0</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>As of <strong>Memfault Firmware SDK 1.4.0</strong>, the SDK provides a default implementation
of the <code>memfault_platform_get_device_info()</code> dependency function. This populates
the Memfault Device Info data with MAC address and some default version values.</p><p>This default implementation can be overridden using the Kconfig flag
<code>CONFIG_MEMFAULT_DEFAULT_GET_DEVICE_INFO=n</code>.</p><p>The port implementation <code>memfault_esp_port_get_device_info()</code> can also be used
in a custom implementation of <code>memfault_platform_get_device_info()</code> to override
the default values, if it's useful to do so.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>When a panic occurs, information is collected to uniquely identify the device
and version of software running. Add an implementation of the function
<code>memfault_platform_get_device_info()</code> to your project (either to an existing c
file, or a new one that's included in the project CMakeLists.txt). The
<code>memfault_platform_get_device_info()</code> function sets the fields shown in the
returned <code>sMemfaultDeviceInfo</code> struct:</p><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This needs to be safe to call from the exception handler so if you are reading
data from subsystems which uses locking, e.g. <code>esp_efuse_*</code>, you will need to
pre-populate the data on bootup, for example with a
<code>memfault_platform_get_device_info_boot()</code> function, called prior to
<code>memfault_boot()</code> on system startup</p></div></div><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/core/platform/device_info.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_device_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// !FIXME: Populate with platform device information</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// *NOTE* All fields must be populated, and the values assigned to the fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// must have static lifetime: the data is accessed when this function returns.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// In this example, the fields are string literals, which are placed either</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// inline into .text data tables, or in .rodata, and the pointers are valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// for the lifetime of the program</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// See https://mflt.io/version-nomenclature for more context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device serial to a unique value.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It is typically set to a unique identifier like a serial number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// or MAC address.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to de-deduplicate data in Memfault cloud</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">device_serial </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"DEMOSERIAL"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It can be simply "app" for a single-chip device, otherwise it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// should match the component name, eg "ble", "sensor" etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_type </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"app-main"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software version.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// If using Memfault OTA, this should exactly match the OTA Release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Version name for the installed image</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"1.0.0-dev"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device hardware revision.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter/group devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">hardware_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"evt"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div><p>For ESP32 devices, the base MAC address is an option for generating device
serial numbers for test purposes. It is accessible from the <code>esp_read_mac()</code>
function included from <code>esp_mac.h</code>. Do not use the other MAC address loading
functions until <code>esp_read_mac</code> has been called at least once, as they only
return the in memory copy of the MAC address while <code>esp_read_mac</code> properly
fetches it from flash if it has not been loaded yet.</p><p>See an example implementation in the Memfault SDK
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/1.3.5/ports/esp_idf/memfault/common/memfault_platform_device_info.c#L37" target="_blank" rel="noopener noreferrer" class="">esp32 example</a>,
which can be copied into your project as a starting point.</p><p>Note: there is a non-zero chance of overlapping addresses from Espressif, so it
is not recommended for large production fleets of devices. As many as 20
duplicates in a set of 4000 chips have been reported in ESP-IDF user forums.</p></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-memfault">5. Initializing Memfault<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#initializing-memfault" class="hash-link" aria-label="Direct link to 5. Initializing Memfault" title="Direct link to 5. Initializing Memfault" translate="no">​</a></h3>
<p>You will need to initialize the SDK from your application. This can be done
simply by adding a call to <code>memfault_boot()</code> from your <code>main_app()</code> during
system boot. We recommend doing this as early as possible in your initialization
process, so Memfault components can begin capturing data. Be sure to first
initialize any dependencies used by <code>memfault_platform_get_device_info()</code> as
this is called within <code>memfault_boot</code>.</p>
<p>Here's a code example:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/esp_port/core.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">app_main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Remainder of your main task</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-memfault-project-key">6. Configure Memfault Project Key<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#configure-memfault-project-key" class="hash-link" aria-label="Direct link to 6. Configure Memfault Project Key" title="Direct link to 6. Configure Memfault Project Key" translate="no">​</a></h3>
<p>The Project Key is set via a Kconfig variable, <code>MEMFAULT_PROJECT_KEY</code>.</p>
<p>In ESP-IDF this can be set in a few different places:</p>
<ul>
<li class="">
<p>add a line to <code>sdkconfig.defaults</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_PROJECT_KEY="your-project-key"</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>set it in <code>sdkconfig</code>, either via <code>idf.py menuconfig</code> or by directly editing
the file</p>
</li>
<li class="">
<p>set it into an extra sdkconfig file, for example
<code>sdkconfig.memfault_project_key</code>, and include the file when building:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py build -DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.memfault_project_key"</span><br></span></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="regenerate-sdkconfig-and-recompile">7. Regenerate <code>sdkconfig</code> and recompile<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#regenerate-sdkconfig-and-recompile" class="hash-link" aria-label="Direct link to regenerate-sdkconfig-and-recompile" title="Direct link to regenerate-sdkconfig-and-recompile" translate="no">​</a></h3>
<p>Assuming that your project has already been built before adding Memfault you
will need to rebuild now that the Memfault SDK has been integrated into your
ESP-IDF project.</p>
<p><em>Note that below we recommend doing a <code>fullclean</code> build. This is not strictly
required, but can help pick up all the cmake changes. See
<a href="https://docs.espressif.com/projects/esp-idf/en/v5.3.1/esp32/api-guides/tools/idf-py.html#delete-the-entire-build-contents-fullclean" target="_blank" rel="noopener noreferrer" class="">the ESP-IDF documentation</a>
for details</em></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py fullclean</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py menuconfig  # Verify your settings if necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py build</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-things-out">Testing things out<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#testing-things-out" class="hash-link" aria-label="Direct link to Testing things out" title="Direct link to Testing things out" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">With UART console</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">No UART console</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>If you built a project with a UART console the Memfault ESP-IDF port registers
some extra CLI commands so you can easily try things out! Flash and connect to
the esp32 dev board's UART console.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">idf.py flash monitor</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You may need to select a specific serial port, see <code>idf.py --help</code> for details.</p></div></div><p>As a first step you can try collecting and sending a coredump with the following
commands:</p><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># force a crash</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">esp32&gt; crash 3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># wait for reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># join network</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">esp32&gt; join &lt;SSID&gt; &lt;PASSWORD&gt;</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Post data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">esp32&gt; post_chunks</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>If you built a project without a UART console you can test a coredump by
inserting an assert that will fail, e.g.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token comment" style="color:#999999">// [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div></div></div></div>
<!-- -->Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-data-uploaded-to-memfault">Testing Data Uploaded to Memfault<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#testing-data-uploaded-to-memfault" class="hash-link" aria-label="Direct link to Testing Data Uploaded to Memfault" title="Direct link to Testing Data Uploaded to Memfault" translate="no">​</a></h2>
<p>Now it's time to see data decoded in the Memfault platform. To do that, we first
need to upload the generated symbol file (for ESP-IDF projects, it's usually
<code>build/&lt;your project name&gt;.elf</code>), then trigger some test data collection on
device, and then upload the data to Memfault for analysis.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h3>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-data-to-the-memfault-cloud">Sending Data to the Memfault Cloud<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#sending-data-to-the-memfault-cloud" class="hash-link" aria-label="Direct link to Sending Data to the Memfault Cloud" title="Direct link to Sending Data to the Memfault Cloud" translate="no">​</a></h3>
<p>At this point, the Memfault SDK is able to recognize crashes, track reboots, and
store metrics. Most of this information is stored in RAM, except for coredumps
which we keep in flash. To send that information to the cloud we need to call
the <code>memfault_esp_port_http_client_post_data()</code> function.</p>
<p>We recommend running it at a periodic interval. If there is no new data to send,
the call reduces to a no-op. The same function can also be invoked via the
Memfault CLI with the
<a class="" href="https://docs.memfault.com/docs/mcu/demo-cli-cmds-esp-idf#post_chunks"><code>post_chunks</code></a> command.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> rv </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_esp_port_http_client_post_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">rv </span><span class="token operator" style="color:#d7deea">!=</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Unable to post Memfault data, error %d"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> rv</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>The Memfault SDK implements an optional uploader task that will call this post
function at a custom interval (1 hour by default). To leverage this utility, set
the following configs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Enable automatic periodic posting of Memfault data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Set the desired upload interval. 3600 (1 hour) is the default</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_INTERVAL_SECS=&lt;interval&gt;</span><br></span></code></pre></div></div>
<p>See additional Kconfig settings for configuring the upload task
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/989d8ba3032a85b680f3e1330a2409323296e87e/ports/esp_idf/memfault/Kconfig#L374-L433" target="_blank" rel="noopener noreferrer" class="">in the Kconfig reference</a>!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>If you encounter any issues in your data transfer implementation, Memfault has tools to help debug!</p><ul><li>To troubleshoot data not getting uploaded or processed correctly by the Memfault cloud, take a look at the<!-- --> <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/integration-hub/processing-log"> <!-- -->Integration Hub → Processing Log<!-- --> </a> <!-- -->view. This provides a filterable, chronological view of recent errors that have occurred while processing received data. See<!-- --> <a href="https://docs.memfault.com/docs/platform/integration-hub">this documentation page</a> <!-- -->for more information on the Integration Hub.</li><li>A view you can use to<a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint#troubleshooting">view the raw "Chunk" data payloads</a>that have arrived for your project.</li><li><a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint">Precanned Data Payloads</a> <!-- -->you can pass through your `user_transport_send_chunk_data()` implementation to test data transfer in isolation.</li><li>Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</li></ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="esp-idf-metrics">ESP-IDF Metrics<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#esp-idf-metrics" class="hash-link" aria-label="Direct link to ESP-IDF Metrics" title="Direct link to ESP-IDF Metrics" translate="no">​</a></h2>
<p>The Memfault SDK provides a number of built-in metrics for ESP-IDF projects. See
the <a class="" href="https://docs.memfault.com/docs/mcu/mcu-builtin-metrics#esp-idf">MCU Built-in Metrics - ESP-IDF</a>
reference for the full list, including metrics for heap memory, Wi-Fi, CPU
temperature, chip info, network I/O, flash activity, deep sleep, LwIP, and
MbedTLS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently Asked Questions<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sizing-the-coredump-partition">Sizing the Coredump Partition<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#sizing-the-coredump-partition" class="hash-link" aria-label="Direct link to Sizing the Coredump Partition" title="Direct link to Sizing the Coredump Partition" translate="no">​</a></h3>
<p>If your coredump partition size is insufficient to store a full RAM coredump,
the Memfault SDK will truncate the coredump to fit the available space. This
usually results in a useful coredump (active stack and thread stacks are
prioritized in the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/1.16.0/ports/esp_idf/memfault/common/memfault_platform_coredump.c#L180" target="_blank" rel="noopener noreferrer" class="">ESP-IDF port <code>memfault_platform_coredump_get_regions()</code> implementation</a>).
If you prefer to capture all of allocated RAM, either:</p>
<ol>
<li class="">Increase the <code>coredump</code> partition size to fit the maximum coredump size. You
can use the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/1.16.0/components/panics/src/memfault_coredump_utils.c#L12" target="_blank" rel="noopener noreferrer" class=""><code>memfault_coredump_storage_check_size()</code></a>
function to determine the maximum coredump size, which can vary depending on
user configuration. It's recommended to call that function after system
initialization. <em>Note: ESP-IDF projects don't natively permit changing the
partition table via an OTA update, so this option is generally useful only
before devices are deployed</em></li>
<li class="">Configure Memfault to use the inactive OTA slot to store coredumps. The
inactive OTA slot is generally only used when downloading a new OTA release,
before it's applied, so it's usually safe to re-use the partition for
coredumps. Use the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/1.16.0/ports/esp_idf/memfault/Kconfig#L65-L72" target="_blank" rel="noopener noreferrer" class=""><code>CONFIG_MEMFAULT_COREDUMP_USE_OTA_SLOT=y</code></a>
Kconfig flag to enable this mode.</li>
<li class="">Customize the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/1.16.0/ports/esp_idf/memfault/common/memfault_platform_coredump.c#L180" target="_blank" rel="noopener noreferrer" class="">ESP-IDF port <code>memfault_platform_coredump_get_regions()</code> implementation</a>
to store less data in the coredump (for example, removing the <code>.bss</code>,
<code>.data</code>, or heap regions). This isn't required, because the Memfault coredump
writer will safely truncate to fit available storage, but it will avoid the
"Coredump Truncated to fit" warning from the Trace view in the UI.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="assert-when-initializing-esp-idf-event-loop">Assert when initializing ESP-IDF Event Loop<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#assert-when-initializing-esp-idf-event-loop" class="hash-link" aria-label="Direct link to Assert when initializing ESP-IDF Event Loop" title="Direct link to Assert when initializing ESP-IDF Event Loop" translate="no">​</a></h3>
<p>Several ESP-IDF examples use the
<a href="https://docs.espressif.com/projects/esp-idf/en/v5.3.1/esp32/api-reference/system/esp_event.html" target="_blank" rel="noopener noreferrer" class="">Event Loop library</a>,
and initialize it with this code:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// Create default event loop</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">ESP_ERROR_CHECK</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token function" style="color:#79b6f2">esp_event_loop_create_default</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>Memfault makes use of the default event loop for Wi-Fi metrics (enabled by
default, controlled with <code>CONFIG_MEMFAULT_ESP_WIFI_METRICS</code>), and calls
<code>esp_event_loop_create_default()</code> during <code>memfault_boot()</code>.</p>
<p>The <code>esp_event_loop_create_default()</code> function can be safely called multiple
times- but returns <code>ESP_ERR_INVALID_STATE</code> if it's already initialized. The
above <code>ESP_ERROR_CHECK</code> macro will cause the application to assert in that case,
which is not desirable.</p>
<p>Instead, Memfault recommends using the following pattern to safely initialize
the default event loop:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// Try to create default event loop. If it's already created, it returns</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ESP_ERR_INVALID_STATE, equivalent to ESP_OK here.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">esp_err_t</span><span class="token plain"> err </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">esp_event_loop_create_default</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">ESP_ERROR_CHECK</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">err </span><span class="token operator" style="color:#d7deea">==</span><span class="token plain"> ESP_ERR_INVALID_STATE </span><span class="token operator" style="color:#d7deea">?</span><span class="token plain"> ESP_OK </span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> err</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deep-sleep-support">Deep Sleep Support<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#deep-sleep-support" class="hash-link" aria-label="Direct link to Deep Sleep Support" title="Direct link to Deep Sleep Support" translate="no">​</a></h3>
<p>See the guide at <a class="" href="https://docs.memfault.com/docs/mcu/deep-sleep">Deep Sleep Support</a> for details on
enabling support for tracking Metrics across deep sleep cycles.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="software-bill-of-materials-sbom-generation">Software Bill of Materials (SBOM) Generation<a href="https://docs.memfault.com/embed/mcu/espressif-esp32-guide#software-bill-of-materials-sbom-generation" class="hash-link" aria-label="Direct link to Software Bill of Materials (SBOM) Generation" title="Direct link to Software Bill of Materials (SBOM) Generation" translate="no">​</a></h2>
<p>Espressif provides a utility, <code>esp-idf-sbom</code>, to generate an SBOM in SPDX
format:</p>
<p><a href="https://github.com/espressif/esp-idf-sbom" target="_blank" rel="noopener noreferrer" class="">https://github.com/espressif/esp-idf-sbom</a></p>
<p>To generate an SBOM for your project, follow these steps:</p>
<ol>
<li class="">
<p>Build the project as usual with <code>idf.py build</code>.</p>
</li>
<li class="">
<p>Run the <code>esp-idf-sbom</code> utility:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># install the tool if needed</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ pip install esp-idf-sbom</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ esp-idf-sbom create build/project_description.json --output-file memfault_demo_app.spdx</span><br></span></code></pre></div></div>
</li>
</ol>
<p>The output file, here <code>memfault_demo_app.spdx</code>, is the one to upload to
Memfault.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[nRF Connect SDK Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide"/>
        <updated>2023-06-29T19:45:26.000Z</updated>
        <content type="html"><![CDATA[<p>In this guide we will walk through the steps for integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
a project using Nordic Semiconductor's nRF Connect SDK (NCS).</p>
<p>This integration is written for the
<a href="https://www.nordicsemi.com/Products/Development-hardware/nrf9160-dk" target="_blank" rel="noopener noreferrer" class="">nrf9160-DK</a>,
but is similar when targeting other boards with the nRF Connect SDK.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>nRF Connect SDK has built-in support for the Memfault Firmware SDK. Nordic
Semiconductor provides some
<a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/external_comp/memfault.html" target="_blank" rel="noopener noreferrer" class="">excellent documentation</a>
on how to integrate Memfault in your existing nRF Connect SDK project, together
with a
<a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/samples/debug/memfault/README.html" target="_blank" rel="noopener noreferrer" class="">sample integration project</a>
(source available
<a href="https://github.com/nrfconnect/sdk-nrf/tree/v2.8.0/samples/debug/memfault" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>).
We recommend following both this documentation page as well as Nordic's.</p></div></div>
<p>Upon completion of the integration, the following subcomponents will be added to
your system!</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/reboot-reason-tracking">Reboot Reasons</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" class="image_e9uR" alt="/img/docs/mcu/reboot-reason-chart.png" width="800"></a></figure>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/trace-events">Trace Events</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" class="image_e9uR" alt="/img/docs/mcu/trace-reason-example.png" width="800"></a></figure>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/coredumps">RAM-backed stack dump Collection</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" class="image_e9uR" alt="/img/docs/mcu/logs-with-coredump.png" width="800"></a></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-ncs-versions">Supported NCS Versions<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#supported-ncs-versions" class="hash-link" aria-label="Direct link to Supported NCS Versions" title="Direct link to Supported NCS Versions" translate="no">​</a></h2>
<p>Memfault targets supporting new NCS releases as they arrive. If a version is not
included below, please <a href="https://mflt.io/contact-support" target="_blank">contact us</a> and we'll let you know the status!</p>
<ul>
<li class="">✅ &gt;= <strong>v1.9.2</strong>, &lt;= <strong>v3.3.0</strong> tested and supported</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-your-account-on-nrfcloudcom">1. Create your nRF Cloud account<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#create-your-account-on-nrfcloudcom" class="hash-link" aria-label="Direct link to 1. Create your nRF Cloud account" title="Direct link to 1. Create your nRF Cloud account" translate="no">​</a></h2>
<p><a href="https://app.memfault.com/register" target="_blank" rel="noopener noreferrer" class="">Register for an nRF Cloud account</a> to get
started. Once registered, select your Nordic chip variant and a Project will be
automatically created for you.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Already have an nRF Cloud account without Memfault access? Create a new account
or <a href="https://mflt.io/contact-support" target="_blank">contact us</a> for support.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-up-the-sdk">2. Set up the SDK<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#set-up-the-sdk" class="hash-link" aria-label="Direct link to 2. Set up the SDK" title="Direct link to 2. Set up the SDK" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>This tutorial assumes you have a working
<a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/installation.html" target="_blank" rel="noopener noreferrer" class="">nRF Connect SDK Environment</a>
with nRF Connect SDK version &gt;=1.9.2 and are able to flash a board supported by
the SDK (i.e nRF91, nRF52, nRF53, nRF54, etc).</p></div></div>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>Due to changes in behavior of the OTA server and checking of multiple
certificates in NCS version v2.4.0, Memfault SDK versions &lt; v1.5.0 are
incompatible with NCS versions &gt;= v2.4.0. Therefore, any projects with older
versions of NCS and Memfault &lt; v1.5.0 should first upgrade Memfault before
upgrading NCS. Please <a href="https://mflt.io/contact-support" target="_blank">contact us</a> immediately if you encounter any
cert-related issues.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="include-memfault-firmware-sdk-in-your-west-yml">Include <code>memfault-firmware-sdk</code> in your <code>west.yml</code><a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#include-memfault-firmware-sdk-in-your-west-yml" class="hash-link" aria-label="Direct link to include-memfault-firmware-sdk-in-your-west-yml" title="Direct link to include-memfault-firmware-sdk-in-your-west-yml" translate="no">​</a></h3>
<p>The nRF Connect SDK embeds the Memfault SDK as a module:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">west.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> modules/lib/memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 1.28.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><br></span></code></pre></div></div>
<p>Therefore, adding Memfault to your project only requires adding some Kconfig
settings to the application!</p>
<p>To update the Memfault SDK without updating the nRF Connect SDK, you can add the
Memfault SDK as a module in your application's <code>west.yml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">west.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">manifest</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">remotes</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">connect</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">url-base</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">//github.com/nrfconnect</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token comment" style="color:#999999"># Add the Memfault GitHub repo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">url-base</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">//github.com/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">projects</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">nrf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">connect</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 3.0.2</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">import</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#ff8b50;font-weight:400">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token comment" style="color:#999999"># Explicitly add the Memfault SDK, to override the version in the sdk-nrf manifest</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> modules/lib/memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 1.28.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">self</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> my_example_application</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><br></span></code></pre></div></div>
<p>Zephyr's <code>west</code> tool will use the explicitly listed version of the
<code>memfault-firmware-sdk</code> module instead of the one specified by the
<code>nrf-connect-sdk</code> module. Reference:</p>
<ul>
<li class=""><a href="https://docs.zephyrproject.org/latest/develop/west/manifest.html#example-1-3-downstream-of-a-zephyr-release-with-module-fork" target="_blank" rel="noopener noreferrer" class="">https://docs.zephyrproject.org/latest/develop/west/manifest.html#example-1-3-downstream-of-a-zephyr-release-with-module-fork</a></li>
</ul>
<p>After updating the West Manifest, run 👉<code>west update</code>👈 to pull in the Memfault
SDK. Double check that you see the SDK source folder <code>memfault-firmware-sdk</code>
under <code>modules/lib/</code>. You can manually check the version of the SDK with the
following command (run from the West workspace root):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># open the Memfault Firmware SDK commit in the default web browser:</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">❯ open https://github.com/memfault/memfault-firmware-sdk/commit/$(git -C modules/lib/memfault-firmware-sdk rev-parse HEAD)</span><br></span></code></pre></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Details on Recommended Zephyr Workspace Topology </summary><div><div class="collapsibleContent_i85q"><p>Memfault recommends using the
<a href="https://docs.zephyrproject.org/latest/develop/west/workspaces.html#t2-star-topology-application-is-the-manifest-repository" target="_blank" rel="noopener noreferrer" class="">T2 topology</a>
where the project or application is the manifest repository. An example
directory structure for this kind of workspace is:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west-workspace/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .venv</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .west</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── bootloader</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── modules</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── project-dir (manifest repository)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── .git</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│       └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; └── west.yml</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── test</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── tools</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── zephyr</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Note that in this structure, any number of applications can live in
<code>project-dir</code>. This works well for any projects that use a monorepo where
sources for multiple firmware targets live, and they can share dependencies
controlled via <code>west</code> (e.g. <code>zephyr</code>). In this case, the directory structure
would be:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west-workspace/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .venv</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .west</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── bootloader</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── modules</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── project-dir (manifest repository)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── .git</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── app1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   |   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |      └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   ├── app2</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   |   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |       └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; └── west.yml</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── test</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── tools</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── zephyr</span><br></span></code></pre></div></div></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-kconfig-options">Update Kconfig options<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#update-kconfig-options" class="hash-link" aria-label="Direct link to Update Kconfig options" title="Direct link to Update Kconfig options" translate="no">​</a></h3>
<p>Add or update the appropriate options in your system's <code>prj.conf</code>
(<a href="https://mflt.io/project-key" target="_blank" rel="noopener noreferrer" class="">Memfault project key here</a>):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Project-specific configuration settings</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT=y</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_PROJECT_KEY="YOUR_PROJECT_KEY"</span><br></span></code></pre></div></div>
<p>You can find more details on the available options using <code>menuconfig</code>,
<code>guiconfig</code>, and in the Kconfig sources in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/zephyr/Kconfig" target="_blank" rel="noopener noreferrer" class=""><code>modules/memfault-firmware-sdk/ports/zephyr/Kconfig</code></a>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><code>CONFIG_MEMFAULT_NCS_PROJECT_KEY</code> is optional in nRF Connect SDK &gt;=v3.0.0 for
any device that does not use MDS or the Memfault HTTP client to upload chunks to
the Memfault cloud, and instead relies on an upstream device to forward data.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hello-memfault">3. "Hello Memfault"<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#hello-memfault" class="hash-link" aria-label="Direct link to 3. &quot;Hello Memfault&quot;" title="Direct link to 3. &quot;Hello Memfault&quot;" translate="no">​</a></h2>
<p>Next, we'll add the remaining changes needed to produce some Memfault data, such
as a Reboot Event or Coredump.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-application-config-files">Add Application Config Files<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#add-application-config-files" class="hash-link" aria-label="Direct link to Add Application Config Files" title="Direct link to Add Application Config Files" translate="no">​</a></h3>
<p>Besides Kconfigs, the Memfault SDK is configured through definitions in 3 files.
To start, create empty versions of these files:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cd $APPLICATION_DIR</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mkdir -p config</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch config/memfault_platform_config.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch config/memfault_metrics_heartbeat_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch config/memfault_trace_reason_user_config.def</span><br></span></code></pre></div></div>
<p>We will use these files in the following sections to define metrics and set
other SDK options. To set up some include path dependencies between your
application, NCS/Zephyr, and the Memfault SDK, add this line to your application
<code>CMakeLists.txt</code>:</p>
<div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token function" style="color:#79b6f2">zephyr_include_directories</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<p>See the
<a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/external_comp/memfault.html#configuring_memfault" target="_blank" rel="noopener noreferrer" class="">nRF Connect Docs</a>
for more information.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-platform-dependencies">Implement Platform Dependencies<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#implement-platform-dependencies" class="hash-link" aria-label="Direct link to Implement Platform Dependencies" title="Direct link to Implement Platform Dependencies" translate="no">​</a></h3>
<p>The first dependency to complete is our <code>memfault_platform_get_device_info()</code>
implementation. There are a few options available:</p>
<ul>
<li class=""><code>MEMFAULT_DEVICE_INFO_BUILTIN</code>: provides a built-in implementation using
either dynamic or static values</li>
<li class=""><code>MEMFAULT_DEVICE_INFO_CUSTOM</code>: allows for a more custom implementation,
entirely defined by your application</li>
</ul>
<p>For most setups, we recommend <code>MEMFAULT_DEVICE_INFO_BUILTIN</code>.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">nRF91 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF52 &amp; nRF53 &amp; nRF54 Series</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>For nRF91 Series devices, no additional changes are needed as NCS takes care of
many defaults.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>For nRF52/nRF53/RF54 Series devices, we will need to set additional Kconfigs:</p><ul>
<li class=""><code>MEMFAULT_NCS_DEVICE_ID_STATIC</code>: Sets the device ID to the value of the
Kconfig <code>MEMFAULT_NCS_DEVICE_ID</code>.</li>
<li class=""><code>MEMFAULT_NCS_DEVICE_ID</code>: Value used with static device ID configuration. This
field sets the device serial used by Memfault.</li>
<li class=""><code>MEMFAULT_NCS_FW_TYPE</code>: Value used with built-in device info implementation.
This field sets the Software Type used by Memfault.</li>
</ul></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Implement a custom <code>memfault_platform_get_device_info()</code> if the device info
fields cannot be set into the static Kconfig values (i.e. in <code>prj.conf</code> or the
command line). Set the following in your <code>prj.conf</code>:</p><div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">NCS v3.2.0 or later</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NCS &lt;v3.2.0</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">prj.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_DEVICE_INFO_CUSTOM=y</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">prj.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_DEVICE_INFO_CUSTOM=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_DEVICE_ID_RUNTIME=y</span><br></span></code></pre></div></div></div></div></div><p>Then, implement <code>memfault_platform_get_device_info()</code> in your application.</p><p>A stub <code>memfault_platform_get_device_info()</code> function looks like this, for
reference:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/core/platform/device_info.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_device_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// !FIXME: Populate with platform device information</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// *NOTE* All fields must be populated, and the values assigned to the fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// must have static lifetime: the data is accessed when this function returns.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// In this example, the fields are string literals, which are placed either</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// inline into .text data tables, or in .rodata, and the pointers are valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// for the lifetime of the program</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// See https://mflt.io/version-nomenclature for more context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device serial to a unique value.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It is typically set to a unique identifier like a serial number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// or MAC address.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to de-deduplicate data in Memfault cloud</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">device_serial </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"DEMOSERIAL"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It can be simply "app" for a single-chip device, otherwise it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// should match the component name, eg "ble", "sensor" etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_type </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"app-main"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software version.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// If using Memfault OTA, this should exactly match the OTA Release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Version name for the installed image</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"1.0.0-dev"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device hardware revision.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter/group devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">hardware_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"evt"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div>
<p>With this complete, our application should build!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-memfault-shell">Using the Memfault Shell<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#using-the-memfault-shell" class="hash-link" aria-label="Direct link to Using the Memfault Shell" title="Direct link to Using the Memfault Shell" translate="no">​</a></h3>
<p>By default, the Memfault Firmware SDK provides a set of shell commands to test
and exercise different Memfault functions. Some features of the shell include
commands to:</p>
<ul>
<li class="">Trigger asserts and other faults</li>
<li class="">Reboot the device</li>
<li class="">Export Memfault data over the shell via base64 encoding</li>
</ul>
<p>To confirm our integration, let's start with generating a reboot event to verify
the reboot tracking component is working.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">nRF91 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF52 &amp; nRF53 &amp; nRF54 Series</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><ol>
<li class="">Trigger a device reboot with <code>mflt test reboot</code></li>
<li class="">Wait for the device to reboot, reconnect, and automatically post any Memfault
data using the nRF91 Series LTE modem</li>
</ol></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><ol>
<li class="">Trigger a device reboot with <code>mflt test reboot</code></li>
<li class="">When the device reboots, run <code>mflt export</code></li>
</ol><p>The <code>mflt export</code> command will output a base64 encoded chunk containing a reboot
event triggered from the prior command.</p><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">*** Booting Zephyr OS build v3.3.99-ncs1-1 ***</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Starting Bluetooth Memfault example</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Bluetooth initialized</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Advertising successfully started</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MC:CAKnAgIDAQpqbnJmLWJsZS1mdwlsMC4wLjErYjJhNGZmBnNucmY1MjgzM2RrX25yZjUyODMzC0aypP9L3zEEowECBAQFAL0a:</span><br></span></code></pre></div></div><p>Copy the logs from the console, navigate to the
<a href="https://mflt.io/chunks-debug" target="_blank" rel="noopener noreferrer" class="">"Integration Hub / Chunks Debug"</a> view for your
project, and paste the logs:</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" class="image_e9uR"></a></figure><p>Select "Next" to review the chunks that were identified and (optionally) update
the "Device Serial" being used to report data:</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" class="image_e9uR"></a></figure><p>Select "Post" to submit the chunks to Memfault. The chunks will appear directly
below in the view. Check and make sure there are no "Errors" to address.</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" class="image_e9uR"></a></figure><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Tip: Chunks can be manually copied into the Integration Hub → Chunks Debug page
or automatically via the Memfault CLI. See the <a class="" href="https://docs.memfault.com/docs/ci/cli/console">console</a>
or <a class="" href="https://docs.memfault.com/docs/ci/cli/post-chunk">post-chunks</a> commands for details.</p></div></div></div></div></div>
<p>With this chunk uploaded to Memfault, we can verify the event sent to Memfault
by navigating to Fleet → Devices → <!-- -->&lt;YOUR_DEVICE&gt;<!-- --> and observing a new entry
in the Reboots swimlane.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-a-coredump">4. Manually Capture a Coredump<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#manually-capture-a-coredump" class="hash-link" aria-label="Direct link to 4. Manually Capture a Coredump" title="Direct link to 4. Manually Capture a Coredump" translate="no">​</a></h2>
<p>Next, we'll use the built-in commands to capture a coredump</p>
<ol>
<li class="">Trigger a software assert with <code>mflt test assert</code></li>
<li class="">Export the data using the previous method, such as over LTE or importing the
exported chunks in the Chunks Debug page</li>
</ol>
<p>After uploading the coredump data, Memfault will need your symbol file to
process the sent data.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-a-symbol-file">Upload a Symbol File<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#upload-a-symbol-file" class="hash-link" aria-label="Direct link to Upload a Symbol File" title="Direct link to Upload a Symbol File" translate="no">​</a></h3>
<p>The remaining step is to upload your symbol file to allow Memfault to process
the received coredump data. Your symbol file is located within your build
folder. The default location is <code>&lt;workspace_root&gt;/build/zephyr/zephyr.elf</code>.</p>
<p>Symbol files can be uploaded from the
<a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">Software → Symbol Files</a> page.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-logs">5. Manually Capture Logs<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#manually-capture-logs" class="hash-link" aria-label="Direct link to 5. Manually Capture Logs" title="Direct link to 5. Manually Capture Logs" translate="no">​</a></h2>
<p>The Memfault SDK will (sparingly) emit diagnostic logs to alert of integration
configuration problems. The logging subsystem can also easily serve as logging
infrastructure for your platform if you still need to set up one.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="memfault-logging-kconfigs">Memfault Logging Kconfigs<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#memfault-logging-kconfigs" class="hash-link" aria-label="Direct link to Memfault Logging Kconfigs" title="Direct link to Memfault Logging Kconfigs" translate="no">​</a></h3>
<p>The Memfault logging component integrates as a Zephyr logging backend and is
controlled via Kconfig. Add the following to your <code>prj.conf</code>:
<code>CONFIG_MEMFAULT_LOGGING_ENABLE</code>. This will enable the Memfault logging backend
to collect logs sent with Zephyr's <code>LOG_X()</code> and <code>MEMFAULT_LOG_X</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="collecting-logs">Collecting Logs<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#collecting-logs" class="hash-link" aria-label="Direct link to Collecting Logs" title="Direct link to Collecting Logs" translate="no">​</a></h3>
<p>Calls to the Zephyr or Memfault logging macros will automatically collect logs.
The CLI provides a few commands to test this:</p>
<ol>
<li class="">Force some calls to the logging macros: <code>mflt test logs</code></li>
<li class="">Trigger a log collection: <code>mflt test log_capture</code></li>
</ol>
<p>After executing these commands, the SDK will now contain a serialized capture of
these logs. Use the previous export method to send the chunks to Memfault.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-standard-metrics">6. Configuring Standard Metrics<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#configuring-standard-metrics" class="hash-link" aria-label="Direct link to 6. Configuring Standard Metrics" title="Direct link to 6. Configuring Standard Metrics" translate="no">​</a></h2>
<p>The Metrics component is a simple and easy way to measure run-time performance
and behavior of your device.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="memfault-metrics-kconfigs">Memfault Metrics Kconfigs<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#memfault-metrics-kconfigs" class="hash-link" aria-label="Direct link to Memfault Metrics Kconfigs" title="Direct link to Memfault Metrics Kconfigs" translate="no">​</a></h3>
<p>The Metrics component is configured via Kconfig and enabled by default.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-metrics-for-ncs">Built-in Metrics for the NCS<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#built-in-metrics-for-ncs" class="hash-link" aria-label="Direct link to Built-in Metrics for the NCS" title="Direct link to Built-in Metrics for the NCS" translate="no">​</a></h3>
<p>The nRF Connect SDK provides pre-enabled metrics for LTE (nRF91 Series) and
Bluetooth (nRF52/nRF53/nRF54 Series). When setting up a Project in the Memfault
app, selecting the <code>nRF91</code> MCU will pre-populate a few fleet
<a class="" href="https://docs.memfault.com/docs/platform/charts-and-cards">metrics charts</a> visualizing the LTE metrics:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/nrf91-preset-fleet-metrics.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/nrf91-preset-fleet-metrics.png" class="image_e9uR" alt="Image showing the pre-populated fleet metric charts"></a></figure>
<p>See the
<a class="" href="https://docs.memfault.com/docs/mcu/mcu-builtin-metrics#ncs">MCU Built-in Metrics - nRF Connect SDK</a>
reference for the full list of NCS built-in metrics.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="defining-custom-metrics">Defining Metrics<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#defining-custom-metrics" class="hash-link" aria-label="Direct link to Defining Metrics" title="Direct link to Defining Metrics" translate="no">​</a></h3>
<p>Heartbeat metrics allow you to easily monitor your platform and confirm it is
operating as expected.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Typical Heartbeat Examples</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">investigate problems that didn't cause a reboot (bad connectivity, network or
sensor error rates) and marginality that crops up in a fleet</li>
<li class="">providing leading indicators of problems (rapid battery drain, drop in
activity, etc)</li>
<li class="">compare trends across releases (improved connectivity, data efficiency etc)</li>
</ul><p>Best Practices around each metric type that we recommend:</p><ul>
<li class="">Timers - These are used to track time spent in particular states and can be
used for debugging connectivity, battery life, and performance issues.</li>
<li class="">Counters - Track counts of a particular event class taking place. Suggested
use cases are:<!-- -->
<ul>
<li class="">Operations your system are performing (number of events serviced by a task,
bytes sent over network, bytes written to flash). Alerts can be configured
to identify devices operating outside normal thresholds.</li>
<li class="">Counts of events for events that should never happen (i2c bus write error
count, flash write error). You can alert if any of these situations are
seen.</li>
</ul>
</li>
<li class="">Gauges - These are values sampled at the end of each Heartbeat interval.
Common items include<!-- -->
<ul>
<li class="">Battery Metrics (Drop over an hour, current percent)</li>
<li class="">Heap utilization / stack high watermark</li>
</ul>
</li>
</ul></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-metric-to-memfault_metrics_heartbeat_configdef">Add Metric to memfault_metrics_heartbeat_config.def<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#add-metric-to-memfault_metrics_heartbeat_configdef" class="hash-link" aria-label="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" title="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_metrics_heartbeat_config.def</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_METRICS_KEY_DEFINE</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> kMemfaultMetricType_Unsigned</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="instrument-code-to-update-heartbeat">Instrument Code to Update Heartbeat<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#instrument-code-to-update-heartbeat" class="hash-link" aria-label="Direct link to Instrument Code to Update Heartbeat" title="Direct link to Instrument Code to Update Heartbeat" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">my_main_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">your_rtos_wait_for_event</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">MEMFAULT_METRIC_ADD</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatically-upload-data">7. Automatically Upload Data<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#automatically-upload-data" class="hash-link" aria-label="Direct link to 7. Automatically Upload Data" title="Direct link to 7. Automatically Upload Data" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1">Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-built-in-memfault-data-transport">Using the Built-in Memfault Data Transport<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#using-the-built-in-memfault-data-transport" class="hash-link" aria-label="Direct link to Using the Built-in Memfault Data Transport" title="Direct link to Using the Built-in Memfault Data Transport" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">nRF91 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF52 &amp; nRF53 &amp; nRF54 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>nRF91 Series and nRF70 Series devices have direct internet access, and can
upload Memfault diagnostic data over HTTPS. To enable automatic data uploads,
add the following to your <code>prj.conf</code>:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y</span><br></span></code></pre></div></div><p>The shell command <code>mflt post_chunks</code> can be used to manually trigger an upload
over HTTPS.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>As of the v2.1.0 release of the nRF-Connect SDK (NCS), there is built-in support
for the Memfault Diagnostic Service, which is a Bluetooth LE GATT service
designed to enable exporting Memfault data in a standardized way.</p>
<p>Nordic has detailed documentation on the Memfault Diagnostic service here:</p>
<p><a href="https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/nrf/libraries/bluetooth/services/mds.html" target="_blank" rel="noopener noreferrer" class="">https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/nrf/libraries/bluetooth/services/mds.html</a></p>
<p>To enable MDS, add <code>CONFIG_BT_MDS=y</code> to your <code>prj.conf</code> file. Once enabled, you
can use the
<a href="https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-Device-Manager" target="_blank" rel="noopener noreferrer" class="">nRF Connect Device Manager</a>
mobile application to automatically collect Memfault chunks from MDS devices.</p>
<p>There is also a sample application, "Bluetooth LE: Peripheral Memfault
Diagnostic Service (MDS)", documented here:</p>
<p><a href="https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/nrf/samples/bluetooth/peripheral_mds/README.html" target="_blank" rel="noopener noreferrer" class="">https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/nrf/samples/bluetooth/peripheral_mds/README.html</a></p>
<p>Nordic and Memfault provide the following Bluetooth LE gateways for testing the
MDS implementation:</p>
<ul>
<li class="">
<p>the Python MDS Bluetooth LE gateway script, from the nRF-Connect SDK:
<a href="https://github.com/nrfconnect/sdk-nrf/tree/v3.1.0/scripts/memfault" target="_blank" rel="noopener noreferrer" class="">https://github.com/nrfconnect/sdk-nrf/tree/v3.1.0/scripts/memfault</a></p>
</li>
<li class="">
<p>a Web Bluetooth LE browser-based tool, from Memfault: <a href="https://mflt.io/mds" target="_blank" rel="noopener noreferrer" class="">https://mflt.io/mds</a></p>
</li>
<li class="">
<p>iOS and Android open-source libraries:</p>
<ul>
<li class="">Android library:
<a href="https://github.com/NordicSemiconductor/Android-Memfault-Library" target="_blank" rel="noopener noreferrer" class="">https://github.com/NordicSemiconductor/Android-Memfault-Library</a></li>
<li class="">iOS library: <a href="https://github.com/NordicSemiconductor/IOS-Memfault-Library" target="_blank" rel="noopener noreferrer" class="">https://github.com/NordicSemiconductor/IOS-Memfault-Library</a></li>
</ul>
</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>For a quick test, we recommend following the
<a class="" href="https://docs.memfault.com/docs/mcu/quickstart-nrf5x-ncs">Quickstart for Nordic nRF52/nRF53/nRF54 Series</a>
with the
<a href="https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/nrf/samples/bluetooth/peripheral_mds/README.html" target="_blank" rel="noopener noreferrer" class="">"Bluetooth LE: Peripheral Memfault Diagnostic Service (MDS)"</a>
sample application for a guided walk-through on uploading diagnostic data and
performing an over-the-air update.</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Extensive details about how data from the Memfault SDK makes it to the cloud
<a class="" href="https://docs.memfault.com/docs/mcu/data-from-firmware-to-the-cloud">can be found here</a>. In short, the Memfault
SDK packetizes data into "chunks" that must be pushed to the Memfault cloud via
the
<a href="https://api-docs.memfault.com/?version=latest#66b0e390-2c3e-4c0d-b6c2-836a287b9e5f" target="_blank" rel="noopener noreferrer" class="">chunk REST endpoint</a>.</p><p>A typical integration looks like this:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/core/data_packetizer.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// buffer to copy chunk data into</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">USER_CHUNK_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> buf_len </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  bool data_available </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_packetizer_get_chunk</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token plain">data_available </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no more data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// send payload collected to chunks endpoint; this could for example send the</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// packet over a GATT characteristic to the peer device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">user_transport_send_chunk_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// [... user specific logic deciding when &amp; how much data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-data-to-memfault-over-udp">Sending data to Memfault over UDP<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#sending-data-to-memfault-over-udp" class="hash-link" aria-label="Direct link to Sending data to Memfault over UDP" title="Direct link to Sending data to Memfault over UDP" translate="no">​</a></h3>
<p>Please refer to our documentation on
<a class="" href="https://docs.memfault.com/docs/best-practices/udp-with-memfault">Memfault and UDP</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>See the docs on
<a class="" href="https://docs.memfault.com/docs/troubleshooting/data-transfer-troubleshooting">data transfer troubleshooting</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">8. Next Steps<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#next-steps" class="hash-link" aria-label="Direct link to 8. Next Steps" title="Direct link to 8. Next Steps" translate="no">​</a></h2>
<p>Now that the Memfault SDK is integrated on your device, there are many other
features and options to explore. Check out these sections of our docs for more
information:</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Core Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Advanced Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/best-practices">Best Practices</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/web-app">Web App</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-and-invoking-an-ota-update">Configuring and Invoking an OTA Update<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#configuring-and-invoking-an-ota-update" class="hash-link" aria-label="Direct link to Configuring and Invoking an OTA Update" title="Direct link to Configuring and Invoking an OTA Update" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>Due to changes in behavior of the OTA server and checking of multiple
certificates in NCS version v2.4.0, Memfault SDK versions &lt; v1.5.0 are
incompatible with NCS versions &gt;= v2.4.0. Therefore, any projects with older
versions of NCS and Memfault &lt; v1.5.0 should first upgrade Memfault before
upgrading NCS. Please <a href="https://mflt.io/contact-support" target="_blank">contact us</a> immediately if you encounter any
cert-related issues.</p></div></div>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">nRF91 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF52 &amp; nRF53 &amp; nRF54 Series</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF70 Series</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Before proceeding, configure OTA Kconfigs for your NCS version:</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>In NCS v3.0.0, the download client library was deprecated in favor of the
downloader library. For more information on migrating to the downloader library,
see the
<a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/releases_and_maturity/migration/migration_guide_3.0.html#download_client" target="_blank" rel="noopener noreferrer" class="">v3.0.0 migration guide</a>.</p></div></div>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">NCS v3.0.0 or later</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NCS &lt;v3.0.0</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Subsystems to write OTA payloads to flash and update via MCUBoot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DFU_TARGET=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DFU_TARGET_MCUBOOT=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_IMG_MANAGER=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FLASH=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FLASH_MAP=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_STREAM_FLASH=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_IMG_ERASE_PROGRESSIVELY=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Use NCS downloader APIs</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FOTA_DOWNLOAD=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOADER=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOADER_MAX_FILENAME_SIZE=400</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOADER_STACK_SIZE=1600</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Print download progress to console</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FOTA_DOWNLOAD_PROGRESS_EVT=y</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Subsystems to write OTA payloads to flash and update via MCUBoot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DFU_TARGET=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DFU_TARGET_MCUBOOT=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_IMG_MANAGER=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FLASH=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FLASH_MAP=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_STREAM_FLASH=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_IMG_ERASE_PROGRESSIVELY=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Use NCS download_client APIs</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FOTA_DOWNLOAD=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOAD_CLIENT=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOAD_CLIENT_STACK_SIZE=1600</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOAD_CLIENT_MAX_FILENAME_SIZE=400</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_DOWNLOAD_CLIENT_HTTP_FRAG_SIZE_1024=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Print download progress to console</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_FOTA_DOWNLOAD_PROGRESS_EVT=y</span><br></span></code></pre></div></div></div></div></div>
<p>Perform a full rebuild to pick up the new settings:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west build --pristine=always --board nrf9160dk_nrf9160_ns@1.0.0 nrf/samples/net/https_client</span><br></span></code></pre></div></div>
<p>Flash the board, and using the <code>mflt get_latest_url</code> command, confirm that an
OTA check can be performed:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt get_latest_url</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:25.525,970] ‹err&gt; mflt: Unable to fetch OTA url, rv=0</span><br></span></code></pre></div></div>
<p>Navigate to the Processing Log and confirm the OTA check event was recorded:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/quickstart/ProcessingLogOTACheck.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/quickstart/ProcessingLogOTACheck.png" class="image_e9uR"></a><figcaption class="caption_ns13"><p>Screenshot of a Processing Log showing a OTA check for update event received</p></figcaption></figure>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Processing Log is a great place to start when testing any device operation
that interacts with Memfault.</p></div></div>
<p>Now rebuild the firmware with a newer Software Version, using these Kconfig
settings:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_FW_VERSION_STATIC=y</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># The default version will look like "0.0.1+c85ef3". This version is</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># set to "newer" (higher precedence) to trigger an OTA.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_FW_VERSION="0.0.2"</span><br></span></code></pre></div></div>
<p>Build your firmware with the later version, and upload the OTA payload and
matching symbols using the Memfault CLI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault --project YOUR_PROJECT --org YOUR_ORG_SLUG \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  --org-token YOUR_ORG_TOKEN upload-ota-payload \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  --hardware-version nrf9160dk --software-version 0.0.2 \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  --software-type nrf91ns-fw build/https_client/zephyr/app_update.bin</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault --project YOUR_PROJECT --org YOUR_ORG_SLUG \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  --org-token YOUR_ORG_TOKEN upload-symbols \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  --software-type nrf91ns-fw --software-version 0.0.2 \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  build/https_client/zephyr/zephyr.elf</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The Memfault CLI requires installation and authentication. See the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">CLI installation guide</a> and
<a class="" href="https://docs.memfault.com/docs/ci/authentication#organization-auth-token">Organization Auth Token</a>.</p></div></div>
<p>Go to
<a href="https://app.memfault.com/organizations/-/projects/-/releases" target="_blank" rel="noopener noreferrer" class="">Software → Releases</a>
in Memfault and find your new Release and click <strong>Activate</strong>.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/quickstart/ActivateReleaseModal.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/quickstart/ActivateReleaseModal.png" class="image_e9uR"></a><figcaption class="caption_ns13"><p>Screenshot of a Activate Release modal</p></figcaption></figure>
<p>Use the <code>mflt get_latest_url</code> command on the device to check that the OTA is
activated:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># If not OTA is available, rv=0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt get_latest_url</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ [00:02:35.962,371] &lt;err&gt; mflt: Unable to fetch OTA url, rv=0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># After activating the OTA, a payload URL is returned</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt get_latest_url</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Download URL: 'https://ota-cdn.memfault.com/693/130/14605210130?token=1K0Di8MzovgDIJxyO7Z09olIjD_d5_Uj3278KO1gCaA&amp;expires=1714172400'</span><br></span></code></pre></div></div>
<p>Use the <code>mflt get_latest_release</code> command to execute the OTA:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># The FOTA client will try a sequence of TLS certs during the download,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># so there may be "Unable to connect, errno 114" responses, these are</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># normal.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt get_latest_release</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:00.426,910] &lt;inf&gt; mflt: Checking for FOTA</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ [00:03:02.689,514] &lt;inf&gt; mflt: FOTA Update Available. Starting Download!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:02.690,338] &lt;inf&gt; download_client: Downloading: https://ota-cdn.memfault.com/693/130/14605211234?token=1K0Di8MzovgDIJxyO7Z09olIjD_d5_Uj3278KO1gCaA&amp;expires=1714172400 [0]</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:02.690,399] &lt;inf&gt; mflt: FOTA In Progress</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:02.900,024] &lt;inf&gt; download_client: Setting up TLS credentials, sec tag count 3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:02.900,146] &lt;inf&gt; download_client: Connecting to 2400:52e0:1a00::718:1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:02.900,360] &lt;err&gt; download_client: Unable to connect, errno 114</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:03.006,317] &lt;inf&gt; download_client: Setting up TLS credentials, sec tag count 3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:03.006,439] &lt;inf&gt; download_client: Connecting to 169.150.236.100</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:04.660,308] &lt;inf&gt; download_client: Downloaded 1024/250791 bytes (0%)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:05.184,417] &lt;inf&gt; download_client: Downloaded 2048/250791 bytes (0%)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:03:05.411,560] &lt;inf&gt; download_client: Downloaded 3072/250791 bytes (1%)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:04:17.788,665] &lt;inf&gt; download_client: Downloaded 248832/250791 bytes (99%)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">*** Booting nRF Connect SDK d96769faceca ***</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">I: Starting bootloader</span><br></span></code></pre></div></div>
<p>After the update downloads and installs, the board will reboot. Use the
<code>mflt get_device_info</code> command to check the new version was installed:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">uart:~$ mflt get_device_info</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:09.159,088] &lt;inf&gt; mflt: S/N: 352656106683967</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:09.159,149] &lt;inf&gt; mflt: SW type: nrf91ns-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:09.159,210] &lt;inf&gt; mflt: SW version: 0.0.2</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:09.159,271] &lt;inf&gt; mflt: HW version: nrf9160dk</span><br></span></code></pre></div></div>
<p>Celebrate, your device has completed an OTA! 🎉</p><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>See a full example app that enables OTA using MCUBoot
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/examples/nrf-connect-sdk/nrf9160/memfault_demo_app" target="_blank" rel="noopener noreferrer" class="">in the Memfault SDK</a>.</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Devices using the nRF70 Series Wi-Fi module can use the same Memfault OTA
configuration settings as the nRF91 Series. Be aware that when using the nRF7002
with an nRF5340 host processor (as on the
<a href="https://www.nordicsemi.com/Products/Development-hardware/nRF7002-DK" target="_blank" rel="noopener noreferrer" class="">nRF7002 DK</a>),
the secondary partition used to stage the OTA payload for MCUBoot needs to be
placed on external flash, since the nRF5340 does not have enough internal flash
to hold both the secondary and primary partitions (see
<a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/2.5.1/nrf/protocols/wifi/mem_requirements.html" target="_blank" rel="noopener noreferrer" class="">memory requirements reference</a>).</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/nrf5340-nrf7002-spi-flash.excalidraw.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/nrf5340-nrf7002-spi-flash.excalidraw.png" class="image_e9uR"></a></figure><p>See here for an example project demonstrating Memfault OTA on the nRF7002:</p><p><a href="https://github.com/memfault/nrf7002-memfault-example" target="_blank" rel="noopener noreferrer" class="">https://github.com/memfault/nrf7002-memfault-example</a></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>For Nordic devices, FOTA can be performed using the normal Nordic-provided DFU
tools, sample apps, and libraries.</p><p>Follow the below links for details on how to set that up:</p><ul>
<li class="">
<p><a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/app_dev/bootloaders_dfu/index.html" target="_blank" rel="noopener noreferrer" class="">Bootloaders and DFU</a></p>
</li>
<li class="">
<p><a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/app_dev/device_guides/nrf52/index.html#fota-updates" target="_blank" rel="noopener noreferrer" class="">nRF52 Device Guide on FOTA Updates</a></p>
<p>Note: the above guide is for the nRF52, but the same principles apply to the
nRF53 and nRF54.</p>
</li>
</ul><p>The only Memfault-specific piece of that FOTA process is the fetching of the OTA
binary payload, which is performed via an HTTP request against Memfault's
server, passing the Memfault Project Key and the Device Serial for the target
device:</p><ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/releases-integration-guide#query-for-ota-payload">MCU OTA Integration Guide</a></li>
</ul><p>Below is a brief diagram showing how an nRF52, mobile phone, and Memfault's
server interact during an OTA update:</p><p>The mobile client libraries for iOS and Android are available on GitHub:</p><ul>
<li class=""><a href="https://github.com/NordicSemiconductor/IOS-nRF-Connect-Device-Manager" target="_blank" rel="noopener noreferrer" class="">iOS nRF Connect Device Manager</a></li>
<li class=""><a href="https://github.com/NordicSemiconductor/Android-nRF-Connect-Device-Manager" target="_blank" rel="noopener noreferrer" class="">Android nRF Connect Device Manager</a></li>
</ul></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reboot-reasons-for-hardfaults">Reboot Reasons for HardFaults<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#reboot-reasons-for-hardfaults" class="hash-link" aria-label="Direct link to Reboot Reasons for HardFaults" title="Direct link to Reboot Reasons for HardFaults" translate="no">​</a></h2>
<p>For Nordic devices,
<a class="" href="https://docs.memfault.com/docs/mcu/faq#incorrect-reboot-reason-tf-m">the issue of obtaining reboot reasons when using TF-M</a>
is resolved in nRF Connect SDK v2.8.0. When a fault occurs from non-secure code,
Zephyr fault handlers will be called and in turn, the Memfault fault handlers.
This feature is enabled by default with the Kconfig flag
<code>CONFIG_TFM_ALLOW_NON_SECURE_FAULT_HANDLING=y</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="useful-links">Useful links<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#useful-links" class="hash-link" aria-label="Direct link to Useful links" title="Direct link to Useful links" translate="no">​</a></h2>
<p>Example projects are provided both by Memfault and Nordic:</p>
<ul>
<li class=""><a href="https://github.com/memfault/memfault-firmware-sdk/tree/1.16.0/examples/nrf-connect-sdk/nrf5" target="_blank" rel="noopener noreferrer" class="">nRF52/nRF53 example Memfault integration</a></li>
<li class=""><a href="https://github.com/memfault/memfault-firmware-sdk/tree/1.16.0/examples/nrf-connect-sdk/nrf9160" target="_blank" rel="noopener noreferrer" class="">nRF9160 example Memfault integration</a></li>
<li class=""><a href="https://github.com/nrfconnect/sdk-nrf/tree/v2.8.0/samples/debug/memfault" target="_blank" rel="noopener noreferrer" class="">Nordic maintained nRF9160 example Memfault integration</a></li>
<li class=""><a href="https://github.com/nrfconnect/sdk-nrf/tree/v2.8.0/applications/asset_tracker_v2" target="_blank" rel="noopener noreferrer" class="">Nordic maintained Asset Tracker v2 Application for nRF9160</a>
<ul>
<li class="">see the documentation for
<a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/applications/asset_tracker_v2/doc/debug_module.html" target="_blank" rel="noopener noreferrer" class="">how to build with Memfault enabled</a></li>
</ul>
</li>
</ul>
<p>Nordic Memfault Documentation:</p>
<ul>
<li class=""><a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/libraries/debug/memfault_ncs.html" target="_blank" rel="noopener noreferrer" class="">nRF Connect SDK documentation on built-in Memfault Firmware SDK integration</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions-faq">Frequently Asked Questions (FAQ)<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#frequently-asked-questions-faq" class="hash-link" aria-label="Direct link to Frequently Asked Questions (FAQ)" title="Direct link to Frequently Asked Questions (FAQ)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-the-memfault-sdk">Updating the Memfault SDK<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#updating-the-memfault-sdk" class="hash-link" aria-label="Direct link to Updating the Memfault SDK" title="Direct link to Updating the Memfault SDK" translate="no">​</a></h3>
<p>The nRF Connect SDK embeds the Memfault SDK as a module:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">west.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> modules/lib/memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 1.28.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><br></span></code></pre></div></div>
<p>Therefore, adding Memfault to your project only requires adding some Kconfig
settings to the application!</p>
<p>To update the Memfault SDK without updating the nRF Connect SDK, you can add the
Memfault SDK as a module in your application's <code>west.yml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">west.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">manifest</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">remotes</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">connect</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">url-base</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">//github.com/nrfconnect</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token comment" style="color:#999999"># Add the Memfault GitHub repo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">url-base</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">//github.com/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">projects</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">nrf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">connect</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nrf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 3.0.2</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">import</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#ff8b50;font-weight:400">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token comment" style="color:#999999"># Explicitly add the Memfault SDK, to override the version in the sdk-nrf manifest</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">name</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> modules/lib/memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">firmware</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">revision</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> 1.28.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">remote</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">self</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> my_example_application</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><br></span></code></pre></div></div>
<p>Zephyr's <code>west</code> tool will use the explicitly listed version of the
<code>memfault-firmware-sdk</code> module instead of the one specified by the
<code>nrf-connect-sdk</code> module. Reference:</p>
<ul>
<li class=""><a href="https://docs.zephyrproject.org/latest/develop/west/manifest.html#example-1-3-downstream-of-a-zephyr-release-with-module-fork" target="_blank" rel="noopener noreferrer" class="">https://docs.zephyrproject.org/latest/develop/west/manifest.html#example-1-3-downstream-of-a-zephyr-release-with-module-fork</a></li>
</ul>
<p>After updating the West Manifest, run 👉<code>west update</code>👈 to pull in the Memfault
SDK. Double check that you see the SDK source folder <code>memfault-firmware-sdk</code>
under <code>modules/lib/</code>. You can manually check the version of the SDK with the
following command (run from the West workspace root):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># open the Memfault Firmware SDK commit in the default web browser:</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">❯ open https://github.com/memfault/memfault-firmware-sdk/commit/$(git -C modules/lib/memfault-firmware-sdk rev-parse HEAD)</span><br></span></code></pre></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Details on Recommended Zephyr Workspace Topology </summary><div><div class="collapsibleContent_i85q"><p>Memfault recommends using the
<a href="https://docs.zephyrproject.org/latest/develop/west/workspaces.html#t2-star-topology-application-is-the-manifest-repository" target="_blank" rel="noopener noreferrer" class="">T2 topology</a>
where the project or application is the manifest repository. An example
directory structure for this kind of workspace is:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west-workspace/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .venv</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .west</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── bootloader</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── modules</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── project-dir (manifest repository)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── .git</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│       └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; └── west.yml</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── test</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── tools</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── zephyr</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Note that in this structure, any number of applications can live in
<code>project-dir</code>. This works well for any projects that use a monorepo where
sources for multiple firmware targets live, and they can share dependencies
controlled via <code>west</code> (e.g. <code>zephyr</code>). In this case, the directory structure
would be:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west-workspace/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .venv</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── .west</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── bootloader</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── modules</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── project-dir (manifest repository)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── .git</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; ├── app1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   |   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |      └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   ├── app2</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|   |   ├── CMakeLists.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── prj.conf</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |   ├── src/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│   |       └── main.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">│&nbsp;&nbsp; └── west.yml</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── test</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── tools</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── zephyr</span><br></span></code></pre></div></div></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="generating-sbom-software-bill-of-materials">Generating a Software Bill of Materials (SBOM)<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#generating-sbom-software-bill-of-materials" class="hash-link" aria-label="Direct link to Generating a Software Bill of Materials (SBOM)" title="Direct link to Generating a Software Bill of Materials (SBOM)" translate="no">​</a></h3>
<p>Follow the guide here to generate an SBOM for your NCS project:</p>
<p><a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/scripts/west_commands/sbom/README.html" target="_blank" rel="noopener noreferrer" class="">https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/scripts/west_commands/sbom/README.html</a></p>
<p>Specifically, after setting up the <code>ncs-sbom</code> west command and building your
project, run this command to generate an SBOM in SPDX format:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">west ncs-sbom -d build --output-spdx sbom.spdx</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This command can take several minutes to complete (&gt;15 minutes) depending on the
size of your project and the number of dependencies.</p></div></div>
<p>The <code>.spdx</code> file can then be uploaded to Memfault's
<a class="" href="https://docs.memfault.com/docs/platform/sbom">SBOM management system</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ncs-vs-zephyr">What is the advantage of using the Nordic Connect SDK (NCS) instead of stock Zephyr?<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#ncs-vs-zephyr" class="hash-link" aria-label="Direct link to What is the advantage of using the Nordic Connect SDK (NCS) instead of stock Zephyr?" title="Direct link to What is the advantage of using the Nordic Connect SDK (NCS) instead of stock Zephyr?" translate="no">​</a></h3>
<p>While Zephyr is a powerful RTOS and is used at the base operating system with
the Nordic Connect SDK, using the NCS directly offers several advantages for
developers targeting Nordic MCUs:</p>
<ul>
<li class="">
<p><strong>Optimized Memfault Integration</strong>: Nordic and Memfault collaborate closely to
ensure seamless integration between NCS and Memfault. This collaboration helps
ensure that the latest Memfault compatibility features are promptly
incorporated into the NCS releases.</p>
</li>
<li class="">
<p><strong>Simplified Memfault Implementation</strong>: The NCS provides built-in support for
Memfault, making integration straightforward and requiring minimal development
effort. This allows developers to quickly leverage Memfault's debugging and
remote monitoring capabilities within their nRF MCU projects.</p>
</li>
<li class="">
<p><strong>Hardware Compatibility</strong>: Nordic rigorously tests and validates the NCS for
compatibility with their hardware platforms. This reduces the risk of
encountering unforeseen hardware-specific issues when developing for nRF MCUs.</p>
</li>
<li class="">
<p><strong>Up-to-date Zephyr Base</strong>: Nordic maintains the NCS by regularly
incorporating updates from the mainline Zephyr project. This ensures
developers benefit from the latest Zephyr features and bug fixes when using
the NCS. Typically, the NCS releases occur 2-4 times per year.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-a-project-key-required-for-devices-that-have-their-chunks-uploaded-by-an-upstream-device">Is a Project Key required for devices that have their chunks uploaded by an upstream device?<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#is-a-project-key-required-for-devices-that-have-their-chunks-uploaded-by-an-upstream-device" class="hash-link" aria-label="Direct link to Is a Project Key required for devices that have their chunks uploaded by an upstream device?" title="Direct link to Is a Project Key required for devices that have their chunks uploaded by an upstream device?" translate="no">​</a></h3>
<p><code>CONFIG_MEMFAULT_NCS_PROJECT_KEY</code> is optional in nRF Connect SDK &gt;=v3.0.0 for
any device that does not use MDS or the Memfault HTTP client to upload chunks to
the Memfault cloud, and instead relies on an upstream device to forward data.
For nRF Connect SDK &lt; v3.0.0, a non-zero Project Key is required even if it is
not used. Set it to a dummy string such as <code>"unset"</code> to avoid a compiler error.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-i-override-the-ncs-definition-of-memfault_metrics_heartbeat_collect_data-in-order-to-add-custom-metric-collection-at-the-end-of-a-heartbeat-interval">How do I override the NCS definition of <code>memfault_metrics_heartbeat_collect_data()</code> in order to add custom metric collection at the end of a heartbeat interval?<a href="https://docs.memfault.com/embed/mcu/nordic-nrf-connect-sdk-guide#how-do-i-override-the-ncs-definition-of-memfault_metrics_heartbeat_collect_data-in-order-to-add-custom-metric-collection-at-the-end-of-a-heartbeat-interval" class="hash-link" aria-label="Direct link to how-do-i-override-the-ncs-definition-of-memfault_metrics_heartbeat_collect_data-in-order-to-add-custom-metric-collection-at-the-end-of-a-heartbeat-interval" title="Direct link to how-do-i-override-the-ncs-definition-of-memfault_metrics_heartbeat_collect_data-in-order-to-add-custom-metric-collection-at-the-end-of-a-heartbeat-interval" translate="no">​</a></h3>
<p>NCS provides an implementation of <code>memfault_metrics_heartbeat_collect_data()</code> to
collect built-in BLE, stack, and LTE metrics. In NCS versions &gt;=2.6.0, users
can set <code>CONFIG_MEMFAULT_NCS_IMPLEMENT_METRICS_COLLECTION=n</code> to define their own
version of this function, and call into the NCS API to still do NCS metric
aggregation:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">memfault_platform_port.c</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault_ncs_metrics.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_metrics_heartbeat_collect_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Set custom metric values</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Call NCS metric collection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_ncs_metrics_collect_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>For NCS versions &lt;2.6.0, wrap a function in the Memfault SDK that's called
just after <code>memfault_metrics_heartbeat_collect_data()</code>. In your <code>CMakelists.txt</code>
file add:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">zephyr_ld_options(-Wl,--wrap=memfault_metrics_heartbeat_serialize)</span><br></span></code></pre></div></div>
<p>Then, provide the wrapping:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">memfault_platform_port.c</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Wrap a function that's called just after memfault_metrics_heartbeat_collect_data(),</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! to enable collecting custom metrics during heartbeat collection.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">extern</span><span class="token plain"> bool </span><span class="token function" style="color:#79b6f2">__real_memfault_metrics_heartbeat_serialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> sMemfaultEventStorageImpl </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">storage_impl</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">__wrap_memfault_metrics_heartbeat_serialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> sMemfaultEventStorageImpl </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">storage_impl</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Set custom metric values</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">__real_memfault_metrics_heartbeat_serialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">storage_impl</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[DA1469x SDK Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/da1469x-sdk-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide"/>
        <updated>2022-08-08T07:40:08.000Z</updated>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>In this guide we will walk through the steps for integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
a project using Dialog's
<a href="https://www.dialog-semiconductor.com/products/bluetooth-low-energy/da1469x" target="_blank" rel="noopener noreferrer" class="">DA1469x product family</a>.
The integration has been tested against the "DA1469x SDK10.0.10.118" release.</p>
<p>Upon completion of the integration, the following subcomponents will be added to
your system!</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/reboot-reason-tracking">Reboot Reasons</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" class="image_e9uR" alt=""></a></figure>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/trace-events">Trace Events</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" class="image_e9uR" alt=""></a></figure>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/coredumps">RAM-backed stack dump Collection</a></li>
</ul>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" class="image_e9uR" alt=""></a></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-steps">Integration Steps<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#integration-steps" class="hash-link" aria-label="Direct link to Integration Steps" title="Direct link to Integration Steps" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>This tutorial assumes you have a working
<a href="https://www.dialog-semiconductor.com/products/bluetooth-low-energy/da1469x#tab-field_tab_content_resources" target="_blank" rel="noopener noreferrer" class="">DA1469x</a>
environment and are able to flash a board supported by the SDK.</p></div></div>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="clone-memfault-firmware-sdk-into-middleware">Clone memfault-firmware-sdk into middleware<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#clone-memfault-firmware-sdk-into-middleware" class="hash-link" aria-label="Direct link to Clone memfault-firmware-sdk into middleware" title="Direct link to Clone memfault-firmware-sdk into middleware" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cd ${DA1469X_SDK_ROOT}/sdk/middleware</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mkdir -p memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cd memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">git clone https://github.com/memfault/memfault-firmware-sdk.git</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="apply-patches-to-da1469x-sdk">Apply patches to DA1469x SDK<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#apply-patches-to-da1469x-sdk" class="hash-link" aria-label="Direct link to Apply patches to DA1469x SDK" title="Direct link to Apply patches to DA1469x SDK" translate="no">​</a></h3>
<p>There are a few small patches that need to be applied to the Dialog SDK.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cd ${DA1469X_SDK_ROOT}</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">patch -p1 &lt; ./sdk/middleware/memfault/memfault-firmware-sdk/ports/dialog/da1469x/gnu-build-id.patch</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">patch -p1 &lt; ./sdk/middleware/memfault/memfault-firmware-sdk/ports/dialog/da1469x/freertos-config.patch</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">patch -p1 &lt; ./sdk/middleware/memfault/memfault-firmware-sdk/ports/dialog/da1469x/fault-handlers.patch</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>When running the <code>patch</code> command in Windows environments you may see warning
messages like the following which can be safely ignored:</p><blockquote>
<p>(Stripping trailing CRs from patch; use --binary to disable.)</p>
<p>patch unexpectedly ends in middle of line</p>
</blockquote></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-memfault-configuration-files">Create Memfault configuration files<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#create-memfault-configuration-files" class="hash-link" aria-label="Direct link to Create Memfault configuration files" title="Direct link to Create Memfault configuration files" translate="no">​</a></h3>
<p>You will need to create Memfault configuration files. These will be used later
to customize the Memfault SDK.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Navigate to same directory with other configs, i.e custom_config_qspi.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cd ${YOUR_PROJECT_ROOT}/config/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch memfault_platform_config.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch memfault_trace_reason_user_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">touch memfault_metrics_heartbeat_config.def</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-memfault-firmware-sdk-to-build">Add memfault-firmware-sdk to build<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#add-memfault-firmware-sdk-to-build" class="hash-link" aria-label="Direct link to Add memfault-firmware-sdk to build" title="Direct link to Add memfault-firmware-sdk to build" translate="no">​</a></h3>
<p>The memfault-firmware-sdk includes a script for easily adding all sources,
includes, and necessary compiler flags to a project.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python ./sdk/middleware/memfault/memfault-firmware-sdk/scripts/eclipse_patch.py -p ${YOUR_PROJECT_ROOT} -m sdk/middleware/memfault/memfault-firmware-sdk --target-port dialog/da1469x</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>After running the script, be sure to right click on the project in SmartSnippets
Studio and select "Refresh" to pick up the changes.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-dialog-custom_config-setup">Update Dialog custom_config setup<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#update-dialog-custom_config-setup" class="hash-link" aria-label="Direct link to Update Dialog custom_config setup" title="Direct link to Update Dialog custom_config setup" translate="no">​</a></h3>
<p>Navigate to the custom config you are using for your project (i.e
"custom_config_qspi.h") and update the following settings</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file custom_config_*.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">dg_configUSE_MEMFAULT</span><span class="token macro property" style="color:#5a9bcf">                   </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">dg_configDISABLE_BACKGROUND_FLASH_OPS</span><span class="token macro property" style="color:#5a9bcf">   </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">dg_configRETAINED_UNINIT_SECTION_SIZE</span><span class="token macro property" style="color:#5a9bcf">   </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">192</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Note: configTIMER_TASK_STACK_DEPTH must be &gt;= 256.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// TODO: Check if you already have a definition in your project.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Otherwise, add the line below</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">configTIMER_TASK_STACK_DEPTH</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">256</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Optional: To make use of Dialog debug console logging add:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">CONFIG_RETARGET</span><span class="token macro property" style="color:#5a9bcf">  </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-memfault-platform-config">Update Memfault Platform Config<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#update-memfault-platform-config" class="hash-link" aria-label="Direct link to Update Memfault Platform Config" title="Direct link to Update Memfault Platform Config" translate="no">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! @file memfault_platform_config.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_PLATFORM_COREDUMP_STORAGE_USE_FLASH</span><span class="token macro property" style="color:#5a9bcf">    </span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Note: The default location coredumps are saved is NVMS log storage.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// This size can be adjusted depending on the amount of RAM regions collected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// in memfault_platform_coredump_get_regions()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_PLATFORM_COREDUMP_STORAGE_MAX_SIZE_BYTES</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">32</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression operator" style="color:#d7deea">*</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">1024</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_USE_GNU_BUILD_ID</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// TODO: Navigate to "Project" → "Settings" in the Memfault cloud UI (https://app.memfault.com/)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// and copy the "Project Key" here!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_PROJECT_KEY</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">""</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-memfault_platform_get_device_info">Implement memfault_platform_get_device_info<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#implement-memfault_platform_get_device_info" class="hash-link" aria-label="Direct link to Implement memfault_platform_get_device_info" title="Direct link to Implement memfault_platform_get_device_info" translate="no">​</a></h3>
<p>Implement the following function in your project. When an issue or metric is
captured, this is the metadata that Memfault will collect alongside it and
display in the UI.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/core/platform/device_info.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_device_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// !FIXME: Populate with platform device information</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// *NOTE* All fields must be populated, and the values assigned to the fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// must have static lifetime: the data is accessed when this function returns.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// In this example, the fields are string literals, which are placed either</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// inline into .text data tables, or in .rodata, and the pointers are valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// for the lifetime of the program</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// See https://mflt.io/version-nomenclature for more context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device serial to a unique value.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It is typically set to a unique identifier like a serial number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// or MAC address.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to de-deduplicate data in Memfault cloud</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">device_serial </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"DEMOSERIAL"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It can be simply "app" for a single-chip device, otherwise it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// should match the component name, eg "ble", "sensor" etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_type </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"app-main"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software version.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// If using Memfault OTA, this should exactly match the OTA Release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Version name for the installed image</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"1.0.0-dev"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device hardware revision.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter/group devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">hardware_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"evt"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-memfault">Initialize Memfault<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#initialize-memfault" class="hash-link" aria-label="Direct link to Initialize Memfault" title="Direct link to Initialize Memfault" translate="no">​</a></h3>
<p>On bootup, make a call to <code>memfault_platform_boot()</code> to start the Memfault
subsystem. We recommend doing this from <code>system_init()</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">system_init</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">pvParameters </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">if</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">defined CONFIG_RETARGET</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token function" style="color:#79b6f2">retarget_init</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">endif</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">// Note: initialize Memfault after retarget_init() so logs will be displayed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token function" style="color:#79b6f2">memfault_platform_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="confirm-project-builds">Confirm Project builds<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#confirm-project-builds" class="hash-link" aria-label="Direct link to Confirm Project builds" title="Direct link to Confirm Project builds" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If your project is based on a template from the Dialog SDK, you also need to
remove the <code>vApplicationStackOverflowHook</code> implementation. The Memfault SDK
implements this function and will automatically capture a coredump with full
stack traces when a stack overflow takes place.</p></div></div>
<p>At this point, your project should compile and be able to boot. On startup, if
you have logging enabled, you should see some messages like the following print
when <code>memfault_platform_boot()</code> is called:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: GNU Build ID: 6e6843f5f7410e0a51a0e62ce991fdd0d519eca7</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: S/N: DEMOSERIAL</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW type: da1469x-demo-app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: HW version: DA14695</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-transport">Data Transport<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#data-transport" class="hash-link" aria-label="Direct link to Data Transport" title="Direct link to Data Transport" translate="no">​</a></h2>
<p>With data collection in place, the final step is to push data to the Memfault
cloud for analysis.</p>
<p>Extensive details about how data from the Memfault SDK makes it to the cloud can
be found <a class="" href="https://docs.memfault.com/docs/mcu/data-from-firmware-to-the-cloud">in the data transport guide</a>. In
short, all data is published via the same "chunk" REST
<a href="https://api-docs.memfault.com/?version=latest#66b0e390-2c3e-4c0d-b6c2-836a287b9e5f" target="_blank" rel="noopener noreferrer" class="">endpoint</a>.</p>
<p>When sending data over Bluetooth Low Energy, the Memfault Diagnostic GATT
Service (MDS) can be used.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-memfault-diagnostic-gatt-service">Initialize Memfault Diagnostic GATT Service<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#initialize-memfault-diagnostic-gatt-service" class="hash-link" aria-label="Direct link to Initialize Memfault Diagnostic GATT Service" title="Direct link to Initialize Memfault Diagnostic GATT Service" translate="no">​</a></h3>
<p>For the DA1469x, a port for the MDS is provided with the memfault-firmware-sdk.
To add the service to your project, simply add a call to <code>mds_boot()</code> from the
area of your code which is responsible for registering GATT services, i.e</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/ports/ble/mds.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">your_ble_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">ble_peripheral_start</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">mds_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verification-tuning-steps">Verification &amp; Tuning Steps<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#verification-tuning-steps" class="hash-link" aria-label="Direct link to Verification &amp; Tuning Steps" title="Direct link to Verification &amp; Tuning Steps" translate="no">​</a></h2>
<p>With Memfault compiling into your build and a Bluetooth Low Energy transport set
up, it's now time to add some initial instrumentation, and test the integration!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-first-trace-event">Define First Trace Event<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#define-first-trace-event" class="hash-link" aria-label="Direct link to Define First Trace Event" title="Direct link to Define First Trace Event" translate="no">​</a></h3>
<p>Trace events are used for generating alerts in the Memfault UI when unexpected
events are encountered. Let's start by creating a generic type for critical
errors that have been detected.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token operator" style="color:#d7deea">--</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain"> a</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">config</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">memfault_trace_reason_user_config</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">++</span><span class="token operator" style="color:#d7deea">+</span><span class="token plain"> b</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">config</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">memfault_trace_reason_user_config</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">@@ </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">+</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> @@</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">+</span><span class="token function" style="color:#79b6f2">MEMFAULT_TRACE_REASON_DEFINE</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">critical_error</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-first-heartbeat-metric">Define First Heartbeat Metric<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#define-first-heartbeat-metric" class="hash-link" aria-label="Direct link to Define First Heartbeat Metric" title="Direct link to Define First Heartbeat Metric" translate="no">​</a></h3>
<p>Heartbeat metrics allow you to easily monitor your platform and confirm it is
operating as expected.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Typical Heartbeat Examples</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">investigate problems that didn't cause a reboot (bad connectivity, network or
sensor error rates) and marginality that crops up in a fleet</li>
<li class="">providing leading indicators of problems (rapid battery drain, drop in
activity, etc)</li>
<li class="">compare trends across releases (improved connectivity, data efficiency etc)</li>
</ul><p>Best Practices around each metric type that we recommend:</p><ul>
<li class="">Timers - These are used to track time spent in particular states and can be
used for debugging connectivity, battery life, and performance issues.</li>
<li class="">Counters - Track counts of a particular event class taking place. Suggested
use cases are:<!-- -->
<ul>
<li class="">Operations your system are performing (number of events serviced by a task,
bytes sent over network, bytes written to flash). Alerts can be configured
to identify devices operating outside normal thresholds.</li>
<li class="">Counts of events for events that should never happen (i2c bus write error
count, flash write error). You can alert if any of these situations are
seen.</li>
</ul>
</li>
<li class="">Gauges - These are values sampled at the end of each Heartbeat interval.
Common items include<!-- -->
<ul>
<li class="">Battery Metrics (Drop over an hour, current percent)</li>
<li class="">Heap utilization / stack high watermark</li>
</ul>
</li>
</ul></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-metric-to-memfault_metrics_heartbeat_configdef">Add Metric to memfault_metrics_heartbeat_config.def<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#add-metric-to-memfault_metrics_heartbeat_configdef" class="hash-link" aria-label="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" title="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_metrics_heartbeat_config.def</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_METRICS_KEY_DEFINE</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> kMemfaultMetricType_Unsigned</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="instrument-code-to-update-heartbeat">Instrument Code to Update Heartbeat<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#instrument-code-to-update-heartbeat" class="hash-link" aria-label="Direct link to Instrument Code to Update Heartbeat" title="Direct link to Instrument Code to Update Heartbeat" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">my_main_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">your_rtos_wait_for_event</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">MEMFAULT_METRIC_ADD</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-test-commands-to-cli">Add Test Commands to CLI<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#add-test-commands-to-cli" class="hash-link" aria-label="Direct link to Add Test Commands to CLI" title="Direct link to Add Test Commands to CLI" translate="no">​</a></h3>
<p>The Memfault SDK functionality can be easily exercised via CLI test commands.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If your platform does not have a CLI, these commands can also be wired up to a
button press or called from <code>main()</code> on bootup from a test image</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-platform-ports">Test platform ports<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#test-platform-ports" class="hash-link" aria-label="Direct link to Test platform ports" title="Direct link to Test platform ports" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_logging</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Debug log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Info log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Warning log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Error log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Runs a sanity test to confirm coredump port is working as expected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_coredump_storage</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Note: Coredump saving runs from an ISR prior to reboot so should</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// be safe to call with interrupts disabled.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_disable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_begin</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_enable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_finish</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-core-sdk-functionality">Test core SDK functionality<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#test-core-sdk-functionality" class="hash-link" aria-label="Direct link to Test core SDK functionality" title="Direct link to Test core SDK functionality" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Triggers an immediate heartbeat capture (instead of waiting for timer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// to expire)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_heartbeat</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_metrics_heartbeat_debug_trigger</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_trace</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_TRACE_EVENT_WITH_LOG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">critical_error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"A test error trace!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Trigger a user initiated reboot and confirm reason is persisted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_mark_reset_imminent</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">kMfltRebootReason_UserReset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-different-crash-types-where-a-coredump-should-be-captured">Test different crash types where a coredump should be captured<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#test-different-crash-types-where-a-coredump-should-be-captured" class="hash-link" aria-label="Direct link to Test different crash types where a coredump should be captured" title="Direct link to Test different crash types where a coredump should be captured" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_assert</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_fault</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">bad_func</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token number" style="color:#5a9bcf">0xEEEEDEAD</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">bad_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_hang</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dump Memfault data collected to console</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_export</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-web-bluetooth">Post Data to Cloud via Web Bluetooth<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#post-data-to-cloud-via-web-bluetooth" class="hash-link" aria-label="Direct link to Post Data to Cloud via Web Bluetooth" title="Direct link to Post Data to Cloud via Web Bluetooth" translate="no">​</a></h3>
<p>Data can be extracted over Bluetooth by implementing a MDS GATT Client in your
gateway.</p>
<p>Memfault chunks can also easily be forwarded using
<a href="https://web.dev/bluetooth/" target="_blank" rel="noopener noreferrer" class="">Web Bluetooth</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>For Web Bluetooth support on some versions of Linux and Windows, you need to
navigate to
<a href="chrome://flags#enable-experimental-web-platform-feature" target="_blank" rel="noopener noreferrer" class="">chrome://flags#enable-experimental-web-platform-features</a>
and enable "Experimental Web Platform Features". More details can be found
<a href="https://www.chromestatus.com/feature/5264933985976320" target="_blank" rel="noopener noreferrer" class="">in the Chrome documentation</a>.</p></div></div>
<p>To try it out, simply:</p>
<ul>
<li class="">Open or install a recent version of the
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer" class="">Google Chrome Browser</a></li>
<li class="">Make sure your Bluetooth LE device is advertising</li>
<li class="">Navigate to the Memfault Diagnostic Web Bluetooth App at
<a href="https://mflt.io/mds" target="_blank" rel="noopener noreferrer" class="">https://mflt.io/mds</a>, click "Connect", and select your
device.</li>
<li class="">Upon connection any data already collected by the memfault-firmware-sdk will
be immediately sent and forwarded to Memfault for analysis. While connected,
new data will be periodically flushed to Memfault. The default interval data
is checked for is every 60 seconds and can be adjusted by adding
<code>MDS_POLL_INTERVAL_MS</code> to your <code>memfault_platform_config.h</code>.</li>
</ul>
<p>For development purposes, data can also be extracted and posted via a CLI or GDB
connection. More details can be found below.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Post Chunks via Local Debug Setup </summary><div><div class="collapsibleContent_i85q"><br><p>Prior to having an end-to-end transport in place, Memfault data can be exported
over any serial connection or via GDB directly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-to-memfault">Post Chunks To Memfault<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#post-chunks-to-memfault" class="hash-link" aria-label="Direct link to Post Chunks To Memfault" title="Direct link to Post Chunks To Memfault" translate="no">​</a></h4>
<p>All data collected by Memfault can be exported as opaque packets called
"chunks". To trigger an export, call the <code>test_export</code> command added to your
device CLI.</p>
<p>If data has been collected, you will see strings with the format:
<code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:01] INFO: System Booting!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:02] INFO: Memfault Build ID: d8d6a047282f025fffa29fa767100f310bc40f80</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Copy the logs from the console, navigate to the
<a href="https://mflt.io/chunks-debug" target="_blank" rel="noopener noreferrer" class="">"Integration Hub / Chunks Debug"</a> view for your
project, and paste the logs:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Next" to review the chunks that were identified and (optionally) update
the "Device Serial" being used to report data:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Post" to submit the chunks to Memfault. The chunks will appear in the
view directly below. Check and make sure there are no "Errors" to address.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" class="image_e9uR"></a></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-automate-chunk-posting">(Optional) Automate Chunk Posting<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#optional-automate-chunk-posting" class="hash-link" aria-label="Direct link to (Optional) Automate Chunk Posting" title="Direct link to (Optional) Automate Chunk Posting" translate="no">​</a></h4>
<p>Posting chunks from a local setup can be automated using our CLI tool or GDB
script.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This strategy can also be used even when an end-to-end transport is in place for
local QA testing or in CI/CD test automation setups.</p></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Automated Posting Options </summary><div><div class="collapsibleContent_i85q"><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite-project-key-from-memfault-ui">Prerequisite: Project Key from Memfault UI<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#prerequisite-project-key-from-memfault-ui" class="hash-link" aria-label="Direct link to Prerequisite: Project Key from Memfault UI" title="Direct link to Prerequisite: Project Key from Memfault UI" translate="no">​</a></h5><p>A Project key will be needed in order to communicate with Memfault's web
services. Go to <a href="https://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">https://app.memfault.com/</a>, navigate
to the project you want to use and select 'Settings'→'General'. The 'Project
Key' listed is what you will want to use.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With Desktop CLI Tool </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-the-python-memfault-cli-tool">Install the Python Memfault CLI Tool<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#install-the-python-memfault-cli-tool" class="hash-link" aria-label="Direct link to Install the Python Memfault CLI Tool" title="Direct link to Install the Python Memfault CLI Tool" translate="no">​</a></h3>
<p>The <a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault Desktop CLI tool</a>. tool is written
in Python and published publicly in the
<a href="https://pypi.org/project/memfault-cli/" target="_blank" rel="noopener noreferrer" class="">Python Package Index (pypi)</a>.</p>
<p>To install it, make sure you have a recent version of Python 3.x installed and
run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ pip3 install memfault-cli</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --help</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="save-device-logs-to-file">Save device logs to file<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#save-device-logs-to-file" class="hash-link" aria-label="Direct link to Save device logs to file" title="Direct link to Save device logs to file" translate="no">​</a></h3>
<p>Start your console with your favorite terminal client. Let the system run for a
bit, periodically dumping data to the console by calling
<code>memfault_data_export_dump_chunks()</code>.</p>
<p>You should see strings with the format: <code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command recording a reboot reason, then rebooting the system</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] GNU Build ID: 3c92e3313fe1c9d00ac8687ce966d5f527a05ed3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] S/N: freertos-example</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW type: qemu-app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] HW version: qemu-mps2-an385</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command capturing a trace event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks()`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Save the resulting logs to a file such as <code>logs.txt</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-from-logs-with-memfault-cli">Post chunks from logs with Memfault CLI<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#post-chunks-from-logs-with-memfault-cli" class="hash-link" aria-label="Direct link to Post chunks from logs with Memfault CLI" title="Direct link to Post chunks from logs with Memfault CLI" translate="no">​</a></h3>
<p>Run the desktop Memfault CLI tool on your saved log file. The utility will parse
the logs, extract the Memfault data, and post it for processing!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --project-key ${YOUR_PROJECT_KEY} post-chunk --encoding sdk_data_export logs.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Found 2 Chunks. Sending Data ...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Success</span><br></span></code></pre></div></div></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With GDB </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">You need to have a way to debug your product with GDB as part of your
development setup</li>
<li class="">The GDB version you are using needs to have the
<a href="https://interrupt.memfault.com/blog/automate-debugging-with-gdb-python-api#getting-started-with-gdb-python" target="_blank" rel="noopener noreferrer" class="">GDB Python API enabled</a>.
(It's generally the default or there is a <code>-py</code> version of GDB which has it
included.)</li>
<li class="">You need to compile your firmware with debug symbol information (i.e <code>-g</code>
CFLAG)</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Even if you are using other compilers such as ARMCC or IAR, you can load the ELF
(.out, .elf) generated and debug it in GDB as well.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launch-gdb-and-connect-debugger">Launch GDB and connect debugger<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#launch-gdb-and-connect-debugger" class="hash-link" aria-label="Direct link to Launch GDB and connect debugger" title="Direct link to Launch GDB and connect debugger" translate="no">​</a></h3>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ arm-none-eabi-gdb-py my_app.elf --ex="target remote :3333"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-memfault-gdb-script">Load Memfault GDB script<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#load-memfault-gdb-script" class="hash-link" aria-label="Direct link to Load Memfault GDB script" title="Direct link to Load Memfault GDB script" translate="no">​</a></h3>
<p>Copy and paste and run the following in gdb:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python exec('try:\n from urllib2 import urlopen\nexcept:\n from urllib.request import urlopen'); exec(urlopen('https://app.memfault.com/static/scripts/memfault_gdb.py').read())</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Some GDB versions do not support Python scripting by default. If you see a
message like "Python scripting is not supported in this copy of GDB", you might
be able to run an alternative GDB binary with a -py suffix, for example
arm-none-eabi-gdb-py.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-handler">Register Handler<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#register-handler" class="hash-link" aria-label="Direct link to Register Handler" title="Direct link to Register Handler" translate="no">​</a></h3>
<p>Copy the command below and paste it into GDB and hit enter. This will load a
handler which automatically posts data to Memfault whenever
<code>memfault_data_export_dump_chunks</code> is called.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault install_chunk_handler --verbose --project-key &lt;YOUR_PROJECT_KEY&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>memfault_data_export_dump_chunks()</code> needs to be called by your port as part of
a CLI command or periodic task in order for the data to be extracted. For
example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">export_data_cli_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">some_periodic_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try It Out!<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#try-it-out" class="hash-link" aria-label="Direct link to Try It Out!" title="Direct link to Try It Out!" translate="no">​</a></h3>
<p>Now, every time <code>memfault_data_export_dump_chunks</code> is called, the data passed as
a parameter to the function will automatically be posted to the Memfault cloud.
You don't have to do anything else! You will see logs print in the gdb CLI as
data is posted:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb) Continuing.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 45 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 53 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[...]</span><br></span></code></pre></div></div></div></div></details></div></div></details></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>If you encounter any issues in your data transfer implementation, Memfault has tools to help debug!</p><ul><li>To troubleshoot data not getting uploaded or processed correctly by the Memfault cloud, take a look at the<!-- --> <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/integration-hub/processing-log"> <!-- -->Integration Hub → Processing Log<!-- --> </a> <!-- -->view. This provides a filterable, chronological view of recent errors that have occurred while processing received data. See<!-- --> <a href="https://docs.memfault.com/docs/platform/integration-hub">this documentation page</a> <!-- -->for more information on the Integration Hub.</li><li>A view you can use to<a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint#troubleshooting">view the raw "Chunk" data payloads</a>that have arrived for your project.</li><li><a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint">Precanned Data Payloads</a> <!-- -->you can pass through your `user_transport_send_chunk_data()` implementation to test data transfer in isolation.</li><li>Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</li></ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/da1469x-sdk-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h3>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ModusToolbox™ SDK for PSoC™ 6]]></title>
        <id>https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide"/>
        <updated>2022-08-07T17:52:26.000Z</updated>
        <content type="html"><![CDATA[<p>This tutorial will go over integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
a PSoC™ 6 project using Infineon's ModusToolbox™ Software SDK.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Note: these instructions were written using ModusToolbox™ release <code>v3.0</code> and
tested against the
<a href="https://www.infineon.com/cms/en/product/evaluation-boards/cy8ckit-062s2-43012/" target="_blank" rel="noopener noreferrer" class=""><code>CY8CKIT-062S2-43012</code></a>
evaluation board.</p><p>These instructions should also apply to any other Infineon PSoC™ 6 family board.</p><p>A full example project targeting the <code>CY8CKIT-062S2-43012</code> development board can
be found at
<a href="https://github.com/memfault/mtb-example-memfault" target="_blank" rel="noopener noreferrer" class="">https://github.com/memfault/mtb-example-memfault</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>This document describes how to integrate the Memfault SDK into a Infineon
ModusToolbox™ based project.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite">Prerequisite<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#prerequisite" class="hash-link" aria-label="Direct link to Prerequisite" title="Direct link to Prerequisite" translate="no">​</a></h3>
<p>This guide assumes you already have an application running on a PSoC™ 6
development board. At a high level, this will require the following steps.</p>
<ol>
<li class="">
<p>Download ModusToolbox™ Software SDK from Infineon.</p>
</li>
<li class="">
<p>Generate a sample project from that SDK. This can be done from the IDE or
using the <code>project-creator-cli</code> binary. This can typically be found in the
ModusToolbox™ installation directory, such as
<code>/Applications/ModusToolbox/tools_3.0</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">project-creator-cli --board-id CY8CKIT-062S2-43012 \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    --app-id  mtb-example-anycloud-udp-server      \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    --user-app-name my_example_app</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Compile and program application on development board, i,e</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ cd my_example_app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ make getlibs</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ make build -j8</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ make program</span><br></span></code></pre></div></div>
</li>
</ol>
<p>For further documentation about ModusToolbox™ and how to use it, check out
<a href="https://www.infineon.com/cms/en/design-support/tools/sdk/modustoolbox-software/" target="_blank" rel="noopener noreferrer" class="">Infineon's website</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrate-the-memfault-sdk">Integrate the Memfault SDK<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#integrate-the-memfault-sdk" class="hash-link" aria-label="Direct link to Integrate the Memfault SDK" title="Direct link to Integrate the Memfault SDK" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-the-memfault-sources-and-build-flags">Add the Memfault Sources and Build Flags<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#add-the-memfault-sources-and-build-flags" class="hash-link" aria-label="Direct link to Add the Memfault Sources and Build Flags" title="Direct link to Add the Memfault Sources and Build Flags" translate="no">​</a></h3>
<ol>
<li class="">
<p>The Memfault SDK is implemented as a ModusToolbox™ middleware library and can
be imported using the "library-manager". To launch the library manager for
your project, either type <code>make modlibs</code> from the command line or click on
"Library Manager" under the tools tab in the IDE. From there, search for
"Memfault Firmware SDK" and click "Update"</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/arm-mtb-library-manager.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/arm-mtb-library-manager.png" class="image_e9uR" alt=""></a></figure>
<p>Alternatively, you can add the library manually by creating
<code>deps/memfault-firmware-sdk.mtb</code> and running <code>make getlibs</code></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ echo 'https://github.com/memfault/memfault-firmware-sdk#0.31.0#$$ASSET_REPO$$/memfault-firmware-sdk/0.31.0' &gt; deps/memfault-firmware-sdk.mtb</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ make getlibs</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add <code>#include "memfault/ports/freertos_trace.h"</code> to your <code>FreeRTOSConfig.h</code>
file. By default ModusToolbox™ will place the file in your projects root
directory.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">diff --git a/FreeRTOSConfig.h b/FreeRTOSConfig.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">index 4718e2a..7fc9a78 100644</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">--- a/FreeRTOSConfig.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+++ b/FreeRTOSConfig.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">@@ -39,6 +39,8 @@</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> #ifndef FREERTOS_CONFIG_H</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> #define FREERTOS_CONFIG_H</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+#include "memfault/ports/freertos_trace.h"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add a unique identifier to project. Memfault will use this to match the
appropriate symbol files to decode information published by the
memfault-firmware-sdk. This requires a modification to your project's
<code>Makefile</code>.</p>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>This step requires the memfault Build ID package in your python environment,
which can be installed with pip:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">pip install mflt-build-id</span><br></span></code></pre></div></div></div></div>
<p>Add the following snippet to the bottom of your project's <code>Makefile</code>:</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999"># Note these must be placed after including the MTB make files as those files define</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># many variables used to define memfault_post_build</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Target/symbol file of the app</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">APP_TARGET_FILE</span><span class="token operator" style="color:#d7deea">=</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MTB_TOOLS__OUTPUT_CONFIG_DIR</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APPNAME</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">.</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MTB_RECIPE__SUFFIX_TARGET</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Program/hex file of the app</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">APP_PROGRAM_FILE</span><span class="token operator" style="color:#d7deea">=</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MTB_TOOLS__OUTPUT_CONFIG_DIR</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APPNAME</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">.</span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MTB_RECIPE__SUFFIX_PROGRAM</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Add additional dependency to hex file to ensure mflt_build_id runs before it is built</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token target symbol variable" style="color:#d7deea">$</span><span class="token target symbol" style="color:#5a9bcf">(APP_PROGRAM_FILE)</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault_post_build</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Custom target to run mflt_build_id after target file is built but before program file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># is built to ensure correct Build ID is included.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token target symbol" style="color:#5a9bcf">memfault_post_build</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APP_TARGET_FILE</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">PYTHON_PATH</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> -m mflt_build_id.__init__ </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APP_TARGET_FILE</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token builtin-target builtin" style="color:#D8DEE9">.PHONY</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault_post_build</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Update Makefile with an additional linker script. Add the following .ld file
to the build. This will enable the collection of all FreeRTOS task state when
a crash takes place.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">diff --git a/Makefile b/Makefile</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">-LDFLAGS=</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+LDFLAGS= -T$(SEARCH_memfault-firmware-sdk)/ports/cypress/psoc6/memfault_bss.ld</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Implement the following dependency functions in your project following the
inline steps below:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">sMfltHttpClientConfig g_mflt_http_client_config </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// retrieve Project Key from: https://mflt.io/project-key</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">api_key </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"YOUR_PROJECT_KEY"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/core/platform/device_info.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_device_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// !FIXME: Populate with platform device information</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// *NOTE* All fields must be populated, and the values assigned to the fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// must have static lifetime: the data is accessed when this function returns.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// In this example, the fields are string literals, which are placed either</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// inline into .text data tables, or in .rodata, and the pointers are valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// for the lifetime of the program</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// See https://mflt.io/version-nomenclature for more context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMemfaultDeviceInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device serial to a unique value.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It is typically set to a unique identifier like a serial number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// or MAC address.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to de-deduplicate data in Memfault cloud</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">device_serial </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"DEMOSERIAL"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software type.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// It can be simply "app" for a single-chip device, otherwise it</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// should match the component name, eg "ble", "sensor" etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_type </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"app-main"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device software version.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// If using Memfault OTA, this should exactly match the OTA Release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Version name for the installed image</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">software_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"1.0.0-dev"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Set the device hardware revision.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// This is used to filter/group devices in the Memfault UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">hardware_version </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"evt"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Initialize Memfault SDK from your <code>main</code> function before starting the
FreeRTOS scheduler</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file main.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vTaskStartScheduler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verification-tuning-steps">Verification &amp; Tuning Steps<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#verification-tuning-steps" class="hash-link" aria-label="Direct link to Verification &amp; Tuning Steps" title="Direct link to Verification &amp; Tuning Steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-test-commands-to-cli">Add Test Commands to CLI<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#add-test-commands-to-cli" class="hash-link" aria-label="Direct link to Add Test Commands to CLI" title="Direct link to Add Test Commands to CLI" translate="no">​</a></h3>
<p>With Memfault compiling into your build, it's now time to add some initial
instrumentation and test the integration! The quickest way to do this is to
extend or add a command line interface.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> For projects that have a CLI expand here for instructions </summary><div><div class="collapsibleContent_i85q"><br><p>The Memfault SDK functionality can be easily exercised via CLI test commands.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If your platform does not have a CLI, these commands can also be wired up to a
button press or called from <code>main()</code> on bootup from a test image</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-platform-ports">Test platform ports<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#test-platform-ports" class="hash-link" aria-label="Direct link to Test platform ports" title="Direct link to Test platform ports" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_logging</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Debug log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Info log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Warning log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Error log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Runs a sanity test to confirm coredump port is working as expected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_coredump_storage</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Note: Coredump saving runs from an ISR prior to reboot so should</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// be safe to call with interrupts disabled.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_disable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_begin</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_enable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_finish</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-core-sdk-functionality">Test core SDK functionality<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#test-core-sdk-functionality" class="hash-link" aria-label="Direct link to Test core SDK functionality" title="Direct link to Test core SDK functionality" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Triggers an immediate heartbeat capture (instead of waiting for timer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// to expire)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_heartbeat</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_metrics_heartbeat_debug_trigger</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_trace</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_TRACE_EVENT_WITH_LOG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">critical_error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"A test error trace!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Trigger a user initiated reboot and confirm reason is persisted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_mark_reset_imminent</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">kMfltRebootReason_UserReset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-different-crash-types-where-a-coredump-should-be-captured">Test different crash types where a coredump should be captured<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#test-different-crash-types-where-a-coredump-should-be-captured" class="hash-link" aria-label="Direct link to Test different crash types where a coredump should be captured" title="Direct link to Test different crash types where a coredump should be captured" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_assert</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_fault</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">bad_func</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token number" style="color:#5a9bcf">0xEEEEDEAD</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">bad_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_hang</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dump Memfault data collected to console</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_export</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></details>
<p>If your project does not already have a command line for testing, the memfault
demo CLI can be added for quick verification. To do this, copy the following
into a <code>memfault_cli_task.c</code> and then call <code>memfault_cli_task_start()</code> from your
main routine.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_cli_task.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"cyhal.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"cy_retarget_io.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;FreeRTOS.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;task.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_CLI_TASK_SIZE</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">1024</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_CLI_TASK_PRIORITY</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression number" style="color:#5a9bcf">1</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">prv_send_char</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> c</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">cyhal_uart_putc</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">cy_retarget_io_uart_obj</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> c</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_cli_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">arg</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">cyhal_syspm_lock_deepsleep</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> sMemfaultShellImpl impl </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">send_char </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> prv_send_char</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_demo_shell_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">impl</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> num_bytes </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">cyhal_uart_readable</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">cy_retarget_io_uart_obj</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">num_bytes </span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// Sleep for a little bit if there was not data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">vTaskDelay</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">10</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">continue</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> rx_byte</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// data should be available so we should not need to wait</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> uart_input_timeout_ms </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token class-name" style="color:#FAC863">cy_rslt_t</span><span class="token plain"> result </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">cyhal_uart_getc</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">cy_retarget_io_uart_obj</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">rx_byte</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> uart_input_timeout_ms</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">result </span><span class="token operator" style="color:#d7deea">!=</span><span class="token plain"> CY_RSLT_SUCCESS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Unexpected UART read error: 0x%x"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">result</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">continue</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token function" style="color:#79b6f2">memfault_demo_shell_receive_char</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">rx_byte</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_cli_task_start</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">xTaskCreate</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">memfault_cli_task</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"MFLT CLI"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> MEMFAULT_CLI_TASK_SIZE</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> MEMFAULT_CLI_TASK_PRIORITY</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>At boot, you should now see something like:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Build ID: 7726fbc695f4c50db091746118ad69468e152341</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] S/N: DEMOSERIAL</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW type: app-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW version: 1.0.0-dev</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] HW version: dvt1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Reason, Cy_SysLib_GetResetReason=0x10</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Cause:</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I]  Software Reset</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mflt&gt;</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mflt&gt;</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">help&gt;</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">clear_core: Clear an existing coredump</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">drain_chunks: Flushes queued Memfault data. To upload data see https://mflt.io/posting-chunks-with-gdb</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">export: Export base64-encoded chunks. To upload data see https://mflt.io/chunk-data-export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">get_core: Get coredump info</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">get_device_info: Get device info</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_assert: Trigger memfault assert</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_busfault: Trigger a busfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_hardfault: Trigger a hardfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_memmanage: Trigger a memory management fault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_usagefault: Trigger a usage fault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_log: Writes test logs to log buffer</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_log_capture: Trigger capture of current log buffer contents</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_reboot: Force system reset and track it with a Trace Event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">test_trace: Capture an example Trace Event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">help: Lists all commands</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-local-debug-setup">Post Data to Cloud via Local Debug Setup<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#post-data-to-cloud-via-local-debug-setup" class="hash-link" aria-label="Direct link to Post Data to Cloud via Local Debug Setup" title="Direct link to Post Data to Cloud via Local Debug Setup" translate="no">​</a></h3>
<p>Prior to having an end-to-end transport in place, Memfault data can be exported
over any serial connection or via GDB directly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-to-memfault">Post Chunks To Memfault<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#post-chunks-to-memfault" class="hash-link" aria-label="Direct link to Post Chunks To Memfault" title="Direct link to Post Chunks To Memfault" translate="no">​</a></h4>
<p>All data collected by Memfault can be exported as opaque packets called
"chunks". To trigger an export, call the <code>test_export</code> command added to your
device CLI.</p>
<p>If data has been collected, you will see strings with the format:
<code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:01] INFO: System Booting!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:02] INFO: Memfault Build ID: d8d6a047282f025fffa29fa767100f310bc40f80</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Copy the logs from the console, navigate to the
<a href="https://mflt.io/chunks-debug" target="_blank" rel="noopener noreferrer" class="">"Integration Hub / Chunks Debug"</a> view for your
project, and paste the logs:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Next" to review the chunks that were identified and (optionally) update
the "Device Serial" being used to report data:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Post" to submit the chunks to Memfault. The chunks will appear in the
view directly below. Check and make sure there are no "Errors" to address.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" class="image_e9uR"></a></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-automate-chunk-posting">(Optional) Automate Chunk Posting<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#optional-automate-chunk-posting" class="hash-link" aria-label="Direct link to (Optional) Automate Chunk Posting" title="Direct link to (Optional) Automate Chunk Posting" translate="no">​</a></h4>
<p>Posting chunks from a local setup can be automated using our CLI tool or GDB
script.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This strategy can also be used even when an end-to-end transport is in place for
local QA testing or in CI/CD test automation setups.</p></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Automated Posting Options </summary><div><div class="collapsibleContent_i85q"><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite-project-key-from-memfault-ui">Prerequisite: Project Key from Memfault UI<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#prerequisite-project-key-from-memfault-ui" class="hash-link" aria-label="Direct link to Prerequisite: Project Key from Memfault UI" title="Direct link to Prerequisite: Project Key from Memfault UI" translate="no">​</a></h5><p>A Project key will be needed in order to communicate with Memfault's web
services. Go to <a href="https://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">https://app.memfault.com/</a>, navigate
to the project you want to use and select 'Settings'→'General'. The 'Project
Key' listed is what you will want to use.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With Desktop CLI Tool </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-the-python-memfault-cli-tool">Install the Python Memfault CLI Tool<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#install-the-python-memfault-cli-tool" class="hash-link" aria-label="Direct link to Install the Python Memfault CLI Tool" title="Direct link to Install the Python Memfault CLI Tool" translate="no">​</a></h3>
<p>The <a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault Desktop CLI tool</a>. tool is written
in Python and published publicly in the
<a href="https://pypi.org/project/memfault-cli/" target="_blank" rel="noopener noreferrer" class="">Python Package Index (pypi)</a>.</p>
<p>To install it, make sure you have a recent version of Python 3.x installed and
run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ pip3 install memfault-cli</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --help</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="save-device-logs-to-file">Save device logs to file<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#save-device-logs-to-file" class="hash-link" aria-label="Direct link to Save device logs to file" title="Direct link to Save device logs to file" translate="no">​</a></h3>
<p>Start your console with your favorite terminal client. Let the system run for a
bit, periodically dumping data to the console by calling
<code>memfault_data_export_dump_chunks()</code>.</p>
<p>You should see strings with the format: <code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command recording a reboot reason, then rebooting the system</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] GNU Build ID: 3c92e3313fe1c9d00ac8687ce966d5f527a05ed3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] S/N: freertos-example</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW type: qemu-app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] HW version: qemu-mps2-an385</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command capturing a trace event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks()`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Save the resulting logs to a file such as <code>logs.txt</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-from-logs-with-memfault-cli">Post chunks from logs with Memfault CLI<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#post-chunks-from-logs-with-memfault-cli" class="hash-link" aria-label="Direct link to Post chunks from logs with Memfault CLI" title="Direct link to Post chunks from logs with Memfault CLI" translate="no">​</a></h3>
<p>Run the desktop Memfault CLI tool on your saved log file. The utility will parse
the logs, extract the Memfault data, and post it for processing!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --project-key ${YOUR_PROJECT_KEY} post-chunk --encoding sdk_data_export logs.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Found 2 Chunks. Sending Data ...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Success</span><br></span></code></pre></div></div></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With GDB </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">You need to have a way to debug your product with GDB as part of your
development setup</li>
<li class="">The GDB version you are using needs to have the
<a href="https://interrupt.memfault.com/blog/automate-debugging-with-gdb-python-api#getting-started-with-gdb-python" target="_blank" rel="noopener noreferrer" class="">GDB Python API enabled</a>.
(It's generally the default or there is a <code>-py</code> version of GDB which has it
included.)</li>
<li class="">You need to compile your firmware with debug symbol information (i.e <code>-g</code>
CFLAG)</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Even if you are using other compilers such as ARMCC or IAR, you can load the ELF
(.out, .elf) generated and debug it in GDB as well.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launch-gdb-and-connect-debugger">Launch GDB and connect debugger<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#launch-gdb-and-connect-debugger" class="hash-link" aria-label="Direct link to Launch GDB and connect debugger" title="Direct link to Launch GDB and connect debugger" translate="no">​</a></h3>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ arm-none-eabi-gdb-py my_app.elf --ex="target remote :3333"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-memfault-gdb-script">Load Memfault GDB script<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#load-memfault-gdb-script" class="hash-link" aria-label="Direct link to Load Memfault GDB script" title="Direct link to Load Memfault GDB script" translate="no">​</a></h3>
<p>Copy and paste and run the following in gdb:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python exec('try:\n from urllib2 import urlopen\nexcept:\n from urllib.request import urlopen'); exec(urlopen('https://app.memfault.com/static/scripts/memfault_gdb.py').read())</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Some GDB versions do not support Python scripting by default. If you see a
message like "Python scripting is not supported in this copy of GDB", you might
be able to run an alternative GDB binary with a -py suffix, for example
arm-none-eabi-gdb-py.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-handler">Register Handler<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#register-handler" class="hash-link" aria-label="Direct link to Register Handler" title="Direct link to Register Handler" translate="no">​</a></h3>
<p>Copy the command below and paste it into GDB and hit enter. This will load a
handler which automatically posts data to Memfault whenever
<code>memfault_data_export_dump_chunks</code> is called.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault install_chunk_handler --verbose --project-key &lt;YOUR_PROJECT_KEY&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>memfault_data_export_dump_chunks()</code> needs to be called by your port as part of
a CLI command or periodic task in order for the data to be extracted. For
example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">export_data_cli_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">some_periodic_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try It Out!<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#try-it-out" class="hash-link" aria-label="Direct link to Try It Out!" title="Direct link to Try It Out!" translate="no">​</a></h3>
<p>Now, every time <code>memfault_data_export_dump_chunks</code> is called, the data passed as
a parameter to the function will automatically be posted to the Memfault cloud.
You don't have to do anything else! You will see logs print in the gdb CLI as
data is posted:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb) Continuing.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 45 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 53 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[...]</span><br></span></code></pre></div></div></div></div></details></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>With ModusToolbox™ your projects symbol files can be found in the <code>build/</code>
directory, i.e.ModusToolbox</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">build</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">CY8CKIT</span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">062</span><span class="token plain">S2</span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">43012</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">Debug</span><span class="token operator" style="color:#d7deea">/</span><span class="token plain">your_application</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">elf</span><br></span></code></pre></div></div></div></div>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>If you encounter any issues in your data transfer implementation, Memfault has tools to help debug!</p><ul><li>To troubleshoot data not getting uploaded or processed correctly by the Memfault cloud, take a look at the<!-- --> <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/integration-hub/processing-log"> <!-- -->Integration Hub → Processing Log<!-- --> </a> <!-- -->view. This provides a filterable, chronological view of recent errors that have occurred while processing received data. See<!-- --> <a href="https://docs.memfault.com/docs/platform/integration-hub">this documentation page</a> <!-- -->for more information on the Integration Hub.</li><li>A view you can use to<a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint#troubleshooting">view the raw "Chunk" data payloads</a>that have arrived for your project.</li><li><a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint">Precanned Data Payloads</a> <!-- -->you can pass through your `user_transport_send_chunk_data()` implementation to test data transfer in isolation.</li><li>Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</li></ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-transport-steps">Data Transport Steps<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#data-transport-steps" class="hash-link" aria-label="Direct link to Data Transport Steps" title="Direct link to Data Transport Steps" translate="no">​</a></h2>
<p>With data collection verified locally, the final step is to push data
automatically to the Memfault cloud for analysis! Check out the two options
below for the one that matches your use case.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-wi-fi-connection-manager-wcm-https">Using Wi-Fi Connection Manager (WCM) &amp; HTTPS<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#using-wi-fi-connection-manager-wcm-https" class="hash-link" aria-label="Direct link to Using Wi-Fi Connection Manager (WCM) &amp; HTTPS" title="Direct link to Using Wi-Fi Connection Manager (WCM) &amp; HTTPS" translate="no">​</a></h3>
<p>If your project makes use of Wi-Fi, data can be posted directly to Memfault
using HTTPS. To enable this functionality, make the following changes:</p>
<ol>
<li class="">
<p>Register Memfault Root certificates with stack</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Load root certificates necessary for talking to Memfault servers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">result </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">cy_tls_load_global_root_ca_certificates</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_ROOT_CERTS_PEM</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_ROOT_CERTS_PEM</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">result </span><span class="token operator" style="color:#d7deea">!=</span><span class="token plain"> CY_RSLT_SUCCESS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"cy_tls_load_global_root_ca_certificates failed! rv=0x%x"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">result</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add periodic call to post data using Memfault HTTP client</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">memfault_http_client_post_chunk</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-other-transport">Post Data to Cloud via Other Transport<a href="https://docs.memfault.com/embed/mcu/arm-infineon-modustoolbox-guide#post-data-to-cloud-via-other-transport" class="hash-link" aria-label="Direct link to Post Data to Cloud via Other Transport" title="Direct link to Post Data to Cloud via Other Transport" translate="no">​</a></h3>
<p>Extensive details about how data from the Memfault SDK makes it to the cloud
<a class="" href="https://docs.memfault.com/docs/mcu/data-from-firmware-to-the-cloud">can be found here</a>. In short, the
Memfault SDK packetizes data into "chunks" that must be pushed to the Memfault
cloud via the
<a href="https://api-docs.memfault.com/?version=latest#66b0e390-2c3e-4c0d-b6c2-836a287b9e5f" target="_blank" rel="noopener noreferrer" class="">chunk REST endpoint</a>.</p>
<p>The Memfault SDK exposes an API that packetizes Memfault data into "chunks".
These "chunks" need to be forwarded to the Memfault Cloud (either directly via
HTTPS or indirectly via a gateway device such as a computer or mobile
application)</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you cannot post data directly using HTTP, no problem at all. In fact, that is
one of the most common configurations. In these setups, data can be proxied from
the MCU to a device which can perform a HTTP request over transports such as
UART, BLE, COAP, LoRa, Zigbee, etc). The size of a "chunk" is fully configurable
and can be tuned to best match your transport requirements. All message
re-assembly is dealt with by Memfault in the cloud.</p></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// buffer to copy chunk data into</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">USER_CHUNK_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> buf_len </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  bool data_available </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_packetizer_get_chunk</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token plain">data_available </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no more data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// send payload collected to chunks endpoint</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">user_transport_send_chunk_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token function" style="color:#79b6f2">memfault_packetizer_data_available</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no new data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// [... user specific logic deciding when &amp; how much data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[NXP MCUXpresso Getting Started Guide for ARM]]></title>
        <id>https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide"/>
        <updated>2022-05-21T16:44:56.000Z</updated>
        <content type="html"><![CDATA[<p>This tutorial will go over integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
an NXP i.MX RT1060 project using NXP's MCUXpresso IDE.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Note: these instructions were written using <code>mcuxpressoide-11.4.0_6224.x86_64</code>
on ubuntu 22.04, using the
<a href="https://www.nxp.com/part/MIMXRT1060-EVKB#/" target="_blank" rel="noopener noreferrer" class="">MIMXRT1060-EVKB</a></p></div></div>
<p>The full example project can be found here:
<a href="https://github.com/memfault/mcuxpresso-rt1060-example" target="_blank" rel="noopener noreferrer" class="">https://github.com/memfault/mcuxpresso-rt1060-example</a></p>
<p>These instructions should also apply to other NXP RT family boards (ex:
MIMXRT1020-EVK), though there may be adjustments needed to the reset logic or
linker script.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>This document describes how to add the Memfault SDK to an MCUXpresso project.
The strategy documented here follows these high-level steps:</p>
<p><strong>Part 1: generate a sample project</strong></p>
<ol>
<li class="">Download MCUXpresso SDK from NXP</li>
<li class="">Generate a sample project from that SDK</li>
</ol>
<p><strong>Part 2: add the Memfault SDK</strong></p>
<ol>
<li class="">Add the Memfault SDK sources to the project using the <code>eclipse_patch.py</code>
script from the Memfault SDK</li>
<li class="">Configure a few build settings (gnu Build ID, debug level)</li>
<li class="">(Optional, for i.MX RT1060 network demo) Add the
<a href="https://github.com/memfault/mcuxpresso-rt1060-example/blob/e1302d2d832ade87cbc49974b270b11fef3c3891/lwip_httpscli_mbedTLS/httpsclient.c" target="_blank" rel="noopener noreferrer" class="">example HTTPS client port</a>
and associated
<a href="https://github.com/memfault/mcuxpresso-rt1060-example/blob/e1302d2d832ade87cbc49974b270b11fef3c3891/source/lwip_httpscli_mbedTLS_freertos.c" target="_blank" rel="noopener noreferrer" class="">application changes</a>
for the i.MX RT1060 LwIP project, and configure Memfault Project Key for
uploading Memfault data from the EVK</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-1-setup-and-verify-lwip-sample-application">Part 1: Setup and Verify LwIP Sample Application<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#part-1-setup-and-verify-lwip-sample-application" class="hash-link" aria-label="Direct link to Part 1: Setup and Verify LwIP Sample Application" title="Direct link to Part 1: Setup and Verify LwIP Sample Application" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>👉 This section describes setting up the <code>lwip_httpscli_mbedTLS_freertos</code> sample
project provided by the NXP SDK.</p><p>The integration steps in <a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#part-2-integrate-the-memfault-sdk" class="">Part 2</a> can be
applied to other projects (including projects not based on an NXP sample), so
skip to that section if necessary.</p></div></div>
<ol>
<li class="">
<p>Install mcuxpresso:
<a href="https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE" target="_blank" rel="noopener noreferrer" class="">https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide<!-- -->:MCUXpresso-IDE</a></p>
</li>
<li class="">
<p>Download the
<a href="https://mcuxpresso.nxp.com/en/builder?hw=MIMXRT1060-EVKB" target="_blank" rel="noopener noreferrer" class="">SDK for the MIMXRT1060-EVKB</a>
(requires login to nxp.com): select all to download all components, and
select "mcuxpresso" as the target toolchain. This example used the specific
SDK version: <code>SDK_2.10.1_MIMXRT1060-EVKB</code> (<strong>NOTE: v2.11.1 was not compatible
with MCUXpresso v11.4.0</strong>)</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/download_sdk.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/download_sdk.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Import the SDK into MCUXpresso:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/installed_sdks.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/installed_sdks.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>To create the sample project, click "Import SDK example(s)...", then select
our board, and select <code>lwip_httpscli_mbedTLS_freertos</code>:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/sdk_import_wizard.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/sdk_import_wizard.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Default settings in the next screen are all OK, <strong>except for</strong>:</p>
<ol>
<li class=""><strong>Set library type (and hosting variant)</strong>: change it to "NewlibNano
(none)"</li>
<li class=""><strong>Include semihost HardFault handler</strong>: uncheck</li>
</ol>
</li>
<li class="">
<p>Build the sample with "Project→Build all"</p>
</li>
<li class="">
<p>Flash the sample with "Run→Debug as...→MCUXpresso IDE LinkServer (inc.
CMSIS-DAP) probes", assuming the EVK has the default CMSIS-DAP debug firmware</p>
</li>
<li class="">
<p>Open a serial terminal (example below is using pyserial):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">pyserial-miniterm --raw /dev/ttyACM0 115200</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Pressing "Run" in MCUXpresso, the following output should appear in the
serial terminal:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">Initializing PHY...</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Connect an ethernet cable to a router to see the demo proceed</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-2-integrate-the-memfault-sdk">Part 2: Integrate the Memfault SDK<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#part-2-integrate-the-memfault-sdk" class="hash-link" aria-label="Direct link to Part 2: Integrate the Memfault SDK" title="Direct link to Part 2: Integrate the Memfault SDK" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>👉 This section describes how to add the Memfault SDK sources. In this example,
the Memfault Demo CLI is connected to the debug UART in order to test the
Memfault functionality, and an HTTPS client is enabled over the Ethernet
connection for uploading Memfault data.</p><p>Note that the provided HTTPS client example is specific to the i.MX RT1060 EVK
sample app; other boards will potentially require a different connectivity
implementation.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-the-memfault-sources-and-build-flags">Add the Memfault Sources and Build Flags<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#add-the-memfault-sources-and-build-flags" class="hash-link" aria-label="Direct link to Add the Memfault Sources and Build Flags" title="Direct link to Add the Memfault Sources and Build Flags" translate="no">​</a></h3>
<ol>
<li class="">
<p>Download the Memfault SDK. either copy the folder into the project, or
preferably, add it as a Git submodule:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">git submodule add https://github.com/memfault/memfault-firmware-sdk.git memfault-firmware-sdk</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Run the eclipse patch script to add the Memfault sources (including the
"demo" component, which is the test CLI):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python memfault-firmware-sdk/scripts/eclipse_patch.py --project-dir . --memfault-sdk-dir memfault-firmware-sdk --components core,util,metrics,panics,demo --target-port freertos</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Copy in the platform template files:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cp memfault-firmware-sdk/ports/templates/* source/</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Refresh the project (right-click on the Project, "Refresh")</p>
</li>
<li class="">
<p>To enable the Memfault SDK sources in the build, uncheck "Exclude from build"
for the "memfault_components" virtual folder:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/uncheck_exclude_from_build.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/uncheck_exclude_from_build.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Add the <code>memfault_platform_ram_backed_coredump.c</code> source file to a new
virtual folder</p>
<ol>
<li class="">
<p>Create a new virtual folder. this is to not conflict with the sources the
<code>eclipse_patch.py</code> script operates on, so that script can be re-run in the
future (eg if the Memfault SDK is updated) without affecting these
port-specific sources, so name it <code>mfltport_components</code></p>
</li>
<li class="">
<p>Add the source file, which is located at
<code>memfault-firmware-sdk/ports/panics/src/memfault_platform_ram_backed_coredump.c</code>,
by dragging from a file explorer window into the virtual folder:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/virtual_port_folder.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/virtual_port_folder.png" class="image_e9uR" alt="Untitled"></a></figure>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/add_ram_backed_coredump.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/add_ram_backed_coredump.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Right-click on the new virtual folder, select "Properties", and uncheck
"Exclude from build"</p>
</li>
</ol>
</li>
<li class="">
<p>Add the following stubs to <code>source/memfault_platform_port.c</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;stdio.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"fsl_debug_console.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_log</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">eMemfaultPlatformLogLevel level</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                           </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">lvl_str</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Debug</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"D"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Info</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"I"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Warning</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"W"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Error</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"E"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  va_list args</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">va_start</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">128</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vsnprintf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">PRINTF</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"[%s] MFLT: %s\n"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> lvl_str</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">va_end</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_metrics_timer_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> period_sec</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> MemfaultPlatformTimerCallback callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">period_sec</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">callback</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Schedule a timer to invoke callback() repeatedly after period_sec</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">uint64_t</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_time_since_boot_ms</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Return time since boot in ms, this is used for relative timings.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_WEAK </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> reset_cause </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">  </span><span class="token comment" style="color:#999999">// TODO: Populate with MCU reset reason</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  eMemfaultRebootReason reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> kMfltRebootReason_Unknown</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// TODO: Convert MCU specific reboot reason to memfault enum</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason_reg </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_cause</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_reason</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add <code>memfault_platform_boot();</code> to <code>main()</code> (located in
<code>source/lwip_httpscli_mbedTLS_freertos.c</code>.</p>
</li>
<li class="">
<p>Confirm the project now builds.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-gnu-build-id">Add GNU Build ID<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#add-gnu-build-id" class="hash-link" aria-label="Direct link to Add GNU Build ID" title="Direct link to Add GNU Build ID" translate="no">​</a></h3>
<ol>
<li class="">
<p>Add GNU build id:</p>
<ol>
<li class="">
<p>Add this flag to <code>source/memfault_platform_config.h</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">MEMFAULT_USE_GNU_BUILD_ID</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">1</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add the following file at <code>source/gnu_build_id.ld</code>:</p>
<div class="language-linker-script codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-linker-script codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">/*</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">  Custom section to be included in the linker</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">  command file, to support GNU build id.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">SECTIONS</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id </span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        __start_gnu_build_id_start </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token location-counter important" style="font-weight:400">.</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token function" style="color:#79b6f2">KEEP</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">INSERT AFTER </span><span class="token section keyword" style="color:#c5a5c5">.text</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Add the necessary linker flags: right-click project→Properties. in the
left pane, open "C/C++ Build"→"Settings", then select MCU
Linker→Miscellaneous, and add the <code>--build-id</code> build flag:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/build_id.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/build_id.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Add a second flag to add the linker script fragment file to the build:
<code>-T "${workspace_loc:/${ProjName}/source/gnu_build_id.ld}"</code></p>
</li>
</ol>
</li>
<li class="">
<p>Set Debug Level to <code>-g3</code> in "MCU C Compiler"→Settings:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/mcuxpresso/set_debug_level.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/mcuxpresso/set_debug_level.png" class="image_e9uR" alt="Untitled"></a></figure>
</li>
<li class="">
<p>Clean and build. flash the project to the board and confirm the startup text
appears in the serial console:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: GNU Build ID: 63a58c3567c22fd6786adbc4cc186d258e66efe7</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: S/N: DEMOSERIAL</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW type: app-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: HW version: dvt1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: Memfault Initialized!</span><br></span></code></pre></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-https-client-and-test">Enable HTTPS Client and Test<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#enable-https-client-and-test" class="hash-link" aria-label="Direct link to Enable HTTPS Client and Test" title="Direct link to Enable HTTPS Client and Test" translate="no">​</a></h3>
<ol>
<li class="">
<p>The last step is to pick up the necessary port + https client changes, which
can be found under the <code>source/</code>directory in this repo:
<a href="https://github.com/memfault/mcuxpresso-rt1060-example" target="_blank" rel="noopener noreferrer" class="">https://github.com/memfault/mcuxpresso-rt1060-example</a></p>
<ol>
<li class="">
<p>Copy the necessary files:</p>
<ol>
<li class="">Everything under <code>source/</code></li>
<li class=""><code>lwip_httpscli_mbedTLS/httpsclient.c</code></li>
</ol>
</li>
<li class="">
<p>Configure a Memfault Project Key by replacing the placeholder text in
<code>lwip_httpscli_mbedTLS/httpsclient.c</code>. The Project Key is located under
Settings in the Memfault project, see
<a class="" href="https://docs.memfault.com/docs/mcu/export-chunks-over-console#grab-project-key-from-memfault-ui">Exporting Chunks Over Console</a></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// Memfault Project Key</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">memfault_project_key </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"&lt;YOUR PROJECT KEY HERE&gt;"</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Flashing this should show a new <code>post_chunks</code> console command when running
<code>help</code>:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: GNU Build ID: 63a58c3567c22fd6786adbc4cc186d258e66efe7</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: S/N: DEMOSERIAL</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW type: app-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: HW version: dvt1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] MFLT: Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mflt&gt; help</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">get_core: Get coredump info</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">clear_core: Clear an existing coredump</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">crash: Trigger a crash</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">trigger_logs: Trigger capture of current log buffer contents</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">drain_chunks: Flushes queued Memfault data. To upload data see https://mflt.io/posting-chunks-with-gdb</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">trace: Capture an example Trace Event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">get_device_info: Get device info</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">reboot: Reboot system and tracks it with a Trace Event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">export: Export base64-encoded chunks. To upload data see https://mflt.io/chunk-data-export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">post_chunks: Upload chunks to Memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">help: Lists all commands</span><br></span></code></pre></div></div>
</li>
</ol>
</li>
<li class="">
<p>Test out the demo commands, eg <code>crash</code>, <code>reboot</code>, <code>post_chunks</code>. The
<code>post_chunks</code> command requires an ethernet cable to be connected, with
network access to the internet.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Note: be sure to detach the debugger before running the <code>crash</code> or <code>reboot</code>
commands. Depending on configuration, the debugger may prevent the board from
resetting correctly!</p></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>If you encounter any issues in your data transfer implementation, Memfault has tools to help debug!</p><ul><li>To troubleshoot data not getting uploaded or processed correctly by the Memfault cloud, take a look at the<!-- --> <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/integration-hub/processing-log"> <!-- -->Integration Hub → Processing Log<!-- --> </a> <!-- -->view. This provides a filterable, chronological view of recent errors that have occurred while processing received data. See<!-- --> <a href="https://docs.memfault.com/docs/platform/integration-hub">this documentation page</a> <!-- -->for more information on the Integration Hub.</li><li>A view you can use to<a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint#troubleshooting">view the raw "Chunk" data payloads</a>that have arrived for your project.</li><li><a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint">Precanned Data Payloads</a> <!-- -->you can pass through your `user_transport_send_chunk_data()` implementation to test data transfer in isolation.</li><li>Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</li></ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>To see decoded data on app.memfault.com, the Symbol File will need to be
uploaded. typically the symbol file will be a <code>.axf</code> file named from the
project, for example <code>Debug/mcuxpresso-rt1060-example.axf</code>.</p></div></div>
<p>Symbol files can be uploaded from the <strong>Software → Symbol Files</strong> tab (follow to
be brought to the symbol file upload point in the UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-notes">Additional Notes<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#additional-notes" class="hash-link" aria-label="Direct link to Additional Notes" title="Direct link to Additional Notes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-cache">Data Cache<a href="https://docs.memfault.com/embed/mcu/arm-nxp-mcuxpresso-guide#data-cache" class="hash-link" aria-label="Direct link to Data Cache" title="Direct link to Data Cache" translate="no">​</a></h3>
<p>The i.MX RT10xx series uses a Cortex-M7 core with an instruction and data cache.
See the
<a class="" href="https://docs.memfault.com/docs/mcu/faq#d-cache-flush-before-reboot">FAQ entry on D-cache flushing</a> for
details on why this matters and how to handle it.</p>
<p>Some ARM Cortex-M processors include a data cache (D-cache), notably the
<strong>Cortex-M7</strong> and <strong>Cortex-M33</strong> cores (e.g. NXP i.MX RT, STM32H7, STM32U5, and
other high-performance Cortex-M SoCs). The Memfault SDK relies on a minimum of 1
variable stored in non-initialized (<code>.noinit</code>) RAM when the system encounters a
crash. If the RAM-backed coredump storage component is used, that data is also
stored in a non-initialized section of RAM.</p>
<p>Because the D-cache may hold dirty cache lines that have not yet been written
back to RAM, it's important to flush the D-cache before issuing a reset.
Otherwise, the cached reboot-reason or coredump data may be lost. The CMSIS API
to perform that flush is:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token function" style="color:#79b6f2">SCB_CleanDCache</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>This call should be inserted before the chip is reset, typically in
<code>memfault_platform_reboot()</code> just before <code>NVIC_SystemReset()</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// flush the data cache before issuing the reboot, to ensure the saved reboot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// reason data or RAM-backed coredump data is written out</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">SCB_CleanInvalidateDCache</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ensure all memory accesses have completed before issuing the reset</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">__DSB</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">__ISB</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">NVIC_SystemReset</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// unreachable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>For reference, see this white paper from Microchip on managing cache coherency
in Cortex-M7 based MCUs:</p>
<p><a href="http://ww1.microchip.com/downloads/en/DeviceDoc/Managing-Cache-Coherency-on-Cortex-M7-Based-MCUs-DS90003195A.pdf" target="_blank" rel="noopener noreferrer" class="">http://ww1.microchip.com/downloads/en/DeviceDoc/Managing-Cache-Coherency-on-Cortex-M7-Based-MCUs-DS90003195A.pdf</a></p>
<p>And the CMSIS D-cache API documentation:</p>
<p><a href="https://www.keil.com/pack/doc/CMSIS/Core/html/group__Dcache__functions__m7.html" target="_blank" rel="noopener noreferrer" class="">https://www.keil.com/pack/doc/CMSIS/Core/html/group__Dcache__functions__m7.html</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Pinnacle™ 100 Modem Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/pinnacle-100-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide"/>
        <updated>2021-07-27T19:01:51.000Z</updated>
        <content type="html"><![CDATA[<p>In this guide we will walk through the steps for integrating the
<a href="https://github.com/memfault/memfault-firmware-sdk" target="_blank" rel="noopener noreferrer" class="">Memfault Firmware SDK</a> into
any project using
<a href="https://www.ezurio.com/wireless-modules/cellular-solutions/pinnacle-100-cellular-lte-m-nb-iot-bluetooth-5-modem" target="_blank" rel="noopener noreferrer" class="">Ezurio's Pinnacle™ 100 Cellular Modem</a>
(i.e
<a href="https://www.ezurio.com/iot-devices/bluetooth-iot-devices/sentrius-mg100-gateway-lte-mnb-iot-and-bluetooth-5" target="_blank" rel="noopener noreferrer" class="">Sentrius™ MG100</a>).</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The Pinnacle-100-Firmware has built-in support for the Memfault Firmware SDK.
Ezurio has released some
<a href="https://lairdcp.github.io/guides/ble-gateway-firmware/1.0/docs/memfault.html" target="_blank" rel="noopener noreferrer" class="">excellent documentation</a>
on how to integrate Memfault and the
<a href="https://lairdcp.github.io/guides/ble-gateway-firmware/1.0/docs/readme_aws.html" target="_blank" rel="noopener noreferrer" class="">AWS Out-of-Box demo</a>
includes a full Memfault integration that can be tried out. We recommend
following both this documentation page as well as Ezurio's.</p></div></div>
<p>Upon completion of the integration, the following subcomponents will be added to
your system!</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/reboot-reason-tracking">Reboot Reasons</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/trace-events">Trace Events</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/mcu/coredumps">RAM-backed stack dump Collection</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-steps">Integration Steps<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#integration-steps" class="hash-link" aria-label="Direct link to Integration Steps" title="Direct link to Integration Steps" translate="no">​</a></h2>
<p>This tutorial assumes you have a working environment for building the
<a href="https://github.com/LairdCP/Pinnacle-100-Firmware-Manifest" target="_blank" rel="noopener noreferrer" class="">Pinnacle 100 Firmware</a>
(such as an application based on the
<a href="https://lairdcp.github.io/guides/ble-gateway-firmware/1.0/docs/readme_aws.html" target="_blank" rel="noopener noreferrer" class="">AWS Out-of-Box Demo</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-memfault-account">Create a Memfault Account<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#create-a-memfault-account" class="hash-link" aria-label="Direct link to Create a Memfault Account" title="Direct link to Create a Memfault Account" translate="no">​</a></h2>
<p>The integration requires a Memfault cloud account to process data collected by
the Memfault Firmware SDK. You can create one
<a href="https://goto.memfault.com/create-key/pinnacle-100" target="_blank" rel="noopener noreferrer" class="">for free from here</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kconfig-section">Update Kconfig options<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#kconfig-section" class="hash-link" aria-label="Direct link to Update Kconfig options" title="Direct link to Update Kconfig options" translate="no">​</a></h2>
<p>Add or update the appropriate options in your system's <code>prj.conf</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># Project-specific configuration settings</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_PROJECT_KEY="YOUR_PROJECT_KEY"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">CONFIG_MEMFAULT_NCS_FW_TYPE="pinnacle-fw"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h2>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="publish-data-to-the-memfault-cloud">Publish data to the Memfault cloud<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#publish-data-to-the-memfault-cloud" class="hash-link" aria-label="Direct link to Publish data to the Memfault cloud" title="Direct link to Publish data to the Memfault cloud" translate="no">​</a></h2>
<!-- -->Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="https">HTTPS<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#https" class="hash-link" aria-label="Direct link to HTTPS" title="Direct link to HTTPS" translate="no">​</a></h3>
<p>The integration will automatically push data to Memfault over HTTPS when an LTE
connection becomes available prior to connecting to AWS IoT allowing one to
immediately get information about unexpected resets as well as debug any
connectivity issues with AWS IoT.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mqtt">MQTT<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#mqtt" class="hash-link" aria-label="Direct link to MQTT" title="Direct link to MQTT" translate="no">​</a></h3>
<p>After a connection with AWS IoT is established, Memfault data is published to
the following topic.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">prod/&lt;board&gt;/&lt;device_id&gt;/memfault/&lt;memfault_project_key&gt;/chunk</span><br></span></code></pre></div></div>
<p>Forwarding data to Memfault from AWS IoT is very easy! You just need to
configure an AWS IoT Rule for the topic and connect it to an AWS Lambda
function. This can either be done manually in the AWS console or
programmatically using CloudFormation.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">CloudFormation</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Manually</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>These steps assume you have installed the
<a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" target="_blank" rel="noopener noreferrer" class="">AWS CLI</a>
and have set up credentials to access your AWS instance.</p></div></div><ol>
<li class="">Copy and paste the contents below into <code>cfnTemplate_memfault.yml</code></li>
<li class="">Deploy the configuration</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ aws cloudformation deploy --template cfnTemplate_memfault.yml --stack-name memfault-pinnacle-100-chunk-proxy --capabilities CAPABILITY_NAMED_IAM</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Waiting for changeset to be created..</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Waiting for stack create/update to complete</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cfntemplate_memfaultyml-file-contents">cfnTemplate_memfault.yml file contents<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#cfntemplate_memfaultyml-file-contents" class="hash-link" aria-label="Direct link to cfnTemplate_memfault.yml file contents" title="Direct link to cfnTemplate_memfault.yml file contents" translate="no">​</a></h4><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token key atrule" style="color:#FAC863">AWSTemplateFormatVersion</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"2010-09-09"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token key atrule" style="color:#FAC863">Transform</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Serverless</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token datetime number" style="color:#5a9bcf">2016-10-31</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token key atrule" style="color:#FAC863">Description</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> Memfault Pinnacle 100 Chunk Proxy</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token key atrule" style="color:#FAC863">Parameters</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">ApplicationName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> String</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Default</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> memfault</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">chunk</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">proxy</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token key atrule" style="color:#FAC863">Resources</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">LambdaIotRole</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">IAM</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Role</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Properties</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">RoleName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Sub</span><span class="token plain"> $</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">ApplicationName</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">lambda</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">iot</span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain">role</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">AssumeRolePolicyDocument</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">Version</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token datetime number" style="color:#5a9bcf">2012-10-17</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">Statement</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">Effect</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> Allow</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">Principal</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">Service</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> lambda.amazonaws.com</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">Action</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> sts</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">AssumeRole</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Sub</span><span class="token plain"> /$</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">ApplicationName</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">ManagedPolicyArns</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">policy/AWSIoTFullAccess</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Policies</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">PolicyName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> LambdaIotPolicy</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">PolicyDocument</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">Version</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"2012-10-17"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">Statement</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">Effect</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> Allow</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">Action</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                  </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> logs</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">CreateLogStream</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                  </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> logs</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">PutLogEvents</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">Resource</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                  </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">logs</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token important" style="font-weight:400">*:*:log-group:/aws/lambda/*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999"># Proxy Memfault "chunks" to Memfault cloud for processing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999"># For more details about data transport see https://mflt.io/data-to-cloud</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">MemfaultProxyFunction</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Lambda</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Function</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Properties</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">FunctionName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"MemfaultPinnacle100ProxyFunction"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Code</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">ZipFile</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">|</span><span class="token scalar string" style="color:#8dc891"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token scalar string" style="color:#8dc891">          const https = require('https')</span><br></span><span class="token-line" style="color:#ffffff"><span class="token scalar string" style="color:#8dc891">          exports.https = https</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          exports.handler = (event</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> callback) =</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            const data = Buffer.from(event.data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> 'base64');</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token key atrule" style="color:#FAC863">// Topic Format</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> prod/&lt;board</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain">/&lt;device_id</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain">/memfault/&lt;memfault_project_key</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain">/chunk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            const topicParams = event.topic.split('/')</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            const deviceSerial = topicParams</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">2</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            const options = </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">hostname</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'chunks.memfault.com'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">port</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">443</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">path</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> `/api/v0/chunks/$</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">deviceSerial</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">`</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">method</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'POST'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">headers</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">'Content-Type'</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'application/octet-stream'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">'Content-Length'</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> data.length</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">'Memfault-Project-Key'</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> topicParams</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">4</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            const req = https.request(options</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> res =</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              const response = </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                </span><span class="token key atrule" style="color:#FAC863">statusCode</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> res.statusCode</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">;</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              callback(null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> response);</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            req.on('error'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> error =</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              console.error(error)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            req.write(data)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">            req.end()</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Handler</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"index.handler"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Role</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!GetAtt</span><span class="token plain"> LambdaIotRole.Arn</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Runtime</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> nodejs12.x</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Timeout</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">15</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Environment</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">Variables</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token key atrule" style="color:#FAC863">ApplicationName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Ref</span><span class="token plain"> ApplicationName</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">MemfaultProxyFunctionLogGroup</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Logs</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">LogGroup</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">DependsOn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> MemfaultProxyFunction</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Properties</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">RetentionInDays</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">14</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">LogGroupName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Join</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token string" style="color:#8dc891">""</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token string" style="color:#8dc891">"/aws/lambda/"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Ref</span><span class="token plain"> MemfaultProxyFunction</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">MemfaultProxyFunctionPermission</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Lambda</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Permission</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Properties</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Action</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> lambda</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">InvokeFunction</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">FunctionName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!GetAtt</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> MemfaultProxyFunction</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> Arn</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">Principal</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> iot.amazonaws.com</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">SourceArn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!Sub</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">iot</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">Region</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">AccountId</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">rule/$</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">MemfaultProxyRule</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token key atrule" style="color:#FAC863">MemfaultProxyRule</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Type</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">IoT</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain">TopicRule</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token key atrule" style="color:#FAC863">Properties</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">RuleName</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"MemfaultPinnacle100ProxyRule"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token key atrule" style="color:#FAC863">TopicRulePayload</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">AwsIotSqlVersion</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"2016-03-23"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">RuleDisabled</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#ff8b50;font-weight:400">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">Sql</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token tag" style="color:#fc929e">!Sub</span><span class="token plain"> SELECT encode(*</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> 'base64') AS data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> topic() AS topic FROM</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          'prod/+/+/memfault/</span><span class="token comment" style="color:#999999">#'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token key atrule" style="color:#FAC863">Actions</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">          </span><span class="token punctuation" style="color:#8dc891">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#FAC863">Lambda</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">              </span><span class="token key atrule" style="color:#FAC863">FunctionArn</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token tag" style="color:#fc929e">!GetAtt</span><span class="token plain"> MemfaultProxyFunction.Arn</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-aws-lambda">Create AWS Lambda<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#create-aws-lambda" class="hash-link" aria-label="Direct link to Create AWS Lambda" title="Direct link to Create AWS Lambda" translate="no">​</a></h4><p>First you will need to create an
<a href="https://console.aws.amazon.com/lambda/home#/functions" target="_blank" rel="noopener noreferrer" class="">AWS Lambda</a> to forward
data to Memfault.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> https </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">require</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"https"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">exports</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">https</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">exports</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">handler</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#8dc891">,</span><span class="token parameter"> context</span><span class="token parameter punctuation" style="color:#8dc891">,</span><span class="token parameter"> callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> data </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"base64"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Topic Format: prod/&lt;board&gt;/&lt;device_id&gt;/memfault/&lt;memfault_project_key&gt;/chunk</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> topicParams </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">topic</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">split</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"/"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> deviceSerial </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> topicParams</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">2</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> options </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">hostname</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"chunks.memfault.com"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">port</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">443</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">path</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#8dc891">`</span><span class="token template-string string" style="color:#8dc891">/api/v0/chunks/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#8dc891">${</span><span class="token template-string interpolation">deviceSerial</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#8dc891">}</span><span class="token template-string template-punctuation string" style="color:#8dc891">`</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">method</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"POST"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">headers</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token string-property property" style="color:#5a9bcf">"Content-Type"</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"application/octet-stream"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token string-property property" style="color:#5a9bcf">"Content-Length"</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> data</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token string-property property" style="color:#5a9bcf">"Memfault-Project-Key"</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> topicParams</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">4</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> req </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> https</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">request</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">options</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token parameter">res</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> response </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token literal-property property" style="color:#5a9bcf">statusCode</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> res</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">statusCode</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token function" style="color:#79b6f2">callback</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword null nil" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> response</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  req</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">on</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"error"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token parameter">error</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token console class-name" style="color:#FAC863">console</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">error</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  req</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">write</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  req</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">end</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-aws-iot-rule">Create AWS IoT Rule<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#create-aws-iot-rule" class="hash-link" aria-label="Direct link to Create AWS IoT Rule" title="Direct link to Create AWS IoT Rule" translate="no">​</a></h4><p>Next you will need to create a new
<a href="https://console.aws.amazon.com/iot/home#/rulehub" target="_blank" rel="noopener noreferrer" class="">AWS IoT Rule</a>:</p><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">SELECT</span><span class="token plain"> encode</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'base64'</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">AS</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> topic</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">AS</span><span class="token plain"> topic </span><span class="token keyword" style="color:#c5a5c5">FROM</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'prod/+/+/memfault/#'</span><br></span></code></pre></div></div><p>Finally, as part of the setup you will need to attach the Lambda you just
created to the AWS IoT rule so that the lambda gets triggered each time new data
arrives.</p></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://docs.memfault.com/embed/mcu/pinnacle-100-guide#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h3>
<p>If you encounter any issues in your data transfer implementation, Memfault has tools to help debug!</p><ul><li>To troubleshoot data not getting uploaded or processed correctly by the Memfault cloud, take a look at the<!-- --> <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/integration-hub/processing-log"> <!-- -->Integration Hub → Processing Log<!-- --> </a> <!-- -->view. This provides a filterable, chronological view of recent errors that have occurred while processing received data. See<!-- --> <a href="https://docs.memfault.com/docs/platform/integration-hub">this documentation page</a> <!-- -->for more information on the Integration Hub.</li><li>A view you can use to<a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint#troubleshooting">view the raw "Chunk" data payloads</a>that have arrived for your project.</li><li><a href="https://docs.memfault.com/docs/mcu/test-patterns-for-chunks-endpoint">Precanned Data Payloads</a> <!-- -->you can pass through your `user_transport_send_chunk_data()` implementation to test data transfer in isolation.</li><li>Server-side rate limiting will apply to the device you're using to work on the integration process. Once you can see the device on the Memfault Web App, consider enabling<!-- --> <a href="https://docs.memfault.com/docs/platform/rate-limiting#server-side-developer-mode">Server-Side Developer Mode</a> <!-- -->for it on the Memfault Web App to temporarily bypass these limits.</li></ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ARM Cortex-M Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/arm-cortex-m-guide</id>
        <link href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide"/>
        <updated>2021-06-16T17:59:53.000Z</updated>
        <content type="html"><![CDATA[<p>The following guide will walk you through step-by-step how to integrate and test
the Memfault SDK for a Cortex-M device using the GNU GCC, Clang, IAR, ARM MDK,
or TI ARM Compiler.</p>
<p>Adding the Memfault Firmware SDK to your device will provide rich diagnostics,
including:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="coredump-collection"><a class="" href="https://docs.memfault.com/docs/mcu/coredumps">Coredump Collection</a><a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#coredump-collection" class="hash-link" aria-label="Direct link to coredump-collection" title="Direct link to coredump-collection" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" class="image_e9uR" alt="Example coredump collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-metrics"><a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Device Metrics</a><a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#device-metrics" class="hash-link" aria-label="Direct link to device-metrics" title="Direct link to device-metrics" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/device-timeline-metrics.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/device-timeline-metrics.png" class="image_e9uR" alt="Device metrics collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reboot-reason-tracking"><a class="" href="https://docs.memfault.com/docs/mcu/reboot-reason-tracking">Reboot Reason Tracking</a><a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#reboot-reason-tracking" class="hash-link" aria-label="Direct link to reboot-reason-tracking" title="Direct link to reboot-reason-tracking" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" class="image_e9uR" alt="Reboot reasons collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-tracking-with-trace-events"><a class="" href="https://docs.memfault.com/docs/mcu/trace-events">Error Tracking with Trace Events</a><a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#error-tracking-with-trace-events" class="hash-link" aria-label="Direct link to error-tracking-with-trace-events" title="Direct link to error-tracking-with-trace-events" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" class="image_e9uR" alt="Trace Events collected with Memfault" width="800"></a></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="optionally-collect-a-coredump-capture-using-gdb">(Optionally) Collect a coredump capture using GDB<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#optionally-collect-a-coredump-capture-using-gdb" class="hash-link" aria-label="Direct link to (Optionally) Collect a coredump capture using GDB" title="Direct link to (Optionally) Collect a coredump capture using GDB" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Without GDB</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Using GDB</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>If you do not use GDB, skip ahead to the next step.</p></div><div role="tabpanel" class="tabItem_Ymn6"><p>If you use GDB, a full coredump can be captured by just using the debugger! This
can be useful during development to take advantage of Memfault's analyzers when
a device crashes or hangs.</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/try-flow.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/try-flow.png" class="image_e9uR"></a></figure><p>To perform the capture, navigate to <a href="http://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">http://app.memfault.com/</a> and select the
"Issues" page in the Memfault UI, click on the "Manual Upload" button, and click
on "walk-through on how to upload your first coredump". From there you can
follow the guided steps to perform a capture. At the end you will see an
analysis of your system state.</p></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-project">1. Create a Project<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#create-a-project" class="hash-link" aria-label="Direct link to 1. Create a Project" title="Direct link to 1. Create a Project" translate="no">​</a></h2>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-up-the-sdk">2. Set up the SDK<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#set-up-the-sdk" class="hash-link" aria-label="Direct link to 2. Set up the SDK" title="Direct link to 2. Set up the SDK" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-folder-for-memfault-firmware-sdk-port">Prepare folder for memfault-firmware-sdk &amp; port<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#prepare-folder-for-memfault-firmware-sdk-port" class="hash-link" aria-label="Direct link to Prepare folder for memfault-firmware-sdk &amp; port" title="Direct link to Prepare folder for memfault-firmware-sdk &amp; port" translate="no">​</a></h3>
<p>The <code>memfault-firmware-sdk</code> is a self-contained C SDK you will need to include
into your project.</p>
<p>Create a folder to hold <code>memfault-firmware-sdk</code> as well as the configuration and
porting files to your platform.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cd ${YOUR_PROJECT_DIR}</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mkdir -p third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cd third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Add memfault repo as submodule, subtree, or copy in as source directly</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">git submodule add https://github.com/memfault/memfault-firmware-sdk.git memfault-firmware-sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cp memfault-firmware-sdk/ports/templates/* .</span><br></span></code></pre></div></div>
<p>When you are done, you should have the following directory structure in your
project:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">//...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault-firmware-sdk (submodule)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">| # Files where port / glue layer to your platform will be implemented</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault_platform_port.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">| # Configuration Headers</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault_metrics_heartbeat_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_trace_reason_user_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_platform_log_config.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_platform_config.h</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-sources-to-build-system">Add Sources to Build System<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-sources-to-build-system" class="hash-link" aria-label="Direct link to Add Sources to Build System" title="Direct link to Add Sources to Build System" translate="no">​</a></h3>
<p>Based on the build system you are using, expand the appropriate tab below and
follow the steps to add the sources to your target</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Make</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">CMake</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_PORT_ROOT </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> &lt;YOUR_PROJECT_ROOT&gt;/third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_SDK_ROOT </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/memfault-firmware-sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_COMPONENTS </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> core util panics metrics</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/makefiles/MemfaultWorker.mk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">&lt;YOUR_SRC_FILES&gt; </span><span class="token operator" style="color:#d7deea">+=</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_COMPONENTS_SRCS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/memfault_platform_port.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">&lt;YOUR_INCLUDE_PATHS&gt; </span><span class="token operator" style="color:#d7deea">+=</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_COMPONENTS_INC_FOLDERS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/ports/</span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>YOUR_SRC_FILES</code>, <code>YOUR_INCLUDE_PATHS</code>, and
<code>YOUR_PROJECT_ROOT</code> accordingly for your system above!</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token variable" style="color:#d7deea">MEMFAULT_PORT_ROOT</span><span class="token plain"> &lt;</span><span class="token variable" style="color:#d7deea">YOUR_PROJECT_ROOT</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain">/third_party/memfault</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/memfault-firmware-sdk</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">list</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APPEND MEMFAULT_COMPONENTS core util panics metrics</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/cmake/Memfault.cmake</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">memfault_library</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> MEMFAULT_COMPONENTS</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> MEMFAULT_COMPONENTS_SRCS MEMFAULT_COMPONENTS_INC_FOLDERS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Add the following to your target sources:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_COMPONENTS_SRCS}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_PORT_ROOT}/memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Add the following to your target includes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_COMPONENTS_INC_FOLDERS}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_SDK_ROOT}/ports/include</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_PORT_ROOT}</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>YOUR_PROJECT_ROOT</code>, add <code>${MEMFAULT_COMPONENTS_SRCS}</code> to your
target sources and <code>${MEMFAULT_COMPONENTS_INC_FOLDERS}</code> to your target includes
accordingly</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><ol>
<li class="">add <code>$MEMFAULT_FIRMWARE_SDK/components/include</code> to the include paths for your
project</li>
<li class="">add <code>$MEMFAULT_FIRMWARE_SDK/ports/include</code> to the include paths for your
project</li>
<li class="">add the sources under
<code>$MEMFAULT_FIRMWARE_SDK/components/[core, util, panics, metrics]/src/**/*.c</code>
to your project</li>
<li class="">add <code>third_party/memfault/memfault_platform_port.c</code> sources to project</li>
<li class="">add <code>third_party/memfault/</code> to the include paths for your project</li>
</ol><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>When using Eclipse as your build system, folders can be opted out from a build
by right clicking on the folder and selecting "Resource Configuration" -&gt;
"Exclude from Build".</p></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-dependencies">Core Dependencies<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#core-dependencies" class="hash-link" aria-label="Direct link to Core Dependencies" title="Direct link to Core Dependencies" translate="no">​</a></h3>
<p>Open the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/templates/memfault_platform_port.c" target="_blank" rel="noopener noreferrer" class=""><code>memfault_platform_port.c</code></a>
copied into your <code>third_party/memfault</code> folder and fill out the stub
implementations accordingly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-memfault-subsystem-on-bootup">Initialize Memfault Subsystem On Bootup<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#initialize-memfault-subsystem-on-bootup" class="hash-link" aria-label="Direct link to Initialize Memfault Subsystem On Bootup" title="Direct link to Initialize Memfault Subsystem On Bootup" translate="no">​</a></h4>
<p>From your main routine, add a call to <code>memfault_platform_boot()</code> prior to the
startup of an RTOS or baremetal while loop.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reboot-tracking-dependencies">Reboot Tracking Dependencies<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#reboot-tracking-dependencies" class="hash-link" aria-label="Direct link to Reboot Tracking Dependencies" title="Direct link to Reboot Tracking Dependencies" translate="no">​</a></h3>
<p>Memfault has a module for tracking and reporting what resets are taking place on
your platform.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">STM32</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP S32 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">EFM/EFR (Gecko SDK)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP RW610/611/612</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">SiLabs SiWx91x</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/resetreas_reboot_tracking.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubef4">STM32CubeF4<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubef4" class="hash-link" aria-label="Direct link to STM32CubeF4" title="Direct link to STM32CubeF4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/f4/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubef7">STM32CubeF7<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubef7" class="hash-link" aria-label="Direct link to STM32CubeF7" title="Direct link to STM32CubeF7" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/f7/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubeh7">STM32CubeH7<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubeh7" class="hash-link" aria-label="Direct link to STM32CubeH7" title="Direct link to STM32CubeH7" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/h7/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubel4">STM32CubeL4<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubel4" class="hash-link" aria-label="Direct link to STM32CubeL4" title="Direct link to STM32CubeL4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/l4/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubeu5">STM32CubeU5<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubeu5" class="hash-link" aria-label="Direct link to STM32CubeU5" title="Direct link to STM32CubeU5" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/u5/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubewb">STM32CubeWB<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32cubewb" class="hash-link" aria-label="Direct link to STM32CubeWB" title="Direct link to STM32CubeWB" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/wb/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/s32sdk/rcm_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/emlib/rmu_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nxp/rw61x/pmu_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/orts/silabs/wiseconnect/siwx91x/siwx91x_reboot_tracking.c</span><br></span></code></pre></div></div><p>As described in that file, you will need to add the following code to your
<code>Reset_Handler</code> implementation (or wherever your application calls
<code>SystemInit()</code>), for example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"si91x_device.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Reset_Handler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Load the global variable with the contents of MCU_FSM_WAKEUP_STATUS_REG</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">extern</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> memfault_siwx91x_fsm_wakeup_status_reg</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  memfault_siwx91x_fsm_wakeup_status_reg </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> MCU_FSM</span><span class="token operator" style="color:#d7deea">-&gt;</span><span class="token plain">MCU_FSM_WAKEUP_STATUS_REG</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Call SystemInit() to initialize the system</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">SystemInit</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Call the main function</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><p>Implement the following function for your MCU. The ports listed in other tabs
serve as a good reference.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> reset_cause </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// TODO: Populate with MCU reset reason</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  eMemfaultRebootReason reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> kMfltRebootReason_Unknown</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// TODO: Convert MCU specific reboot reason to memfault enum</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason_reg </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_cause</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_reason</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-coredump-storage-dependency">Implement Coredump Storage Dependency<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#implement-coredump-storage-dependency" class="hash-link" aria-label="Direct link to Implement Coredump Storage Dependency" title="Direct link to Implement Coredump Storage Dependency" translate="no">​</a></h3>
<p>When the system faults or asserts crash information can be recorded and sent to
Memfault after the device reboots. In order for this information to be saved, it
must be persisted to a storage area that persists across a device reset.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-coredump-storage-area">Implement Coredump Storage Area<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#implement-coredump-storage-area" class="hash-link" aria-label="Direct link to Implement Coredump Storage Area" title="Direct link to Implement Coredump Storage Area" translate="no">​</a></h4>
<p>Coredumps can be saved in a <code>.noinit</code> region of SRAM, internal flash, external
flash, or even streamed out over a peripheral to another MCU when a coredump
takes place.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">RAM-backed</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">EFM/EFR (Gecko SDK)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">STM32</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP S32 SDK</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>1. Add source code</strong></p><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/panics/src/memfault_platform_ram_backed_coredump.c</span><br></span></code></pre></div></div><p><strong>2. Configure Coredump Region</strong></p><p>The RAM region is placed in a special section <code>.noinit.mflt_coredump</code> which
needs to be placed in a noinit memory region. This can be achieved by adding a
<code>noinit</code> section to your linker script. Check out the following examples for
your compiler/linker:</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/emlib/msc_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/emlib/msc_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">msc_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32f4-internal-flash-using-stm32cubef4">STM32F4 internal flash using STM32CubeF4<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32f4-internal-flash-using-stm32cubef4" class="hash-link" aria-label="Direct link to STM32F4 internal flash using STM32CubeF4" title="Direct link to STM32F4 internal flash using STM32CubeF4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/f4/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/f4/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32l4-internal-flash-using-stm32cubel4">STM32L4 internal flash using STM32CubeL4<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32l4-internal-flash-using-stm32cubel4" class="hash-link" aria-label="Direct link to STM32L4 internal flash using STM32CubeL4" title="Direct link to STM32L4 internal flash using STM32CubeL4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/l4/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/l4/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32wb-internal-flash-using-stm32cubewb">STM32WB internal flash using STM32CubeWB<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32wb-internal-flash-using-stm32cubewb" class="hash-link" aria-label="Direct link to STM32WB internal flash using STM32CubeWB" title="Direct link to STM32WB internal flash using STM32CubeWB" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/wb/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/wb/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32u5-internal-flash-using-stm32cubeu5">STM32U5 internal flash using STM32CubeU5<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#stm32u5-internal-flash-using-stm32cubeu5" class="hash-link" aria-label="Direct link to STM32U5 internal flash using STM32CubeU5" title="Direct link to STM32U5 internal flash using STM32CubeU5" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/u5/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/u5/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nrf5xx-internal-flash-using-nrf5-sdk">nRF5xx internal flash using nRF5 SDK<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#nrf5xx-internal-flash-using-nrf5-sdk" class="hash-link" aria-label="Direct link to nRF5xx internal flash using nRF5 SDK" title="Direct link to nRF5xx internal flash using nRF5 SDK" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/nrf5_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/nrf5_sdk/nrf5_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">nrf5_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nxp-s32-sdk">NXP S32 SDK<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#nxp-s32-sdk" class="hash-link" aria-label="Direct link to NXP S32 SDK" title="Direct link to NXP S32 SDK" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/s32sdk/ftfc_flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/s32sdk/ftfc_flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">ftfc_flash_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-port-template">Custom Port Template<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#custom-port-template" class="hash-link" aria-label="Direct link to Custom Port Template" title="Direct link to Custom Port Template" translate="no">​</a></h4><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_get_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMfltCoredumpStorageInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMfltCoredumpStorageInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">size </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* size of coredump storage area */</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_read</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                                             </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> read_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_erase</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> erase_size</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_write</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                                              </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> data_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_clear</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rtos-port-files">RTOS Port Files<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#rtos-port-files" class="hash-link" aria-label="Direct link to RTOS Port Files" title="Direct link to RTOS Port Files" translate="no">​</a></h3>
<p>The Memfault SDK includes pre-canned integrations for RTOS environments. Expand
the tab for the one applies to your system below in order to pick them up.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> FreeRTOS Specific Sources </summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-freertos-specific-sources-to-compilation">Add FreeRTOS-Specific Sources<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-freertos-specific-sources-to-compilation" class="hash-link" aria-label="Direct link to Add FreeRTOS-Specific Sources" title="Direct link to Add FreeRTOS-Specific Sources" translate="no">​</a></h4><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_core_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_freertos_ram_regions.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_metrics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_panics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_sdk_metrics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_sdk_metrics_thread.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_self_test_platform.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-freertos-specific-include-path">Add FreeRTOS-Specific Include Path<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-freertos-specific-include-path" class="hash-link" aria-label="Direct link to Add FreeRTOS-Specific Include Path" title="Direct link to Add FreeRTOS-Specific Include Path" translate="no">​</a></h4><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/config</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="include-freertos-metric-definitions-in-platform-heartbeat-config">Include FreeRTOS Metric Definitions in Platform Heartbeat Config<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#include-freertos-metric-definitions-in-platform-heartbeat-config" class="hash-link" aria-label="Direct link to Include FreeRTOS Metric Definitions in Platform Heartbeat Config" title="Direct link to Include FreeRTOS Metric Definitions in Platform Heartbeat Config" translate="no">​</a></h4><p>In your <code>memfault_port/memfault_metrics_heartbeat_config.def</code>:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">memfault_metrics_heartbeat_config.def</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault_metrics_heartbeat_freertos_config.def"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="remove-extra-function-definitions">Remove Extra Function Definitions<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#remove-extra-function-definitions" class="hash-link" aria-label="Direct link to Remove Extra Function Definitions" title="Direct link to Remove Extra Function Definitions" translate="no">​</a></h4><ol>
<li class="">
<p>Remove the definition for <code>memfault_platform_metrics_timer_boot()</code> in your
<code>memfault_platform_port.c</code>. This is implemented by the FreeRTOS port in the
SDK</p>
</li>
<li class="">
<p>Remove the definition for <code>vApplicationStackOverflowHook()</code> in your
application if it is defined. The Memfault FreeRTOS port provides a
definition for this function to register a stack overflow reboot reason and
reboot the system</p>
</li>
</ol><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-memfault-task-tracing-in-freertosconfigh">Register Memfault Task Tracing in FreeRTOSConfig.h<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#register-memfault-task-tracing-in-freertosconfigh" class="hash-link" aria-label="Direct link to Register Memfault Task Tracing in FreeRTOSConfig.h" title="Direct link to Register Memfault Task Tracing in FreeRTOSConfig.h" translate="no">​</a></h4><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">FreeRTOSConfig.h</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/ports/freertos_trace.h"</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>While in the file, we recommend using the following settings to catch issues:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">FreeRTOSConfig.h</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">configCHECK_FOR_STACK_OVERFLOW</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">vAssertCalled</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">file</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> line</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">configASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression keyword" style="color:#c5a5c5">if</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression operator" style="color:#d7deea">==</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">0</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">vAssertCalled</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression constant" style="color:#5a9bcf">__FILE__</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression constant" style="color:#5a9bcf">__LINE__</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="capture-the-required-freertos-variables-for-thread-decode">Capture the Required FreeRTOS Variables for Thread Decode<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#capture-the-required-freertos-variables-for-thread-decode" class="hash-link" aria-label="Direct link to Capture the Required FreeRTOS Variables for Thread Decode" title="Direct link to Capture the Required FreeRTOS Variables for Thread Decode" translate="no">​</a></h4><p>Follow the instructions on
<a class="" href="https://docs.memfault.com/docs/mcu/rtos-analysis#how-to-capture-the-required-variables">the RTOS Analysis page</a>
to capture the necessary RTOS variables for thread decode in coredumps.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-freertos-port-on-boot">Initialize FreeRTOS Port on Boot<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#initialize-freertos-port-on-boot" class="hash-link" aria-label="Direct link to Initialize FreeRTOS Port on Boot" title="Direct link to Initialize FreeRTOS Port on Boot" translate="no">​</a></h4><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">#include "memfault/components.h"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+ #include "memfault/ports/freertos.h"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">//...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">int memfault_platform_boot(void) {</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+ memfault_freertos_port_boot();</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  memfault_build_info_dump();</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-configure-freertos-task-capture-size">Optional: Configure FreeRTOS Task Capture Size<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#optional-configure-freertos-task-capture-size" class="hash-link" aria-label="Direct link to Optional: Configure FreeRTOS Task Capture Size" title="Direct link to Optional: Configure FreeRTOS Task Capture Size" translate="no">​</a></h4><p>If the platform is configured to not capture all of RAM (due to storage or
bandwidth limitations), it's still possible to capture the active FreeRTOS tasks
as part of a coredump. See
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/freertos/src/memfault_freertos_ram_regions.c" target="_blank" rel="noopener noreferrer" class="">this file</a>
for details on that implementation.</p><p>With that in place, the Memfault SDK will selectively capture the running tasks
during a coredump by saving both the Task Control Block (TCB) structure as well
as a limited backtrace for each task.</p><p>By default, as of <code>0.39.0</code>, the Memfault SDK will capture a truncated copy of
each TCB, which saves space in the coredump. See below for more details on this.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><p></p><summary>TCB structure capture size</summary>
Under some configurations, the TCB structures consume significant amounts of
coredump space (300-1000 bytes per TCB). To mitigate this problem, as of the
Memfault Firmware SDK v0.37.1, a configuration option
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/components/include/memfault/default_config.h#L566-L583" target="_blank" rel="noopener noreferrer" class=""><code>MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE</code></a>
is available for fine-tuning the captured FreeRTOS TCB size. This can usually be
set to 100 bytes, but please confirm for your system by examining the full size
of the <code>TCB_t</code> data structure; for example, using the <code>pahole</code> tool as shown
below. Memfault requires the struct members through <code>pcTaskName</code> to decode the
task.<p></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># note- the 'tskTaskControlBlock' is the actual type name for the 'TCB_t' struct</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">❯ pahole -C 'tskTaskControlBlock' ./build/memfault-esp32-demo-app.elf.memfault_log_fmt</span><br></span></code></pre></div></div><p>The unused <code>xNewLib_reent</code> member below is 240 bytes out of the total 352 byte
struct size.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">tskTaskControlBlock</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> StackType_t  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">    pxTopOfStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*     0     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        xMPU_SETTINGS              xMPUSettings</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*     4     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        ListItem_t                 xStateListItem</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*     8    20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        ListItem_t                 xEventListItem</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    28    20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxPriority</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">           </span><span class="token comment" style="color:#999999">/*    48     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        StackType_t </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">              pxStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">              </span><span class="token comment" style="color:#999999">/*    52     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain">                       pcTaskName</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">16</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    56    16 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        BaseType_t                 xCoreID</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">              </span><span class="token comment" style="color:#999999">/*    72     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        StackType_t </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">              pxEndOfStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*    76     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxTCBNumber</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">          </span><span class="token comment" style="color:#999999">/*    80     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxTaskNumber</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*    84     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxBasePriority</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    88     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxMutexesHeld</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">        </span><span class="token comment" style="color:#999999">/*    92     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">                     pvThreadLocalStoragePointers</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*    96     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        TlsDeleteCallbackFunction_t pvThreadLocalStoragePointersDelCallback</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*   100     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">_reent</span><span class="token plain">              xNewLib_reent</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">        </span><span class="token comment" style="color:#999999">/*   104   240 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain">   ulNotifiedValue</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">    </span><span class="token comment" style="color:#999999">/*   344     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">   ucNotifyState</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*   348     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">                    ucStaticallyAllocated</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*   349     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">                    ucDelayAborted</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*   350     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* size: 352, cachelines: 6, members: 20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* padding: 1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* last cacheline: 32 bytes */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div><p>If the default capture size is too small, it can be adjusted using the
<code>MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE</code> config value in
<code>memfault_platform_config.h</code>.</p></div></div></details></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-assert-handler">Register Assert Handler<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#register-assert-handler" class="hash-link" aria-label="Direct link to Register Assert Handler" title="Direct link to Register Assert Handler" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Memfault SDK 1.4.1+</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Memfault SDK &lt;1.4.1</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Memfault Firmware SDK v1.4.1 automatically hooks into the C library assert
handlers:</p><ul>
<li class=""><code>__assert_func</code> (Newlib C library)</li>
<li class=""><code>__aeabi_assert</code> (IAR and ARM C libraries)</li>
</ul><p>If you are using a different C library, you will need to hook into the assert
handler, see the tab for "Memfault SDK &lt;1.4.1" for more details.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Memfault can automatically capture crash information on asserts by calling
<code>MEMFAULT_ASSERT()</code> from your platforms assert handler:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/panics/assert.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">YOUR_PLATFORM_ASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newlib-c-library-asserth">Newlib C library assert.h<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#newlib-c-library-asserth" class="hash-link" aria-label="Direct link to Newlib C library assert.h" title="Direct link to Newlib C library assert.h" translate="no">​</a></h3><p>If your platform is using the <code>assert()</code> or <code>abort()</code> calls directly from a libc
implementation, you should override the implementations to call
<code>MEMFAULT_ASSERT</code>.</p><p>To accomplish this with Newlib C library (bundled as the default with most
compilers), we recommend adding the following to a C File in your project:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file assert_overrides.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;assert.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;stdlib.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">__assert_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">file</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> line</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                   </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">func</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">failedexpr</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">_exit</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> status</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Memfault advises <strong>against</strong> calling <code>assert()</code> directly from a project.
Instead, we suggest using the <code>MEMFAULT_ASSERT(x)</code> macro provided by the
Memfault SDK. Benefits include:</p><ul>
<li class="">making it easier to swap out behavior for different environments such as
compile code for a unit test versus a real target.</li>
<li class="">leading to substantial code space savings by enabling the removal of assert
conditions passed via the <code>failedexpr</code> arg.</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-a-unique-identifier-to-target">Add a Unique Identifier to target<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-a-unique-identifier-to-target" class="hash-link" aria-label="Direct link to Add a Unique Identifier to target" title="Direct link to Add a Unique Identifier to target" translate="no">​</a></h3>
<p>Memfault has facilities for capturing a unique identifier automatically as part
of the build process. This information is used by Memfault's cloud
infrastructure to ensure the symbol file uploaded matches the data reported in a
coredump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>A longer discussion about firmware versioning best practices and build
identifiers
<a href="https://interrupt.memfault.com/blog/release-versioning#gnu-build-id" target="_blank" rel="noopener noreferrer" class="">can be found here</a>.</p></div></div>
<p>Memfault has two ways to add a Build ID to a target. Select the appropriate one
below based on your toolchain setup.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">GNU Build Id Linker Flag + Snippet</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Memfault Build Id Python Script</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Requires use of the GNU GCC or Clang compiler.</p></div></div><ol>
<li class="">Add <code>-Wl,--build-id=sha1</code> to flags passed to linker via GCC/Clang</li>
<li class="">Add <code>#define MEMFAULT_USE_GNU_BUILD_ID 1</code> to
<code>third_party/memfault/memfault_platform_config.h</code></li>
<li class="">Add the following snippet to your projects linker script (<code>.ld</code> file) where
"&lt;YOUR_FLASH_SECTION&gt;" below will match the name of the MEMORY section that
read-only data and text is placed in.</li>
</ol><div class="language-linker-script codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-linker-script codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id </span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        __start_gnu_build_id_start </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token location-counter important" style="font-weight:400">.</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token function" style="color:#79b6f2">KEEP</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token plain">YOUR_FLASH_SECTION</span><span class="token operator" style="color:#d7deea">&gt;</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>&lt;YOUR_FLASH_SECTION&gt;</code> to match the name of the section
<code>.text</code> is placed in!</p></div></div><p>The <code>.note.gnu.build-id</code> output section name is used to locate the Build ID when
the symbol file is uploaded. The <code>__start_gnu_build_id_start</code> identifier is used
at compile time by the SDK for populating the Build ID.</p><p>See the
<a href="https://github.com/memfault/memfault-firmware-sdk/tree/master/examples/freertos" target="_blank" rel="noopener noreferrer" class="">FreeRTOS example app</a>
in the Memfault SDK for a reference implementation!</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Update your build system to invoke the <code>scripts/fw_build_id.py</code> script on your
ELF as part of a post-build step.</p><p>For example, using CMake, this can be achieved by adding a custom command to the
target:</p><div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">add_custom_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">TARGET </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token plain">YOUR_EXECUTABLE_NAME</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> POST_BUILD</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  COMMAND python </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/scripts/fw_build_id.py </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token plain">YOUR_EXECUTABLE_NAME</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The script depends on <code>pyelftools</code> so make sure you have run
<code>pip install pyelftools</code> or added it to your <code>requirements.txt</code></p></div></div><p>See the
<a href="https://github.com/memfault/memfault-firmware-sdk/tree/master/examples/esp32" target="_blank" rel="noopener noreferrer" class="">ESP32 example app</a>
in the Memfault SDK for a reference implementation!</p><p>For projects using IAR EWARM, see the instructions below for adding a post-build
action:</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><ol>
<li class="">
<p>Install Python (eg python3.9 from the Microsoft app store)</p>
</li>
<li class="">
<p>Install the <code>pyelftools</code> Python package by:</p>
<ol>
<li class="">Open git bash or cmd.exe</li>
<li class=""><code>python3.9.exe -m pip install pyelftools==0.27</code></li>
</ol>
</li>
<li class="">
<p>Then add the appropriate post-build action, for example:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># double check the path to the `fw_build_id.py` script</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">python3.9.exe $PROJ_DIR$/third-party/memfault-firmware-sdk/scripts/fw_build_id.py $TARGET_PATH$</span><br></span></code></pre></div></div>
</li>
</ol><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The Output Converter utility runs before the post-build actions, so it will
always generate output with a missing Build Id. Instead, invoke <code>ielftool</code>
<strong>after</strong> Memfault Build Id insertion to ensure the binary has a Build Id. Refer
to the
<a href="https://www.iarsys.co.jp/download/LMS2/arm/7502/ewarm7502doc/arm/doc/EWARM_DevelopmentGuide.ENU.pdf" target="_blank" rel="noopener noreferrer" class="">IAR EWARM Manual (PDF warning)</a>
for more information on using <code>ielftool</code>.</p><p>Additionally, Build Actions in IAR EWARM are batched, so to ensure Memfault
Build Id insertion and binary output conversion execute in the proper order,
invoke a separate script wrapping calls to <code>fw_build_id.py</code> and <code>ielftool</code>.</p></div></div> <figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/iar-post-build-id.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/iar-post-build-id.png" class="image_e9uR"></a></figure></div></div></details></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="confirm-integration-links">Confirm Integration Links<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#confirm-integration-links" class="hash-link" aria-label="Direct link to Confirm Integration Links" title="Direct link to Confirm Integration Links" translate="no">​</a></h3>
<p>At this point, your project should compile and be able to boot. On startup you
should see some messaging like the following print when
<code>memfault_platform_boot()</code> is called:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Build ID: cefaeb9407ab0dac7a5efe9fd510618ee21e9df7</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] S/N: MFLT0123</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW type: app-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW version: 1.0.0+cefaeb940</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] HW version: dvt1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Reason, RESETREAS=0x4</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Causes:</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I]  Software</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Initialized!</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hello-memfault-manually-upload-reboot-event">3. "Hello Memfault" Manually Upload Reboot Event<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#hello-memfault-manually-upload-reboot-event" class="hash-link" aria-label="Direct link to 3. &quot;Hello Memfault&quot; Manually Upload Reboot Event" title="Direct link to 3. &quot;Hello Memfault&quot; Manually Upload Reboot Event" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-test-commands-to-cli">Add Test Commands to CLI<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-test-commands-to-cli" class="hash-link" aria-label="Direct link to Add Test Commands to CLI" title="Direct link to Add Test Commands to CLI" translate="no">​</a></h3>
<p>The Memfault SDK functionality can be easily exercised via CLI test commands.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If your platform does not have a CLI, these commands can also be wired up to a
button press or called from <code>main()</code> on bootup from a test image</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-platform-ports">Test platform ports<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#test-platform-ports" class="hash-link" aria-label="Direct link to Test platform ports" title="Direct link to Test platform ports" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_logging</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Debug log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Info log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Warning log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Error log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Runs a sanity test to confirm coredump port is working as expected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_coredump_storage</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Note: Coredump saving runs from an ISR prior to reboot so should</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// be safe to call with interrupts disabled.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_disable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_begin</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_enable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_finish</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-core-sdk-functionality">Test core SDK functionality<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#test-core-sdk-functionality" class="hash-link" aria-label="Direct link to Test core SDK functionality" title="Direct link to Test core SDK functionality" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Triggers an immediate heartbeat capture (instead of waiting for timer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// to expire)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_heartbeat</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_metrics_heartbeat_debug_trigger</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_trace</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_TRACE_EVENT_WITH_LOG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">critical_error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"A test error trace!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Trigger a user initiated reboot and confirm reason is persisted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_mark_reset_imminent</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">kMfltRebootReason_UserReset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-different-crash-types-where-a-coredump-should-be-captured">Test different crash types where a coredump should be captured<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#test-different-crash-types-where-a-coredump-should-be-captured" class="hash-link" aria-label="Direct link to Test different crash types where a coredump should be captured" title="Direct link to Test different crash types where a coredump should be captured" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_assert</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_fault</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">bad_func</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token number" style="color:#5a9bcf">0xEEEEDEAD</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">bad_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_hang</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dump Memfault data collected to console</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_export</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-local-debug-setup">Post Data to Cloud via Local Debug Setup<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#post-data-to-cloud-via-local-debug-setup" class="hash-link" aria-label="Direct link to Post Data to Cloud via Local Debug Setup" title="Direct link to Post Data to Cloud via Local Debug Setup" translate="no">​</a></h3>
<p>Prior to having an end-to-end transport in place, Memfault data can be exported
over any serial connection or via GDB directly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-to-memfault">Post Chunks To Memfault<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#post-chunks-to-memfault" class="hash-link" aria-label="Direct link to Post Chunks To Memfault" title="Direct link to Post Chunks To Memfault" translate="no">​</a></h4>
<p>All data collected by Memfault can be exported as opaque packets called
"chunks". To trigger an export, call the <code>test_export</code> command added to your
device CLI.</p>
<p>If data has been collected, you will see strings with the format:
<code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:01] INFO: System Booting!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:02] INFO: Memfault Build ID: d8d6a047282f025fffa29fa767100f310bc40f80</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Copy the logs from the console, navigate to the
<a href="https://mflt.io/chunks-debug" target="_blank" rel="noopener noreferrer" class="">"Integration Hub / Chunks Debug"</a> view for your
project, and paste the logs:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Next" to review the chunks that were identified and (optionally) update
the "Device Serial" being used to report data:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Post" to submit the chunks to Memfault. The chunks will appear in the
view directly below. Check and make sure there are no "Errors" to address.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" class="image_e9uR"></a></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-automate-chunk-posting">(Optional) Automate Chunk Posting<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#optional-automate-chunk-posting" class="hash-link" aria-label="Direct link to (Optional) Automate Chunk Posting" title="Direct link to (Optional) Automate Chunk Posting" translate="no">​</a></h4>
<p>Posting chunks from a local setup can be automated using our CLI tool or GDB
script.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This strategy can also be used even when an end-to-end transport is in place for
local QA testing or in CI/CD test automation setups.</p></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Automated Posting Options </summary><div><div class="collapsibleContent_i85q"><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite-project-key-from-memfault-ui">Prerequisite: Project Key from Memfault UI<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#prerequisite-project-key-from-memfault-ui" class="hash-link" aria-label="Direct link to Prerequisite: Project Key from Memfault UI" title="Direct link to Prerequisite: Project Key from Memfault UI" translate="no">​</a></h5><p>A Project key will be needed in order to communicate with Memfault's web
services. Go to <a href="https://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">https://app.memfault.com/</a>, navigate
to the project you want to use and select 'Settings'→'General'. The 'Project
Key' listed is what you will want to use.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With Desktop CLI Tool </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-the-python-memfault-cli-tool">Install the Python Memfault CLI Tool<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#install-the-python-memfault-cli-tool" class="hash-link" aria-label="Direct link to Install the Python Memfault CLI Tool" title="Direct link to Install the Python Memfault CLI Tool" translate="no">​</a></h3>
<p>The <a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault Desktop CLI tool</a>. tool is written
in Python and published publicly in the
<a href="https://pypi.org/project/memfault-cli/" target="_blank" rel="noopener noreferrer" class="">Python Package Index (pypi)</a>.</p>
<p>To install it, make sure you have a recent version of Python 3.x installed and
run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ pip3 install memfault-cli</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --help</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="save-device-logs-to-file">Save device logs to file<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#save-device-logs-to-file" class="hash-link" aria-label="Direct link to Save device logs to file" title="Direct link to Save device logs to file" translate="no">​</a></h3>
<p>Start your console with your favorite terminal client. Let the system run for a
bit, periodically dumping data to the console by calling
<code>memfault_data_export_dump_chunks()</code>.</p>
<p>You should see strings with the format: <code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command recording a reboot reason, then rebooting the system</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] GNU Build ID: 3c92e3313fe1c9d00ac8687ce966d5f527a05ed3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] S/N: freertos-example</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW type: qemu-app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] HW version: qemu-mps2-an385</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command capturing a trace event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks()`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Save the resulting logs to a file such as <code>logs.txt</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-from-logs-with-memfault-cli">Post chunks from logs with Memfault CLI<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#post-chunks-from-logs-with-memfault-cli" class="hash-link" aria-label="Direct link to Post chunks from logs with Memfault CLI" title="Direct link to Post chunks from logs with Memfault CLI" translate="no">​</a></h3>
<p>Run the desktop Memfault CLI tool on your saved log file. The utility will parse
the logs, extract the Memfault data, and post it for processing!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --project-key ${YOUR_PROJECT_KEY} post-chunk --encoding sdk_data_export logs.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Found 2 Chunks. Sending Data ...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Success</span><br></span></code></pre></div></div></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With GDB </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">You need to have a way to debug your product with GDB as part of your
development setup</li>
<li class="">The GDB version you are using needs to have the
<a href="https://interrupt.memfault.com/blog/automate-debugging-with-gdb-python-api#getting-started-with-gdb-python" target="_blank" rel="noopener noreferrer" class="">GDB Python API enabled</a>.
(It's generally the default or there is a <code>-py</code> version of GDB which has it
included.)</li>
<li class="">You need to compile your firmware with debug symbol information (i.e <code>-g</code>
CFLAG)</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Even if you are using other compilers such as ARMCC or IAR, you can load the ELF
(.out, .elf) generated and debug it in GDB as well.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launch-gdb-and-connect-debugger">Launch GDB and connect debugger<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#launch-gdb-and-connect-debugger" class="hash-link" aria-label="Direct link to Launch GDB and connect debugger" title="Direct link to Launch GDB and connect debugger" translate="no">​</a></h3>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ arm-none-eabi-gdb-py my_app.elf --ex="target remote :3333"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-memfault-gdb-script">Load Memfault GDB script<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#load-memfault-gdb-script" class="hash-link" aria-label="Direct link to Load Memfault GDB script" title="Direct link to Load Memfault GDB script" translate="no">​</a></h3>
<p>Copy and paste and run the following in gdb:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python exec('try:\n from urllib2 import urlopen\nexcept:\n from urllib.request import urlopen'); exec(urlopen('https://app.memfault.com/static/scripts/memfault_gdb.py').read())</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Some GDB versions do not support Python scripting by default. If you see a
message like "Python scripting is not supported in this copy of GDB", you might
be able to run an alternative GDB binary with a -py suffix, for example
arm-none-eabi-gdb-py.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-handler">Register Handler<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#register-handler" class="hash-link" aria-label="Direct link to Register Handler" title="Direct link to Register Handler" translate="no">​</a></h3>
<p>Copy the command below and paste it into GDB and hit enter. This will load a
handler which automatically posts data to Memfault whenever
<code>memfault_data_export_dump_chunks</code> is called.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault install_chunk_handler --verbose --project-key &lt;YOUR_PROJECT_KEY&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>memfault_data_export_dump_chunks()</code> needs to be called by your port as part of
a CLI command or periodic task in order for the data to be extracted. For
example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">export_data_cli_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">some_periodic_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try It Out!<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#try-it-out" class="hash-link" aria-label="Direct link to Try It Out!" title="Direct link to Try It Out!" translate="no">​</a></h3>
<p>Now, every time <code>memfault_data_export_dump_chunks</code> is called, the data passed as
a parameter to the function will automatically be posted to the Memfault cloud.
You don't have to do anything else! You will see logs print in the gdb CLI as
data is posted:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb) Continuing.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 45 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 53 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[...]</span><br></span></code></pre></div></div></div></div></details></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-a-coredump">4. Manually Capture a Coredump<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#manually-capture-a-coredump" class="hash-link" aria-label="Direct link to 4. Manually Capture a Coredump" title="Direct link to 4. Manually Capture a Coredump" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h3>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-exception-handler-implementations">Check Exception Handler Implementations<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#check-exception-handler-implementations" class="hash-link" aria-label="Direct link to Check Exception Handler Implementations" title="Direct link to Check Exception Handler Implementations" translate="no">​</a></h3>
<p>Memfault provides exception handler implementations that need to be invoked via
the system's vector table. The SDK by default provides implementations for these
handlers using the CMSIS standard names:</p>
<ul>
<li class="">HardFault_Handler</li>
<li class="">MemoryManagement_Handler</li>
<li class="">BusFault_Handler</li>
<li class="">UsageFault_Handler</li>
<li class="">NMI_Handler</li>
<li class="">MemfaultWatchdog_Handler</li>
</ul>
<p>Typically the default implementations will be weakly defined, so the Memfault
implementations will automatically be used. It may be necessary to mark the
default implementation with the appropriate <code>weak</code> annotation, or delete the
default implementations altogether so the Memfault implementations can be used.</p>
<p>If the entries in the vector table for those handlers are named differently,
either change the names to match the CMSIS standard ones, or set the necessary
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/920a1ee607963206901615ac2f395e3124e7c3a6/components/include/memfault/default_config.h#L366-L388" target="_blank" rel="noopener noreferrer" class="">config options</a>
in <code>memfault_platform_config.h</code> to override the names.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-logs">5. Manually Capture Logs<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#manually-capture-logs" class="hash-link" aria-label="Direct link to 5. Manually Capture Logs" title="Direct link to 5. Manually Capture Logs" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="logging-dependency">Logging Dependency<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#logging-dependency" class="hash-link" aria-label="Direct link to Logging Dependency" title="Direct link to Logging Dependency" translate="no">​</a></h3>
<p>The Memfault SDK will (sparingly) emit diagnostic logs to alert of integration
configuration problems. The logging subsystem can also easily serve as logging
infrastructure for your own platform if you do not yet have one set up.</p>
<p>Based on your setup, choose one of the options below:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Platform does logging via Macros</summary><div><div class="collapsibleContent_i85q"><ol>
<li class="">Add <code>#define MEMFAULT_PLATFORM_HAS_LOG_CONFIG 1</code> to
<code>third_party/memfault/memfault_platform_config.h</code></li>
<li class="">Remap Memfault logging macros to platform logging macros by adding the
following macros to the <code>memfault_platform_log_config.h</code> file created
earlier.</li>
</ol><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_log_config.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_DEBUG_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf">  </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_INFO_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">  fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf">  </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_WARN_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_ERROR_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Platform has no logging or uses printf()</summary><div><div class="collapsibleContent_i85q"><p>Implement <code>memfault_platform_log()</code> in
<code>third_party/memfault/memfault_platform_port.c</code>. For example,</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_log</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">eMemfaultPlatformLogLevel level</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  va_list args</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">va_start</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">128</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vsnprintf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">lvl_str</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Debug</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"D"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Info</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"I"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Warning</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"W"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Error</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"E"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vsnprintf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_printf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"[%s] MFLT: %s\n"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> lvl_str</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></details>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If you are using the <a class="" href="https://docs.memfault.com/docs/mcu/demo-cli">Memfault Demo CLI</a> in your project,
see the information on that page for other dependencies.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-standard-metrics">6. Configuring Standard Metrics<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#configuring-standard-metrics" class="hash-link" aria-label="Direct link to 6. Configuring Standard Metrics" title="Direct link to 6. Configuring Standard Metrics" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To process device data, Memfault requires a matching uploaded Symbol File. See
<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#upload-symbol-file" class="">"Upload Symbol File</a> for details.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="timer-dependencies">Timer Dependencies<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#timer-dependencies" class="hash-link" aria-label="Direct link to Timer Dependencies" title="Direct link to Timer Dependencies" translate="no">​</a></h3>
<p>The memfault metric subsystem requires a repeating timer in order to collect
"heartbeats" and a time since boot</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">FreeRTOS</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_metrics_freertos.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/memfault_platform_metrics.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><p>Implement the following function for your MCU. The ports listed in other tabs
serve as a good reference.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_metrics_timer_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> period_sec</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> MemfaultPlatformTimerCallback callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Schedule a timer to invoke callback() repeatedly after period_sec</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">uint64_t</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_time_since_boot_ms</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Return time since boot in ms, this is used for relative timings.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-custom-metrics">Configure Metrics<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#configure-custom-metrics" class="hash-link" aria-label="Direct link to Configure Metrics" title="Direct link to Configure Metrics" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To process device data, Memfault requires a matching uploaded Symbol File. See
<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#upload-symbol-file" class="">"Upload Symbol File</a> for details.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-first-heartbeat">Define First Heartbeat<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#define-first-heartbeat" class="hash-link" aria-label="Direct link to Define First Heartbeat" title="Direct link to Define First Heartbeat" translate="no">​</a></h3>
<p>Heartbeat metrics allow you to easily monitor your platform and confirm it is
operating as expected.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Typical Heartbeat Examples</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">investigate problems that didn't cause a reboot (bad connectivity, network or
sensor error rates) and marginality that crops up in a fleet</li>
<li class="">providing leading indicators of problems (rapid battery drain, drop in
activity, etc)</li>
<li class="">compare trends across releases (improved connectivity, data efficiency etc)</li>
</ul><p>Best Practices around each metric type that we recommend:</p><ul>
<li class="">Timers - These are used to track time spent in particular states and can be
used for debugging connectivity, battery life, and performance issues.</li>
<li class="">Counters - Track counts of a particular event class taking place. Suggested
use cases are:<!-- -->
<ul>
<li class="">Operations your system are performing (number of events serviced by a task,
bytes sent over network, bytes written to flash). Alerts can be configured
to identify devices operating outside normal thresholds.</li>
<li class="">Counts of events for events that should never happen (i2c bus write error
count, flash write error). You can alert if any of these situations are
seen.</li>
</ul>
</li>
<li class="">Gauges - These are values sampled at the end of each Heartbeat interval.
Common items include<!-- -->
<ul>
<li class="">Battery Metrics (Drop over an hour, current percent)</li>
<li class="">Heap utilization / stack high watermark</li>
</ul>
</li>
</ul></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-metric-to-memfault_metrics_heartbeat_configdef">Add Metric to memfault_metrics_heartbeat_config.def<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#add-metric-to-memfault_metrics_heartbeat_configdef" class="hash-link" aria-label="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" title="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_metrics_heartbeat_config.def</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_METRICS_KEY_DEFINE</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> kMemfaultMetricType_Unsigned</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="instrument-code-to-update-heartbeat">Instrument Code to Update Heartbeat<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#instrument-code-to-update-heartbeat" class="hash-link" aria-label="Direct link to Instrument Code to Update Heartbeat" title="Direct link to Instrument Code to Update Heartbeat" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">my_main_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">your_rtos_wait_for_event</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">MEMFAULT_METRIC_ADD</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatically-upload-data">7. Automatically Upload Data<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#automatically-upload-data" class="hash-link" aria-label="Direct link to 7. Automatically Upload Data" title="Direct link to 7. Automatically Upload Data" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-device-transport">Post Data to Cloud via Device Transport<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#post-data-to-cloud-via-device-transport" class="hash-link" aria-label="Direct link to Post Data to Cloud via Device Transport" title="Direct link to Post Data to Cloud via Device Transport" translate="no">​</a></h3>
<p>Extensive details about how data from the Memfault SDK makes it to the cloud
<a class="" href="https://docs.memfault.com/docs/mcu/data-from-firmware-to-the-cloud">can be found here</a>. In short, the
Memfault SDK packetizes data into "chunks" that must be pushed to the Memfault
cloud via the
<a href="https://api-docs.memfault.com/?version=latest#66b0e390-2c3e-4c0d-b6c2-836a287b9e5f" target="_blank" rel="noopener noreferrer" class="">chunk REST endpoint</a>.</p>
<p>The Memfault SDK exposes an API that packetizes Memfault data into "chunks".
These "chunks" need to be forwarded to the Memfault Cloud (either directly via
HTTPS or indirectly via a gateway device such as a computer or mobile
application)</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you cannot post data directly using HTTP, no problem at all. In fact, that is
one of the most common configurations. In these setups, data can be proxied from
the MCU to a device which can perform a HTTP request over transports such as
UART, BLE, COAP, LoRa, Zigbee, etc). The size of a "chunk" is fully configurable
and can be tuned to best match your transport requirements. All message
re-assembly is dealt with by Memfault in the cloud.</p></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// buffer to copy chunk data into</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">USER_CHUNK_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> buf_len </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  bool data_available </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_packetizer_get_chunk</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token plain">data_available </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no more data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// send payload collected to chunks endpoint</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">user_transport_send_chunk_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token function" style="color:#79b6f2">memfault_packetizer_data_available</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no new data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// [... user specific logic deciding when &amp; how much data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>See the docs on
<a class="" href="https://docs.memfault.com/docs/troubleshooting/data-transfer-troubleshooting">data transfer troubleshooting</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">8. Next Steps<a href="https://docs.memfault.com/embed/mcu/arm-cortex-m-guide#next-steps" class="hash-link" aria-label="Direct link to 8. Next Steps" title="Direct link to 8. Next Steps" translate="no">​</a></h2>
<p>Now that the Memfault SDK is integrated on your device, there are many other
features and options to explore. Check out these sections of our docs for more
information:</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Core Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Advanced Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/best-practices">Best Practices</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/web-app">Web App</a></li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Embedded Integration Guide]]></title>
        <id>https://docs.memfault.com/embed/mcu/embedded-self-serve</id>
        <link href="https://docs.memfault.com/embed/mcu/embedded-self-serve"/>
        <updated>2021-06-16T17:59:53.000Z</updated>
        <content type="html"><![CDATA[
<p>The following guide will walk you through step-by-step how to integrate and test
the Memfault SDK for a Cortex-M device using the GNU GCC, Clang, IAR, ARM MDK,
or TI ARM Compiler.</p>
<p>Adding the Memfault Firmware SDK to your device will provide rich diagnostics,
including:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="coredump-collection"><a class="" href="https://docs.memfault.com/docs/mcu/coredumps">Coredump Collection</a><a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#coredump-collection" class="hash-link" aria-label="Direct link to coredump-collection" title="Direct link to coredump-collection" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/logs-with-coredump.png" class="image_e9uR" alt="Example coredump collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-metrics"><a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Device Metrics</a><a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#device-metrics" class="hash-link" aria-label="Direct link to device-metrics" title="Direct link to device-metrics" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/device-timeline-metrics.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/device-timeline-metrics.png" class="image_e9uR" alt="Device metrics collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reboot-reason-tracking"><a class="" href="https://docs.memfault.com/docs/mcu/reboot-reason-tracking">Reboot Reason Tracking</a><a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#reboot-reason-tracking" class="hash-link" aria-label="Direct link to reboot-reason-tracking" title="Direct link to reboot-reason-tracking" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/reboot-reason-chart.png" class="image_e9uR" alt="Reboot reasons collected with Memfault" width="800"></a></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-tracking-with-trace-events"><a class="" href="https://docs.memfault.com/docs/mcu/trace-events">Error Tracking with Trace Events</a><a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#error-tracking-with-trace-events" class="hash-link" aria-label="Direct link to error-tracking-with-trace-events" title="Direct link to error-tracking-with-trace-events" translate="no">​</a></h3>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/trace-reason-example.png" class="image_e9uR" alt="Trace Events collected with Memfault" width="800"></a></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="optionally-collect-a-coredump-capture-using-gdb">(Optionally) Collect a coredump capture using GDB<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#optionally-collect-a-coredump-capture-using-gdb" class="hash-link" aria-label="Direct link to (Optionally) Collect a coredump capture using GDB" title="Direct link to (Optionally) Collect a coredump capture using GDB" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Without GDB</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Using GDB</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>If you do not use GDB, skip ahead to the next step.</p></div><div role="tabpanel" class="tabItem_Ymn6"><p>If you use GDB, a full coredump can be captured by just using the debugger! This
can be useful during development to take advantage of Memfault's analyzers when
a device crashes or hangs.</p><figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/try-flow.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/try-flow.png" class="image_e9uR"></a></figure><p>To perform the capture, navigate to <a href="http://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">http://app.memfault.com/</a> and select the
"Issues" page in the Memfault UI, click on the "Manual Upload" button, and click
on "walk-through on how to upload your first coredump". From there you can
follow the guided steps to perform a capture. At the end you will see an
analysis of your system state.</p></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-project">1. Create a Project<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#create-a-project" class="hash-link" aria-label="Direct link to 1. Create a Project" title="Direct link to 1. Create a Project" translate="no">​</a></h2>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="set-up-the-sdk">2. Set up the SDK<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#set-up-the-sdk" class="hash-link" aria-label="Direct link to 2. Set up the SDK" title="Direct link to 2. Set up the SDK" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-folder-for-memfault-firmware-sdk-port">Prepare folder for memfault-firmware-sdk &amp; port<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#prepare-folder-for-memfault-firmware-sdk-port" class="hash-link" aria-label="Direct link to Prepare folder for memfault-firmware-sdk &amp; port" title="Direct link to Prepare folder for memfault-firmware-sdk &amp; port" translate="no">​</a></h3>
<p>The <code>memfault-firmware-sdk</code> is a self-contained C SDK you will need to include
into your project.</p>
<p>Create a folder to hold <code>memfault-firmware-sdk</code> as well as the configuration and
porting files to your platform.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">cd ${YOUR_PROJECT_DIR}</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">mkdir -p third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cd third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># Add memfault repo as submodule, subtree, or copy in as source directly</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">git submodule add https://github.com/memfault/memfault-firmware-sdk.git memfault-firmware-sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">cp memfault-firmware-sdk/ports/templates/* .</span><br></span></code></pre></div></div>
<p>When you are done, you should have the following directory structure in your
project:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault/</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">//...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault-firmware-sdk (submodule)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">| # Files where port / glue layer to your platform will be implemented</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault_platform_port.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">|</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">| # Configuration Headers</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">├── memfault_metrics_heartbeat_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_trace_reason_user_config.def</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_platform_log_config.h</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">└── memfault_platform_config.h</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-sources-to-build-system">Add Sources to Build System<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-sources-to-build-system" class="hash-link" aria-label="Direct link to Add Sources to Build System" title="Direct link to Add Sources to Build System" translate="no">​</a></h3>
<p>Based on the build system you are using, expand the appropriate tab below and
follow the steps to add the sources to your target</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Make</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">CMake</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_PORT_ROOT </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> &lt;YOUR_PROJECT_ROOT&gt;/third_party/memfault</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_SDK_ROOT </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/memfault-firmware-sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MEMFAULT_COMPONENTS </span><span class="token operator" style="color:#d7deea">:=</span><span class="token plain"> core util panics metrics</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token plain"> </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/makefiles/MemfaultWorker.mk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">&lt;YOUR_SRC_FILES&gt; </span><span class="token operator" style="color:#d7deea">+=</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_COMPONENTS_SRCS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/memfault_platform_port.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">&lt;YOUR_INCLUDE_PATHS&gt; </span><span class="token operator" style="color:#d7deea">+=</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_COMPONENTS_INC_FOLDERS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain">/ports/</span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token variable" style="color:#d7deea">$</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>YOUR_SRC_FILES</code>, <code>YOUR_INCLUDE_PATHS</code>, and
<code>YOUR_PROJECT_ROOT</code> accordingly for your system above!</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token variable" style="color:#d7deea">MEMFAULT_PORT_ROOT</span><span class="token plain"> &lt;</span><span class="token variable" style="color:#d7deea">YOUR_PROJECT_ROOT</span><span class="token punctuation" style="color:#8dc891">&gt;</span><span class="token plain">/third_party/memfault</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_PORT_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/memfault-firmware-sdk</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">list</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">APPEND MEMFAULT_COMPONENTS core util panics metrics</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">include</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/cmake/Memfault.cmake</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">memfault_library</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> MEMFAULT_COMPONENTS</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> MEMFAULT_COMPONENTS_SRCS MEMFAULT_COMPONENTS_INC_FOLDERS</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Add the following to your target sources:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_COMPONENTS_SRCS}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_PORT_ROOT}/memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999"># Add the following to your target includes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_COMPONENTS_INC_FOLDERS}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_SDK_ROOT}/ports/include</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">#   ${MEMFAULT_PORT_ROOT}</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>YOUR_PROJECT_ROOT</code>, add <code>${MEMFAULT_COMPONENTS_SRCS}</code> to your
target sources and <code>${MEMFAULT_COMPONENTS_INC_FOLDERS}</code> to your target includes
accordingly</p></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><ol>
<li class="">add <code>$MEMFAULT_FIRMWARE_SDK/components/include</code> to the include paths for your
project</li>
<li class="">add <code>$MEMFAULT_FIRMWARE_SDK/ports/include</code> to the include paths for your
project</li>
<li class="">add the sources under
<code>$MEMFAULT_FIRMWARE_SDK/components/[core, util, panics, metrics]/src/**/*.c</code>
to your project</li>
<li class="">add <code>third_party/memfault/memfault_platform_port.c</code> sources to project</li>
<li class="">add <code>third_party/memfault/</code> to the include paths for your project</li>
</ol><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>When using Eclipse as your build system, folders can be opted out from a build
by right clicking on the folder and selecting "Resource Configuration" -&gt;
"Exclude from Build".</p></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-dependencies">Core Dependencies<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#core-dependencies" class="hash-link" aria-label="Direct link to Core Dependencies" title="Direct link to Core Dependencies" translate="no">​</a></h3>
<p>Open the
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/templates/memfault_platform_port.c" target="_blank" rel="noopener noreferrer" class=""><code>memfault_platform_port.c</code></a>
copied into your <code>third_party/memfault</code> folder and fill out the stub
implementations accordingly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-memfault-subsystem-on-bootup">Initialize Memfault Subsystem On Bootup<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#initialize-memfault-subsystem-on-bootup" class="hash-link" aria-label="Direct link to Initialize Memfault Subsystem On Bootup" title="Direct link to Initialize Memfault Subsystem On Bootup" translate="no">​</a></h4>
<p>From your main routine, add a call to <code>memfault_platform_boot()</code> prior to the
startup of an RTOS or baremetal while loop.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reboot-tracking-dependencies">Reboot Tracking Dependencies<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#reboot-tracking-dependencies" class="hash-link" aria-label="Direct link to Reboot Tracking Dependencies" title="Direct link to Reboot Tracking Dependencies" translate="no">​</a></h3>
<p>Memfault has a module for tracking and reporting what resets are taking place on
your platform.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">STM32</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP S32 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">EFM/EFR (Gecko SDK)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP RW610/611/612</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">SiLabs SiWx91x</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/resetreas_reboot_tracking.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubef4">STM32CubeF4<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubef4" class="hash-link" aria-label="Direct link to STM32CubeF4" title="Direct link to STM32CubeF4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/f4/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubef7">STM32CubeF7<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubef7" class="hash-link" aria-label="Direct link to STM32CubeF7" title="Direct link to STM32CubeF7" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/f7/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubeh7">STM32CubeH7<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubeh7" class="hash-link" aria-label="Direct link to STM32CubeH7" title="Direct link to STM32CubeH7" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/h7/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubel4">STM32CubeL4<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubel4" class="hash-link" aria-label="Direct link to STM32CubeL4" title="Direct link to STM32CubeL4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/l4/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubeu5">STM32CubeU5<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubeu5" class="hash-link" aria-label="Direct link to STM32CubeU5" title="Direct link to STM32CubeU5" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/u5/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32cubewb">STM32CubeWB<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32cubewb" class="hash-link" aria-label="Direct link to STM32CubeWB" title="Direct link to STM32CubeWB" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/stm32cube/wb/rcc_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/s32sdk/rcm_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/emlib/rmu_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nxp/rw61x/pmu_reboot_tracking.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/orts/silabs/wiseconnect/siwx91x/siwx91x_reboot_tracking.c</span><br></span></code></pre></div></div><p>As described in that file, you will need to add the following code to your
<code>Reset_Handler</code> implementation (or wherever your application calls
<code>SystemInit()</code>), for example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"si91x_device.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Reset_Handler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Load the global variable with the contents of MCU_FSM_WAKEUP_STATUS_REG</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">extern</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> memfault_siwx91x_fsm_wakeup_status_reg</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  memfault_siwx91x_fsm_wakeup_status_reg </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> MCU_FSM</span><span class="token operator" style="color:#d7deea">-&gt;</span><span class="token plain">MCU_FSM_WAKEUP_STATUS_REG</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Call SystemInit() to initialize the system</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">SystemInit</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Call the main function</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">main</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><p>Implement the following function for your MCU. The ports listed in other tabs
serve as a good reference.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> reset_cause </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// TODO: Populate with MCU reset reason</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  eMemfaultRebootReason reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> kMfltRebootReason_Unknown</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// TODO: Convert MCU specific reboot reason to memfault enum</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sResetBootupInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason_reg </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_cause</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">reset_reason </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> reset_reason</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="allocate-noinit-region--collect-reboot-info">Allocate noinit region &amp; Collect Reboot Info<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#allocate-noinit-region--collect-reboot-info" class="hash-link" aria-label="Direct link to Allocate noinit region &amp; Collect Reboot Info" title="Direct link to Allocate noinit region &amp; Collect Reboot Info" translate="no">​</a></h4>
<p>Add the following to your <code>memfault_platform_port.c</code></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_PUT_IN_SECTION</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">".noinit.mflt_reboot_tracking"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">MEMFAULT_REBOOT_TRACKING_REGION_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  sResetBootupInfo reset_info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_reason_get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">s_reboot_tracking</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">reset_info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's expected that <code>s_reboot_tracking</code> is placed in "noinit" RAM. That is, a
region of RAM not initialized on bootup or used by your bootloaders. This can be
achieved by adding a "noinit" section to your linker script.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-coredump-storage-dependency">Implement Coredump Storage Dependency<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#implement-coredump-storage-dependency" class="hash-link" aria-label="Direct link to Implement Coredump Storage Dependency" title="Direct link to Implement Coredump Storage Dependency" translate="no">​</a></h3>
<p>When the system faults or asserts crash information can be recorded and sent to
Memfault after the device reboots. In order for this information to be saved, it
must be persisted to a storage area that persists across a device reset.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="implement-coredump-storage-area">Implement Coredump Storage Area<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#implement-coredump-storage-area" class="hash-link" aria-label="Direct link to Implement Coredump Storage Area" title="Direct link to Implement Coredump Storage Area" translate="no">​</a></h4>
<p>Coredumps can be saved in a <code>.noinit</code> region of SRAM, internal flash, external
flash, or even streamed out over a peripheral to another MCU when a coredump
takes place.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">RAM-backed</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">EFM/EFR (Gecko SDK)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">STM32</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">NXP S32 SDK</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>1. Add source code</strong></p><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/panics/src/memfault_platform_ram_backed_coredump.c</span><br></span></code></pre></div></div><p><strong>2. Configure Coredump Region</strong></p><p>The RAM region is placed in a special section <code>.noinit.mflt_coredump</code> which
needs to be placed in a noinit memory region. This can be achieved by adding a
<code>noinit</code> section to your linker script. Check out the following examples for
your compiler/linker:</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>GNU GCC Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.ld</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> .noinit (NOLOAD): { KEEP(*(*.noinit.mflt*)) } &gt;RAM</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ARM MDK Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.sct</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">; Within previously defined Load Region, modify NOINIT_RAM address and length as necessary</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  NOINIT_RAM 0x20010000 UNINIT 0x00000200  { ;no init section</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    *(.noinit.mflt*)</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  }</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>IAR Example</summary><div><div class="collapsibleContent_i85q"><p>Add the following to your <code>.icf</code> file:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">do not initialize</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">{</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .noinit,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .stack,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> section .heap,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> /* Add line to a do not initialize directive */</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> rw section .noinit.mflt*,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">};</span><br></span></code></pre></div></div></div></div></details></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/emlib/msc_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/emlib/msc_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">msc_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32f4-internal-flash-using-stm32cubef4">STM32F4 internal flash using STM32CubeF4<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32f4-internal-flash-using-stm32cubef4" class="hash-link" aria-label="Direct link to STM32F4 internal flash using STM32CubeF4" title="Direct link to STM32F4 internal flash using STM32CubeF4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/f4/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/f4/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32l4-internal-flash-using-stm32cubel4">STM32L4 internal flash using STM32CubeL4<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32l4-internal-flash-using-stm32cubel4" class="hash-link" aria-label="Direct link to STM32L4 internal flash using STM32CubeL4" title="Direct link to STM32L4 internal flash using STM32CubeL4" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/l4/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/l4/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32wb-internal-flash-using-stm32cubewb">STM32WB internal flash using STM32CubeWB<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32wb-internal-flash-using-stm32cubewb" class="hash-link" aria-label="Direct link to STM32WB internal flash using STM32CubeWB" title="Direct link to STM32WB internal flash using STM32CubeWB" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/wb/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/wb/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="stm32u5-internal-flash-using-stm32cubeu5">STM32U5 internal flash using STM32CubeU5<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#stm32u5-internal-flash-using-stm32cubeu5" class="hash-link" aria-label="Direct link to STM32U5 internal flash using STM32CubeU5" title="Direct link to STM32U5 internal flash using STM32CubeU5" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/stm32cube/u5/flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/stm32cube/u5/flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">flash_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nrf5xx-internal-flash-using-nrf5-sdk">nRF5xx internal flash using nRF5 SDK<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#nrf5xx-internal-flash-using-nrf5-sdk" class="hash-link" aria-label="Direct link to nRF5xx internal flash using nRF5 SDK" title="Direct link to nRF5xx internal flash using nRF5 SDK" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/nrf5_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/nrf5_sdk/nrf5_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">nrf5_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nxp-s32-sdk">NXP S32 SDK<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#nxp-s32-sdk" class="hash-link" aria-label="Direct link to NXP S32 SDK" title="Direct link to NXP S32 SDK" translate="no">​</a></h4><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/s32sdk/ftfc_flash_coredump_storage.c</span><br></span></code></pre></div></div><p>Follow instructions in
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/s32sdk/ftfc_flash_coredump_storage.c#L9" target="_blank" rel="noopener noreferrer" class="">ftfc_flash_coredump_storage.c</a>
to configure.</p></div><div role="tabpanel" class="tabItem_Ymn6"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-port-template">Custom Port Template<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#custom-port-template" class="hash-link" aria-label="Direct link to Custom Port Template" title="Direct link to Custom Port Template" translate="no">​</a></h4><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_get_info</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMfltCoredumpStorageInfo </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">info </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">sMfltCoredumpStorageInfo</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">size </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* size of coredump storage area */</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_read</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                                             </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> read_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_erase</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> erase_size</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_write</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> offset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">data</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                                              </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> data_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_coredump_storage_clear</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rtos-port-files">RTOS Port Files<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#rtos-port-files" class="hash-link" aria-label="Direct link to RTOS Port Files" title="Direct link to RTOS Port Files" translate="no">​</a></h3>
<p>The Memfault SDK includes pre-canned integrations for RTOS environments. Expand
the tab for the one applies to your system below in order to pick them up.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> FreeRTOS Specific Sources </summary><div><div class="collapsibleContent_i85q"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-freertos-specific-sources-to-compilation">Add FreeRTOS-Specific Sources<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-freertos-specific-sources-to-compilation" class="hash-link" aria-label="Direct link to Add FreeRTOS-Specific Sources" title="Direct link to Add FreeRTOS-Specific Sources" translate="no">​</a></h4><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_core_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_freertos_ram_regions.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_metrics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_panics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_sdk_metrics_freertos.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_sdk_metrics_thread.c</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_self_test_platform.c</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-freertos-specific-include-path">Add FreeRTOS-Specific Include Path<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-freertos-specific-include-path" class="hash-link" aria-label="Direct link to Add FreeRTOS-Specific Include Path" title="Direct link to Add FreeRTOS-Specific Include Path" translate="no">​</a></h4><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">  ${MEMFAULT_SDK_ROOT}/ports/freertos/config</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="include-freertos-metric-definitions-in-platform-heartbeat-config">Include FreeRTOS Metric Definitions in Platform Heartbeat Config<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#include-freertos-metric-definitions-in-platform-heartbeat-config" class="hash-link" aria-label="Direct link to Include FreeRTOS Metric Definitions in Platform Heartbeat Config" title="Direct link to Include FreeRTOS Metric Definitions in Platform Heartbeat Config" translate="no">​</a></h4><p>In your <code>memfault_port/memfault_metrics_heartbeat_config.def</code>:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">memfault_metrics_heartbeat_config.def</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault_metrics_heartbeat_freertos_config.def"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// ...</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="remove-extra-function-definitions">Remove Extra Function Definitions<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#remove-extra-function-definitions" class="hash-link" aria-label="Direct link to Remove Extra Function Definitions" title="Direct link to Remove Extra Function Definitions" translate="no">​</a></h4><ol>
<li class="">
<p>Remove the definition for <code>memfault_platform_metrics_timer_boot()</code> in your
<code>memfault_platform_port.c</code>. This is implemented by the FreeRTOS port in the
SDK</p>
</li>
<li class="">
<p>Remove the definition for <code>vApplicationStackOverflowHook()</code> in your
application if it is defined. The Memfault FreeRTOS port provides a
definition for this function to register a stack overflow reboot reason and
reboot the system</p>
</li>
</ol><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-memfault-task-tracing-in-freertosconfigh">Register Memfault Task Tracing in FreeRTOSConfig.h<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#register-memfault-task-tracing-in-freertosconfigh" class="hash-link" aria-label="Direct link to Register Memfault Task Tracing in FreeRTOSConfig.h" title="Direct link to Register Memfault Task Tracing in FreeRTOSConfig.h" translate="no">​</a></h4><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">FreeRTOSConfig.h</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/ports/freertos_trace.h"</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>While in the file, we recommend using the following settings to catch issues:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockTitle_OeMC">FreeRTOSConfig.h</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name" style="color:#5a9bcf">configCHECK_FOR_STACK_OVERFLOW</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">vAssertCalled</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">file</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> line</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">configASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression keyword" style="color:#c5a5c5">if</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression operator" style="color:#d7deea">==</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression number" style="color:#5a9bcf">0</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">vAssertCalled</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression constant" style="color:#5a9bcf">__FILE__</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression constant" style="color:#5a9bcf">__LINE__</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="capture-the-required-freertos-variables-for-thread-decode">Capture the Required FreeRTOS Variables for Thread Decode<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#capture-the-required-freertos-variables-for-thread-decode" class="hash-link" aria-label="Direct link to Capture the Required FreeRTOS Variables for Thread Decode" title="Direct link to Capture the Required FreeRTOS Variables for Thread Decode" translate="no">​</a></h4><p>Follow the instructions on
<a class="" href="https://docs.memfault.com/docs/mcu/rtos-analysis#how-to-capture-the-required-variables">the RTOS Analysis page</a>
to capture the necessary RTOS variables for thread decode in coredumps.</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialize-freertos-port-on-boot">Initialize FreeRTOS Port on Boot<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#initialize-freertos-port-on-boot" class="hash-link" aria-label="Direct link to Initialize FreeRTOS Port on Boot" title="Direct link to Initialize FreeRTOS Port on Boot" translate="no">​</a></h4><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">#include "memfault/components.h"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+ #include "memfault/ports/freertos.h"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">//...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">int memfault_platform_boot(void) {</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+ memfault_freertos_port_boot();</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">+</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  memfault_build_info_dump();</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-configure-freertos-task-capture-size">Optional: Configure FreeRTOS Task Capture Size<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#optional-configure-freertos-task-capture-size" class="hash-link" aria-label="Direct link to Optional: Configure FreeRTOS Task Capture Size" title="Direct link to Optional: Configure FreeRTOS Task Capture Size" translate="no">​</a></h4><p>If the platform is configured to not capture all of RAM (due to storage or
bandwidth limitations), it's still possible to capture the active FreeRTOS tasks
as part of a coredump. See
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/ports/freertos/src/memfault_freertos_ram_regions.c" target="_blank" rel="noopener noreferrer" class="">this file</a>
for details on that implementation.</p><p>With that in place, the Memfault SDK will selectively capture the running tasks
during a coredump by saving both the Task Control Block (TCB) structure as well
as a limited backtrace for each task.</p><p>By default, as of <code>0.39.0</code>, the Memfault SDK will capture a truncated copy of
each TCB, which saves space in the coredump. See below for more details on this.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><p></p><summary>TCB structure capture size</summary>
Under some configurations, the TCB structures consume significant amounts of
coredump space (300-1000 bytes per TCB). To mitigate this problem, as of the
Memfault Firmware SDK v0.37.1, a configuration option
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/master/components/include/memfault/default_config.h#L566-L583" target="_blank" rel="noopener noreferrer" class=""><code>MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE</code></a>
is available for fine-tuning the captured FreeRTOS TCB size. This can usually be
set to 100 bytes, but please confirm for your system by examining the full size
of the <code>TCB_t</code> data structure; for example, using the <code>pahole</code> tool as shown
below. Memfault requires the struct members through <code>pcTaskName</code> to decode the
task.<p></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># note- the 'tskTaskControlBlock' is the actual type name for the 'TCB_t' struct</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">❯ pahole -C 'tskTaskControlBlock' ./build/memfault-esp32-demo-app.elf.memfault_log_fmt</span><br></span></code></pre></div></div><p>The unused <code>xNewLib_reent</code> member below is 240 bytes out of the total 352 byte
struct size.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">tskTaskControlBlock</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> StackType_t  </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">    pxTopOfStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*     0     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        xMPU_SETTINGS              xMPUSettings</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*     4     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        ListItem_t                 xStateListItem</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*     8    20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        ListItem_t                 xEventListItem</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    28    20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxPriority</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">           </span><span class="token comment" style="color:#999999">/*    48     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        StackType_t </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">              pxStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">              </span><span class="token comment" style="color:#999999">/*    52     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain">                       pcTaskName</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">16</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    56    16 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        BaseType_t                 xCoreID</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">              </span><span class="token comment" style="color:#999999">/*    72     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        StackType_t </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">              pxEndOfStack</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*    76     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxTCBNumber</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">          </span><span class="token comment" style="color:#999999">/*    80     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxTaskNumber</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">         </span><span class="token comment" style="color:#999999">/*    84     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxBasePriority</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*    88     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        UBaseType_t                uxMutexesHeld</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">        </span><span class="token comment" style="color:#999999">/*    92     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">                     pvThreadLocalStoragePointers</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*    96     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        TlsDeleteCallbackFunction_t pvThreadLocalStoragePointersDelCallback</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*   100     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">struct</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">_reent</span><span class="token plain">              xNewLib_reent</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">        </span><span class="token comment" style="color:#999999">/*   104   240 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain">   ulNotifiedValue</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">    </span><span class="token comment" style="color:#999999">/*   344     4 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">volatile</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">   ucNotifyState</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*   348     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">                    ucStaticallyAllocated</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/*   349     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain">                    ucDelayAborted</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">       </span><span class="token comment" style="color:#999999">/*   350     1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* size: 352, cachelines: 6, members: 20 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* padding: 1 */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">/* last cacheline: 32 bytes */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div><p>If the default capture size is too small, it can be adjusted using the
<code>MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE</code> config value in
<code>memfault_platform_config.h</code>.</p></div></div></details></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-assert-handler">Register Assert Handler<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#register-assert-handler" class="hash-link" aria-label="Direct link to Register Assert Handler" title="Direct link to Register Assert Handler" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Memfault SDK 1.4.1+</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Memfault SDK &lt;1.4.1</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>Memfault Firmware SDK v1.4.1 automatically hooks into the C library assert
handlers:</p><ul>
<li class=""><code>__assert_func</code> (Newlib C library)</li>
<li class=""><code>__aeabi_assert</code> (IAR and ARM C libraries)</li>
</ul><p>If you are using a different C library, you will need to hook into the assert
handler, see the tab for "Memfault SDK &lt;1.4.1" for more details.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Memfault can automatically capture crash information on asserts by calling
<code>MEMFAULT_ASSERT()</code> from your platforms assert handler:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/panics/assert.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">YOUR_PLATFORM_ASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">x</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newlib-c-library-asserth">Newlib C library assert.h<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#newlib-c-library-asserth" class="hash-link" aria-label="Direct link to Newlib C library assert.h" title="Direct link to Newlib C library assert.h" translate="no">​</a></h3><p>If your platform is using the <code>assert()</code> or <code>abort()</code> calls directly from a libc
implementation, you should override the implementations to call
<code>MEMFAULT_ASSERT</code>.</p><p>To accomplish this with Newlib C library (bundled as the default with most
compilers), we recommend adding the following to a C File in your project:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file assert_overrides.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;assert.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">&lt;stdlib.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">__assert_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">file</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> line</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">                   </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">func</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">failedexpr</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">_exit</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> status</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Memfault advises <strong>against</strong> calling <code>assert()</code> directly from a project.
Instead, we suggest using the <code>MEMFAULT_ASSERT(x)</code> macro provided by the
Memfault SDK. Benefits include:</p><ul>
<li class="">making it easier to swap out behavior for different environments such as
compile code for a unit test versus a real target.</li>
<li class="">leading to substantial code space savings by enabling the removal of assert
conditions passed via the <code>failedexpr</code> arg.</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-a-unique-identifier-to-target">Add a Unique Identifier to target<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-a-unique-identifier-to-target" class="hash-link" aria-label="Direct link to Add a Unique Identifier to target" title="Direct link to Add a Unique Identifier to target" translate="no">​</a></h3>
<p>Memfault has facilities for capturing a unique identifier automatically as part
of the build process. This information is used by Memfault's cloud
infrastructure to ensure the symbol file uploaded matches the data reported in a
coredump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>A longer discussion about firmware versioning best practices and build
identifiers
<a href="https://interrupt.memfault.com/blog/release-versioning#gnu-build-id" target="_blank" rel="noopener noreferrer" class="">can be found here</a>.</p></div></div>
<p>Memfault has two ways to add a Build ID to a target. Select the appropriate one
below based on your toolchain setup.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">GNU Build Id Linker Flag + Snippet</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Memfault Build Id Python Script</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Requires use of the GNU GCC or Clang compiler.</p></div></div><ol>
<li class="">Add <code>-Wl,--build-id=sha1</code> to flags passed to linker via GCC/Clang</li>
<li class="">Add <code>#define MEMFAULT_USE_GNU_BUILD_ID 1</code> to
<code>third_party/memfault/memfault_platform_config.h</code></li>
<li class="">Add the following snippet to your projects linker script (<code>.ld</code> file) where
"&lt;YOUR_FLASH_SECTION&gt;" below will match the name of the MEMORY section that
read-only data and text is placed in.</li>
</ol><div class="language-linker-script codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-linker-script codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id </span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        __start_gnu_build_id_start </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token location-counter important" style="font-weight:400">.</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token function" style="color:#79b6f2">KEEP</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token section keyword" style="color:#c5a5c5">.note</span><span class="token section keyword" style="color:#c5a5c5">.gnu</span><span class="token section keyword" style="color:#c5a5c5">.build</span><span class="token operator" style="color:#d7deea">-</span><span class="token plain">id</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token plain">YOUR_FLASH_SECTION</span><span class="token operator" style="color:#d7deea">&gt;</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Be sure to update <code>&lt;YOUR_FLASH_SECTION&gt;</code> to match the name of the section
<code>.text</code> is placed in!</p></div></div><p>The <code>.note.gnu.build-id</code> output section name is used to locate the Build ID when
the symbol file is uploaded. The <code>__start_gnu_build_id_start</code> identifier is used
at compile time by the SDK for populating the Build ID.</p><p>See the
<a href="https://github.com/memfault/memfault-firmware-sdk/tree/master/examples/freertos" target="_blank" rel="noopener noreferrer" class="">FreeRTOS example app</a>
in the Memfault SDK for a reference implementation!</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Update your build system to invoke the <code>scripts/fw_build_id.py</code> script on your
ELF as part of a post-build step.</p><p>For example, using CMake, this can be achieved by adding a custom command to the
target:</p><div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">add_custom_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">TARGET </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token plain">YOUR_EXECUTABLE_NAME</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> POST_BUILD</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  COMMAND python </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token variable" style="color:#d7deea">MEMFAULT_SDK_ROOT</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain">/scripts/fw_build_id.py </span><span class="token punctuation" style="color:#8dc891">${</span><span class="token plain">YOUR_EXECUTABLE_NAME</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The script depends on <code>pyelftools</code> so make sure you have run
<code>pip install pyelftools</code> or added it to your <code>requirements.txt</code></p></div></div><p>See the
<a href="https://github.com/memfault/memfault-firmware-sdk/tree/master/examples/esp32" target="_blank" rel="noopener noreferrer" class="">ESP32 example app</a>
in the Memfault SDK for a reference implementation!</p><p>For projects using IAR EWARM, see the instructions below for adding a post-build
action:</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><ol>
<li class="">
<p>Install Python (eg python3.9 from the Microsoft app store)</p>
</li>
<li class="">
<p>Install the <code>pyelftools</code> Python package by:</p>
<ol>
<li class="">Open git bash or cmd.exe</li>
<li class=""><code>python3.9.exe -m pip install pyelftools==0.27</code></li>
</ol>
</li>
<li class="">
<p>Then add the appropriate post-build action, for example:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># double check the path to the `fw_build_id.py` script</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">python3.9.exe $PROJ_DIR$/third-party/memfault-firmware-sdk/scripts/fw_build_id.py $TARGET_PATH$</span><br></span></code></pre></div></div>
</li>
</ol><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The Output Converter utility runs before the post-build actions, so it will
always generate output with a missing Build Id. Instead, invoke <code>ielftool</code>
<strong>after</strong> Memfault Build Id insertion to ensure the binary has a Build Id. Refer
to the
<a href="https://www.iarsys.co.jp/download/LMS2/arm/7502/ewarm7502doc/arm/doc/EWARM_DevelopmentGuide.ENU.pdf" target="_blank" rel="noopener noreferrer" class="">IAR EWARM Manual (PDF warning)</a>
for more information on using <code>ielftool</code>.</p><p>Additionally, Build Actions in IAR EWARM are batched, so to ensure Memfault
Build Id insertion and binary output conversion execute in the proper order,
invoke a separate script wrapping calls to <code>fw_build_id.py</code> and <code>ielftool</code>.</p></div></div> <figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/iar-post-build-id.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/iar-post-build-id.png" class="image_e9uR"></a></figure></div></div></details></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="confirm-integration-links">Confirm Integration Links<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#confirm-integration-links" class="hash-link" aria-label="Direct link to Confirm Integration Links" title="Direct link to Confirm Integration Links" translate="no">​</a></h3>
<p>At this point, your project should compile and be able to boot. On startup you
should see some messaging like the following print when
<code>memfault_platform_boot()</code> is called:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Build ID: cefaeb9407ab0dac7a5efe9fd510618ee21e9df7</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] S/N: MFLT0123</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW type: app-fw</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] SW version: 1.0.0+cefaeb940</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] HW version: dvt1</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Reason, RESETREAS=0x4</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Reset Causes:</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I]  Software</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[I] Memfault Initialized!</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hello-memfault-manually-upload-reboot-event">3. "Hello Memfault" Manually Upload Reboot Event<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#hello-memfault-manually-upload-reboot-event" class="hash-link" aria-label="Direct link to 3. &quot;Hello Memfault&quot; Manually Upload Reboot Event" title="Direct link to 3. &quot;Hello Memfault&quot; Manually Upload Reboot Event" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-test-commands-to-cli">Add Test Commands to CLI<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-test-commands-to-cli" class="hash-link" aria-label="Direct link to Add Test Commands to CLI" title="Direct link to Add Test Commands to CLI" translate="no">​</a></h3>
<p>The Memfault SDK functionality can be easily exercised via CLI test commands.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If your platform does not have a CLI, these commands can also be wired up to a
button press or called from <code>main()</code> on bootup from a test image</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-platform-ports">Test platform ports<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#test-platform-ports" class="hash-link" aria-label="Direct link to Test platform ports" title="Direct link to Test platform ports" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_logging</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Debug log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Info log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Warning log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Error log!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Runs a sanity test to confirm coredump port is working as expected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_coredump_storage</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Note: Coredump saving runs from an ISR prior to reboot so should</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// be safe to call with interrupts disabled.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_disable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_begin</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_enable_interrupts</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_coredump_storage_debug_test_finish</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-core-sdk-functionality">Test core SDK functionality<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#test-core-sdk-functionality" class="hash-link" aria-label="Direct link to Test core SDK functionality" title="Direct link to Test core SDK functionality" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Triggers an immediate heartbeat capture (instead of waiting for timer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// to expire)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_heartbeat</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_metrics_heartbeat_debug_trigger</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_trace</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_TRACE_EVENT_WITH_LOG</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">critical_error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"A test error trace!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">//! Trigger a user initiated reboot and confirm reason is persisted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_reboot_tracking_mark_reset_imminent</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">kMfltRebootReason_UserReset</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">NULL</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_platform_reboot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-different-crash-types-where-a-coredump-should-be-captured">Test different crash types where a coredump should be captured<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#test-different-crash-types-where-a-coredump-should-be-captured" class="hash-link" aria-label="Direct link to Test different crash types where a coredump should be captured" title="Direct link to Test different crash types where a coredump should be captured" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_assert</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">MEMFAULT_ASSERT</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_fault</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">bad_func</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token number" style="color:#5a9bcf">0xEEEEDEAD</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">bad_func</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_hang</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// should never get here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// Dump Memfault data collected to console</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">test_export</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-local-debug-setup">Post Data to Cloud via Local Debug Setup<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#post-data-to-cloud-via-local-debug-setup" class="hash-link" aria-label="Direct link to Post Data to Cloud via Local Debug Setup" title="Direct link to Post Data to Cloud via Local Debug Setup" translate="no">​</a></h3>
<p>Prior to having an end-to-end transport in place, Memfault data can be exported
over any serial connection or via GDB directly.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-to-memfault">Post Chunks To Memfault<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#post-chunks-to-memfault" class="hash-link" aria-label="Direct link to Post Chunks To Memfault" title="Direct link to Post Chunks To Memfault" translate="no">​</a></h4>
<p>All data collected by Memfault can be exported as opaque packets called
"chunks". To trigger an export, call the <code>test_export</code> command added to your
device CLI.</p>
<p>If data has been collected, you will see strings with the format:
<code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:01] INFO: System Booting!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:02] INFO: Memfault Build ID: d8d6a047282f025fffa29fa767100f310bc40f80</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Copy the logs from the console, navigate to the
<a href="https://mflt.io/chunks-debug" target="_blank" rel="noopener noreferrer" class="">"Integration Hub / Chunks Debug"</a> view for your
project, and paste the logs:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/copy-paste-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Next" to review the chunks that were identified and (optionally) update
the "Device Serial" being used to report data:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/post-chunks-ui.png" class="image_e9uR"></a></figure>
<p>Select "Post" to submit the chunks to Memfault. The chunks will appear in the
view directly below. Check and make sure there are no "Errors" to address.</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/binary-assets/embedded/chunks-debug-view.png" class="image_e9uR"></a></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-automate-chunk-posting">(Optional) Automate Chunk Posting<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#optional-automate-chunk-posting" class="hash-link" aria-label="Direct link to (Optional) Automate Chunk Posting" title="Direct link to (Optional) Automate Chunk Posting" translate="no">​</a></h4>
<p>Posting chunks from a local setup can be automated using our CLI tool or GDB
script.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This strategy can also be used even when an end-to-end transport is in place for
local QA testing or in CI/CD test automation setups.</p></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> Automated Posting Options </summary><div><div class="collapsibleContent_i85q"><h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite-project-key-from-memfault-ui">Prerequisite: Project Key from Memfault UI<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#prerequisite-project-key-from-memfault-ui" class="hash-link" aria-label="Direct link to Prerequisite: Project Key from Memfault UI" title="Direct link to Prerequisite: Project Key from Memfault UI" translate="no">​</a></h5><p>A Project key will be needed in order to communicate with Memfault's web
services. Go to <a href="https://app.memfault.com/" target="_blank" rel="noopener noreferrer" class="">https://app.memfault.com/</a>, navigate
to the project you want to use and select 'Settings'→'General'. The 'Project
Key' listed is what you will want to use.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With Desktop CLI Tool </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-the-python-memfault-cli-tool">Install the Python Memfault CLI Tool<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#install-the-python-memfault-cli-tool" class="hash-link" aria-label="Direct link to Install the Python Memfault CLI Tool" title="Direct link to Install the Python Memfault CLI Tool" translate="no">​</a></h3>
<p>The <a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault Desktop CLI tool</a>. tool is written
in Python and published publicly in the
<a href="https://pypi.org/project/memfault-cli/" target="_blank" rel="noopener noreferrer" class="">Python Package Index (pypi)</a>.</p>
<p>To install it, make sure you have a recent version of Python 3.x installed and
run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ pip3 install memfault-cli</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --help</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="save-device-logs-to-file">Save device logs to file<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#save-device-logs-to-file" class="hash-link" aria-label="Direct link to Save device logs to file" title="Direct link to Save device logs to file" translate="no">​</a></h3>
<p>Start your console with your favorite terminal client. Let the system run for a
bit, periodically dumping data to the console by calling
<code>memfault_data_export_dump_chunks()</code>.</p>
<p>You should see strings with the format: <code>MC:BASE64_ENCODED_CHUNK:</code> in the dump.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>It's perfectly fine for other logs to be interleaved with the exported data.</p></div></div>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command recording a reboot reason, then rebooting the system</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_reboot</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] GNU Build ID: 3c92e3313fe1c9d00ac8687ce966d5f527a05ed3</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] S/N: freertos-example</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW type: qemu-app</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] SW version: 1.0.0</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] HW version: qemu-mps2-an385</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">MFLT:[INFO] Memfault Initialized!</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command capturing a trace event</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; test_trace</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"># CLI command making a call to `memfault_data_export_dump_chunks()`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">shell&gt; export</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[00:00:10] INFO: MC:SFQCpwIBAwEHalRFU1RTRVJJQUwKbXRlc3Qtc29mdHdhcmUJajEuMC4wLXRlcw==:</span><br></span></code></pre></div></div>
<p>Save the resulting logs to a file such as <code>logs.txt</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-chunks-from-logs-with-memfault-cli">Post chunks from logs with Memfault CLI<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#post-chunks-from-logs-with-memfault-cli" class="hash-link" aria-label="Direct link to Post chunks from logs with Memfault CLI" title="Direct link to Post chunks from logs with Memfault CLI" translate="no">​</a></h3>
<p>Run the desktop Memfault CLI tool on your saved log file. The utility will parse
the logs, extract the Memfault data, and post it for processing!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ memfault --project-key ${YOUR_PROJECT_KEY} post-chunk --encoding sdk_data_export logs.txt</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Found 2 Chunks. Sending Data ...</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Success</span><br></span></code></pre></div></div></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary> With GDB </summary><div><div class="collapsibleContent_i85q"><br><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">You need to have a way to debug your product with GDB as part of your
development setup</li>
<li class="">The GDB version you are using needs to have the
<a href="https://interrupt.memfault.com/blog/automate-debugging-with-gdb-python-api#getting-started-with-gdb-python" target="_blank" rel="noopener noreferrer" class="">GDB Python API enabled</a>.
(It's generally the default or there is a <code>-py</code> version of GDB which has it
included.)</li>
<li class="">You need to compile your firmware with debug symbol information (i.e <code>-g</code>
CFLAG)</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Even if you are using other compilers such as ARMCC or IAR, you can load the ELF
(.out, .elf) generated and debug it in GDB as well.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launch-gdb-and-connect-debugger">Launch GDB and connect debugger<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#launch-gdb-and-connect-debugger" class="hash-link" aria-label="Direct link to Launch GDB and connect debugger" title="Direct link to Launch GDB and connect debugger" translate="no">​</a></h3>
<p>For example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">$ arm-none-eabi-gdb-py my_app.elf --ex="target remote :3333"</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-memfault-gdb-script">Load Memfault GDB script<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#load-memfault-gdb-script" class="hash-link" aria-label="Direct link to Load Memfault GDB script" title="Direct link to Load Memfault GDB script" translate="no">​</a></h3>
<p>Copy and paste and run the following in gdb:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">python exec('try:\n from urllib2 import urlopen\nexcept:\n from urllib.request import urlopen'); exec(urlopen('https://app.memfault.com/static/scripts/memfault_gdb.py').read())</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Some GDB versions do not support Python scripting by default. If you see a
message like "Python scripting is not supported in this copy of GDB", you might
be able to run an alternative GDB binary with a -py suffix, for example
arm-none-eabi-gdb-py.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-handler">Register Handler<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#register-handler" class="hash-link" aria-label="Direct link to Register Handler" title="Direct link to Register Handler" translate="no">​</a></h3>
<p>Copy the command below and paste it into GDB and hit enter. This will load a
handler which automatically posts data to Memfault whenever
<code>memfault_data_export_dump_chunks</code> is called.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">memfault install_chunk_handler --verbose --project-key &lt;YOUR_PROJECT_KEY&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>memfault_data_export_dump_chunks()</code> needs to be called by your port as part of
a CLI command or periodic task in order for the data to be extracted. For
example:</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">export_data_cli_command</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">some_periodic_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">memfault_data_export_dump_chunks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try It Out!<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#try-it-out" class="hash-link" aria-label="Direct link to Try It Out!" title="Direct link to Try It Out!" translate="no">​</a></h3>
<p>Now, every time <code>memfault_data_export_dump_chunks</code> is called, the data passed as
a parameter to the function will automatically be posted to the Memfault cloud.
You don't have to do anything else! You will see logs print in the gdb CLI as
data is posted:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">(gdb) Continuing.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 45 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Successfully posted 53 bytes of chunk data</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">[...]</span><br></span></code></pre></div></div></div></div></details></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-a-coredump">4. Manually Capture a Coredump<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#manually-capture-a-coredump" class="hash-link" aria-label="Direct link to 4. Manually Capture a Coredump" title="Direct link to 4. Manually Capture a Coredump" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-symbol-file">Upload Symbol File<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#upload-symbol-file" class="hash-link" aria-label="Direct link to Upload Symbol File" title="Direct link to Upload Symbol File" translate="no">​</a></h3>
<p>At this point, you should be able to generate test events and crashes and push
the data to the Memfault UI.</p>
<p>You can confirm the error traces and crashes have arrived successfully by
navigating to the "Issues" page- there should be a new issue with the "<strong>Symbols
Missing</strong>" label:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/first-trace.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/first-trace.png" class="image_e9uR"></a></figure>
<p>Clicking into the Issue will show the trace and a message that the symbol file
is missing. It can be uploaded by clicking the button highlighted below:</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/issue-missing-symbol.png" class="image_e9uR"></a></figure>
<p>After this step, you will see the processed trace in the list of issues!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Issue created when the symbol file is missing can now be set to resolved.
It's good practice to always upload a symbol file before devices send any data.</p></div></div>
<p>Symbol files can also be uploaded from the <strong>Software → Symbol Files</strong> tab
(follow <a title="Link to your Project on the Memfault Web App." href="https://app.memfault.com/organizations/-/projects/-/symbol-files?new">this deep link</a> to be brought to the symbol file upload point in the
UI):</p>
<figure class="figure_SMyf" style="--figure-bg-color:transparent"><a href="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" target="_blank" class="link_rHrz"><img src="https://docs.memfault.com/img/docs/mcu/upload-symbol-file.png" class="image_e9uR"></a></figure>
<p>In addition to supporting decoding trace/coredump data, symbol files are also
required for decoding <a class="" href="https://docs.memfault.com/docs/mcu/metrics-api">Metrics</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can programmatically upload symbol files with the
<a class="" href="https://docs.memfault.com/docs/ci/install-memfault-cli">Memfault CLI tool</a>.</p></div></div>
<p>Symbol files should be uploaded to Memfault before devices send any data, to
ensure all device data can be decoded.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-exception-handler-implementations">Check Exception Handler Implementations<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#check-exception-handler-implementations" class="hash-link" aria-label="Direct link to Check Exception Handler Implementations" title="Direct link to Check Exception Handler Implementations" translate="no">​</a></h3>
<p>Memfault provides exception handler implementations that need to be invoked via
the system's vector table. The SDK by default provides implementations for these
handlers using the CMSIS standard names:</p>
<ul>
<li class="">HardFault_Handler</li>
<li class="">MemoryManagement_Handler</li>
<li class="">BusFault_Handler</li>
<li class="">UsageFault_Handler</li>
<li class="">NMI_Handler</li>
<li class="">MemfaultWatchdog_Handler</li>
</ul>
<p>Typically the default implementations will be weakly defined, so the Memfault
implementations will automatically be used. It may be necessary to mark the
default implementation with the appropriate <code>weak</code> annotation, or delete the
default implementations altogether so the Memfault implementations can be used.</p>
<p>If the entries in the vector table for those handlers are named differently,
either change the names to match the CMSIS standard ones, or set the necessary
<a href="https://github.com/memfault/memfault-firmware-sdk/blob/920a1ee607963206901615ac2f395e3124e7c3a6/components/include/memfault/default_config.h#L366-L388" target="_blank" rel="noopener noreferrer" class="">config options</a>
in <code>memfault_platform_config.h</code> to override the names.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-capture-logs">5. Manually Capture Logs<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#manually-capture-logs" class="hash-link" aria-label="Direct link to 5. Manually Capture Logs" title="Direct link to 5. Manually Capture Logs" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="logging-dependency">Logging Dependency<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#logging-dependency" class="hash-link" aria-label="Direct link to Logging Dependency" title="Direct link to Logging Dependency" translate="no">​</a></h3>
<p>The Memfault SDK will (sparingly) emit diagnostic logs to alert of integration
configuration problems. The logging subsystem can also easily serve as logging
infrastructure for your own platform if you do not yet have one set up.</p>
<p>Based on your setup, choose one of the options below:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Platform does logging via Macros</summary><div><div class="collapsibleContent_i85q"><ol>
<li class="">Add <code>#define MEMFAULT_PLATFORM_HAS_LOG_CONFIG 1</code> to
<code>third_party/memfault/memfault_platform_config.h</code></li>
<li class="">Remap Memfault logging macros to platform logging macros by adding the
following macros to the <code>memfault_platform_log_config.h</code> file created
earlier.</li>
</ol><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_log_config.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_DEBUG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_DEBUG_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_INFO</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf">  </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_INFO_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">  fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_WARN</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf">  </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_WARN_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">define</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property macro-name function" style="color:#79b6f2">MEMFAULT_LOG_ERROR</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf">fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">.</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property expression function" style="color:#79b6f2">YOUR_PLATFORM_ERROR_LOG</span><span class="token macro property expression punctuation" style="color:#8dc891">(</span><span class="token macro property expression" style="color:#5a9bcf"> fmt</span><span class="token macro property expression punctuation" style="color:#8dc891">,</span><span class="token macro property expression" style="color:#5a9bcf"> </span><span class="token macro property punctuation" style="color:#8dc891">##</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property expression" style="color:#5a9bcf">__VA_ARGS__</span><span class="token macro property expression punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Platform has no logging or uses printf()</summary><div><div class="collapsibleContent_i85q"><p>Implement <code>memfault_platform_log()</code> in
<code>third_party/memfault/memfault_platform_port.c</code>. For example,</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_log</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">eMemfaultPlatformLogLevel level</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  va_list args</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">va_start</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">128</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vsnprintf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">char</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain">lvl_str</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">level</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Debug</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"D"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Info</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"I"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Warning</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"W"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">case</span><span class="token plain"> kMemfaultPlatformLogLevel_Error</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      lvl_str </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"E"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">break</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">vsnprintf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">your_platform_printf</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"[%s] MFLT: %s\n"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> lvl_str</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> log_buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></details>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If you are using the <a class="" href="https://docs.memfault.com/docs/mcu/demo-cli">Memfault Demo CLI</a> in your project,
see the information on that page for other dependencies.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-standard-metrics">6. Configuring Standard Metrics<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#configuring-standard-metrics" class="hash-link" aria-label="Direct link to 6. Configuring Standard Metrics" title="Direct link to 6. Configuring Standard Metrics" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To process device data, Memfault requires a matching uploaded Symbol File. See
<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#upload-symbol-file" class="">"Upload Symbol File</a> for details.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="timer-dependencies">Timer Dependencies<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#timer-dependencies" class="hash-link" aria-label="Direct link to Timer Dependencies" title="Direct link to Timer Dependencies" translate="no">​</a></h3>
<p>The memfault metric subsystem requires a repeating timer in order to collect
"heartbeats" and a time since boot</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">nRF5 SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">FreeRTOS</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Other</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/freertos/src/memfault_metrics_freertos.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Add the following file to your build system:</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">${MEMFAULT_SDK_ROOT}/ports/nrf5_sdk/memfault_platform_metrics.c</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><p>Implement the following function for your MCU. The ports listed in other tabs
serve as a good reference.</p><div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_platform_port.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">memfault_platform_metrics_timer_boot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">uint32_t</span><span class="token plain"> period_sec</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> MemfaultPlatformTimerCallback callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Schedule a timer to invoke callback() repeatedly after period_sec</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">uint64_t</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_platform_get_time_since_boot_ms</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Return time since boot in ms, this is used for relative timings.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-custom-metrics">Configure Metrics<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#configure-custom-metrics" class="hash-link" aria-label="Direct link to Configure Metrics" title="Direct link to Configure Metrics" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To process device data, Memfault requires a matching uploaded Symbol File. See
<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#upload-symbol-file" class="">"Upload Symbol File</a> for details.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-first-heartbeat">Define First Heartbeat<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#define-first-heartbeat" class="hash-link" aria-label="Direct link to Define First Heartbeat" title="Direct link to Define First Heartbeat" translate="no">​</a></h3>
<p>Heartbeat metrics allow you to easily monitor your platform and confirm it is
operating as expected.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Typical Heartbeat Examples</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">investigate problems that didn't cause a reboot (bad connectivity, network or
sensor error rates) and marginality that crops up in a fleet</li>
<li class="">providing leading indicators of problems (rapid battery drain, drop in
activity, etc)</li>
<li class="">compare trends across releases (improved connectivity, data efficiency etc)</li>
</ul><p>Best Practices around each metric type that we recommend:</p><ul>
<li class="">Timers - These are used to track time spent in particular states and can be
used for debugging connectivity, battery life, and performance issues.</li>
<li class="">Counters - Track counts of a particular event class taking place. Suggested
use cases are:<!-- -->
<ul>
<li class="">Operations your system are performing (number of events serviced by a task,
bytes sent over network, bytes written to flash). Alerts can be configured
to identify devices operating outside normal thresholds.</li>
<li class="">Counts of events for events that should never happen (i2c bus write error
count, flash write error). You can alert if any of these situations are
seen.</li>
</ul>
</li>
<li class="">Gauges - These are values sampled at the end of each Heartbeat interval.
Common items include<!-- -->
<ul>
<li class="">Battery Metrics (Drop over an hour, current percent)</li>
<li class="">Heap utilization / stack high watermark</li>
</ul>
</li>
</ul></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-metric-to-memfault_metrics_heartbeat_configdef">Add Metric to memfault_metrics_heartbeat_config.def<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#add-metric-to-memfault_metrics_heartbeat_configdef" class="hash-link" aria-label="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" title="Direct link to Add Metric to memfault_metrics_heartbeat_config.def" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">//! @file memfault_metrics_heartbeat_config.def</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token function" style="color:#79b6f2">MEMFAULT_METRICS_KEY_DEFINE</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> kMemfaultMetricType_Unsigned</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="instrument-code-to-update-heartbeat">Instrument Code to Update Heartbeat<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#instrument-code-to-update-heartbeat" class="hash-link" aria-label="Direct link to Instrument Code to Update Heartbeat" title="Direct link to Instrument Code to Update Heartbeat" translate="no">​</a></h4>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">my_main_task</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">your_rtos_wait_for_event</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token function" style="color:#79b6f2">MEMFAULT_METRIC_ADD</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">MainTaskWakeups</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">1</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">   </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatically-upload-data">7. Automatically Upload Data<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#automatically-upload-data" class="hash-link" aria-label="Direct link to 7. Automatically Upload Data" title="Direct link to 7. Automatically Upload Data" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-data-to-cloud-via-device-transport">Post Data to Cloud via Device Transport<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#post-data-to-cloud-via-device-transport" class="hash-link" aria-label="Direct link to Post Data to Cloud via Device Transport" title="Direct link to Post Data to Cloud via Device Transport" translate="no">​</a></h3>
<p>Extensive details about how data from the Memfault SDK makes it to the cloud
<a class="" href="https://docs.memfault.com/docs/mcu/data-from-firmware-to-the-cloud">can be found here</a>. In short, the
Memfault SDK packetizes data into "chunks" that must be pushed to the Memfault
cloud via the
<a href="https://api-docs.memfault.com/?version=latest#66b0e390-2c3e-4c0d-b6c2-836a287b9e5f" target="_blank" rel="noopener noreferrer" class="">chunk REST endpoint</a>.</p>
<p>The Memfault SDK exposes an API that packetizes Memfault data into "chunks".
These "chunks" need to be forwarded to the Memfault Cloud (either directly via
HTTPS or indirectly via a gateway device such as a computer or mobile
application)</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you cannot post data directly using HTTP, no problem at all. In fact, that is
one of the most common configurations. In these setups, data can be proxied from
the MCU to a device which can perform a HTTP request over transports such as
UART, BLE, COAP, LoRa, Zigbee, etc). The size of a "chunk" is fully configurable
and can be tuned to best match your transport requirements. All message
re-assembly is dealt with by Memfault in the cloud.</p></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token macro property directive-hash" style="color:#5a9bcf">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">include</span><span class="token macro property" style="color:#5a9bcf"> </span><span class="token macro property string" style="color:#8dc891">"memfault/components.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">bool </span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// buffer to copy chunk data into</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">uint8_t</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">USER_CHUNK_SIZE</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token class-name" style="color:#FAC863">size_t</span><span class="token plain"> buf_len </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">sizeof</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  bool data_available </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">memfault_packetizer_get_chunk</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;</span><span class="token plain">buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token plain">data_available </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no more data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// send payload collected to chunks endpoint</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">user_transport_send_chunk_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">buf</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> buf_len</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token operator" style="color:#d7deea">!</span><span class="token function" style="color:#79b6f2">memfault_packetizer_data_available</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// no new data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// [... user specific logic deciding when &amp; how much data to send</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token function" style="color:#79b6f2">try_send_memfault_data</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-data-transfer">Troubleshooting Data Transfer<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#troubleshooting-data-transfer" class="hash-link" aria-label="Direct link to Troubleshooting Data Transfer" title="Direct link to Troubleshooting Data Transfer" translate="no">​</a></h3>
<p>See the docs on
<a class="" href="https://docs.memfault.com/docs/troubleshooting/data-transfer-troubleshooting">data transfer troubleshooting</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">8. Next Steps<a href="https://docs.memfault.com/embed/mcu/embedded-self-serve#next-steps" class="hash-link" aria-label="Direct link to 8. Next Steps" title="Direct link to 8. Next Steps" translate="no">​</a></h2>
<p>Now that the Memfault SDK is integrated on your device, there are many other
features and options to explore. Check out these sections of our docs for more
information:</p>
<ul>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Core Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/subsystem-guides">Advanced Subsystem Guides</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/best-practices">Best Practices</a></li>
<li class=""><a class="" href="https://docs.memfault.com/docs/category/web-app">Web App</a></li>
</ul>]]></content>
    </entry>
</feed>