All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
General:
platform implements memfault_platform_time_get_current()
. This feature can
be disabled by setting #define MEMFAULT_LOG_TIMESTAMPS_ENABLE 0
in
memfault_platform_config.h
.
ESP-IDF:
Add new built-in Wi-Fi metrics:
wifi_primary_channel
- the primary channel ID of the associated Wi-Fiaccess point
- wifi_auth_mode
- the authentication mode of the associated Wi-Fi access
point, for example WPA2_PSK
- wifi_standard_version
- the Wi-Fi version of the associated Wi-Fi access
point, for example 802.11n
These metrics are enabled by default and can be disabled (along with other
built-in Wi-Fi metrics) with the Kconfig option
CONFIG_MEMFAULT_ESP_WIFI_METRICS
ESP-IDF:
IDF_VER
build variable is set to"HEAD-HASH-NOTFOUND"
(i.e. using an ESP-IDF SDK that is not a git repo),
when setting the built-in metric MemfaultSdkMetric_os_version
. In this
case, the value is taken from the ESP_IDF_VERSION_x
macros, which are less
precise.
Use more specific Memfault reset reason codes for these watchdog reset
types, previously all categorized as HardwareWatchdog
ESP_RST_INT_WDT
-> SoftwareWatchdog
ESP_RST_TASK_WDT
-> TaskWatchdog
ESP_RST_WDT
(RTC watchdog, the real hardware watchdog), stays asHardwareWatchdog
ESP-IDF:
espressif component
version of the SDK. Prior to this fix, the SDK version reports as
"MemfaultSdkMetric_sdk_version": "0.0.0"
. No change to the SDK, only a
tooling/release change.
General:
memfault_reboot_reason_get()
andmemfault_platform_metrics_timer_boot()
weakly defined in the
platform templates to make removing them optional when
first integrating
Added a configuration option, MEMFAULT_CRC16_BUILTIN
, that permits
disabling the built-in crc16
implementation. The user should provide a compatible implementation of
memfault_crc16_compute()
. For example, if the Zephyr CRC library is used,
a compatible implementation would be:
C
#include <zephyr/sys/crc.h>
uint16_t memfault_crc16_compute(uint16_t crc_initial_value, const void *data,
size_t data_len_bytes) {
return crc16_itu_t(crc_initial_value, data, data_len_bytes);
}
A Zephyr Kconfig setting, CONFIG_MEMFAULT_CRC16_BUILTIN
, is also provided
to control this option.
Thanks to @JordanYates for submitting this feature request in #84 !
Added an example daily_heartbeat
session to the
FreeRTOS QEMU example, which demonstrates
how to send a daily heartbeat session to Memfault. Daily Heartbeats are a
special category of Session Metrics, and can be used to track device
properties over a longer interval than heartbeat metrics.
Added an optional field to the built-in
FreeRTOS task stack usage metrics,
.get_task_handle
, which allows the user to provide a custom function to
get the task handle for a given thread name, instead of using the thread
name to identify the thread. This is useful in systems where there are
threads with ambiguous names. The
ESP32 example app is
updated to use this feature for ESP-IDF <5.3, where on dual-core SOCs, the
per-core idle threads are both named IDLE
.
nRF Connect SDK:
CONFIG_MEMFAULT_FOTA_HTTP_FRAG_SIZE
to enablecontrolling the HTTP fragment size when using NCS >=2.9.9. Previously,
CONFIG_DOWNLOAD_CLIENT_HTTP_FRAG_SIZE_1024=y
was required, but this option
was deprecated in NCS 2.9.9.
Add built-in support for the thermal_cpu_c
(CPU temperature) metric for
nRF5x chips (nRF52 and nRF54 app core supported). Use the Kconfig setting
MEMFAULT_METRICS_CPU_TEMP
to disable the metric.
Zephyr
CONFIG_MEMFAULT_HTTP_CLIENT_TIMEOUT_MS
, whichcontrols the timeout for the Memfault HTTP client, used both for chunk upload and OTA operations. The default timeout is 5 seconds. Connections with poor latency may require a longer timeout to avoid premature disconnection. Thanks to @chirambaht for submitting this in #86!
ESP-IDF:
MEMFAULT_LOG_MAX_LINE_SAVE_LEN
to set the max lengthof a log line when CONFIG_MEMFAULT_LOG_USE_VPRINTF_HOOK=y
, which is the
default setting in ESP-IDF. Previously, the log line was arbitrarily
truncated in the Memfault vprintf hook before being saved to the Memfault
log buffer.
General:
MEMFAULT_PACKED
attribute for the eMemfaultRebootReason
declaration; this compiler extension is not supported on IAR EWARM's compiler. Change the assembly shim to properly zero-extend the enum constant to avoid ABI issues when invoking the C fault handling code.
General:
eclipse_patch.py utility with a port name that
is one folder deep (e.g. freertos
)
Rename the memfault_crc16_ccitt_compute()
function to
memfault_crc16_compute()
. The CRC-16 algorithm used is canonically named
CRC-16/XMODEM
, not CRC-16/CCITT
(aka CRC-16/KERMIT
). The file
implementing that function is left as memfault_crc16_ccitt.c
for backwards
compatibility. Thanks to @JordanYates for
reporting this issue in
#83!
Zephyr:
MEMFAULT_METRICS_THREADS
,INIT_STACKS
. Also add missing dependencies to the Kconfig option
MEMFAULT_METRICS_DEFAULT_SET_ENABLE
:
Plaintext
- `INIT_STACKS`
- `THREAD_RUNTIME_STATS`
- `THREAD_STACK_INFO`
Thanks to @JordanYates for reporting this problem in #86 !
Update the memfault_zephyr_port_post_data()/memfault_zephyr_port_post_data_return_size() functions to only open the TLS socket if there is data ready to send, which is otherwise wasteful, as the socket will be closed without sending any Memfault data.
Add an explicit module name, memfault-firmware-sdk
, to the module
manifest. This avoids issues when the SDK is registered in a Zephyr manifest
under a directory name other than memfault-firmware-sdk
. Thanks to
@JordanYates for reporting this issue in
#81!
Exclude unused stack space when capturing thread stacks, via the
thread.stack_info.delta
property. This reduces the amount of coredump
storage used to capture thread stacks, especially when
CONFIG_STACK_POINTER_RANDOM
or CONFIG_THREAD_LOCAL_STORAGE
is enabled.
Thanks to @JordanYates for reporting this
issue in #81!
Fix a configuration issue when building for any of the following parts, but NOT using nRF-Connect SDK (i.e. using Zephyr instead):
The Memfault SDK now correctly enables nRF-Connect-SDK-specific functionality ONLY when that SDK is included as a Zephyr module. Thanks to @JordanYates for reporting this issue in #81!
nRF Connect SDK:
app, and replace with sysbuild support. Child image support was deprecated in NCS 2.7.0 in favor of sysbuild.
memfault_fota_legacy.c
.General:
Self Test component output
log level, MEMFAULT_SELF_TEST_OUTPUT_LOG
, to control the verbosity of the
Self Test output. Set it by selecting the Memfault Log macro to use, for
example #define MEMFAULT_SELF_TEST_OUTPUT_LOG MEMFAULT_LOG_DEBUG
. The
default level is the same as before, MEMFAULT_LOG_INFO
.
Add an
implementation of memfault_reboot_reason_get()
for the STM32U5xx series of MCUs, using the RCC-CSR
register to determine
the reset reason. Add the file to your project to make use of it!
Add an implementation for flash-backed coredump storage for the STM32U5xx series of MCUs, using the internal flash memory to store coredumps. Add the file to your project to make use of it!
Enable the MPU (Memory Protection Unit) in the
FreeRTOS QEMU example, to demonstrate Memfault's
MPU region analysis feature.
This feature is enabled in a Memfault project by setting
#define MEMFAULT_COLLECT_MPU_STATE 1
in memfault_platform_config.h
. The
MPU registers are captured as part of a coredump, and Memfault will analyze
the configuration and include the result in the Trace viewer.
Add a new reboot reason code, kMfltRebootReason_TaskWatchdog
, for marking
crashes due to a Task Watchdog. Memfault has a
built-in Task Watchdog system,
and
Zephyr
and
ESP-IDF
both implement Task Watchdog systems.
FreeRTOS:
Memfault FreeRTOS port.
This feature is enabled by default and can be disabled by setting
#define MEMFAULT_FREERTOS_COLLECT_THREAD_METRICS 0
in
memfault_platform_config.h
. The default threads monitored are IDLE
and
Tmr Svc
.
Threads are registered for tracking by defining
MEMFAULT_METRICS_DEFINE_THREAD_METRICS()
in the application. For example:
Plaintext
```c
//! Set the list of threads to monitor for stack usage. The metric keys must
//! be defined in memfault_metrics_heartbeat_config.def, ex:
//!
//! MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(
//! memory_main_pct_max, kMemfaultMetricType_Unsigned,
//! CONFIG_MEMFAULT_METRICS_THREADS_MEMORY_SCALE_FACTOR
//! )
#include "memfault/ports/zephyr/thread_metrics.h"
MEMFAULT_METRICS_DEFINE_THREAD_METRICS (
// monitor the main thread stack usage
{
.thread_name = "main",
.stack_usage_metric_key = MEMFAULT_METRICS_KEY(memory_main_pct_max),
},
// monitor the shell_uart thread stack usage
{
.thread_name = "shell_uart",
.stack_usage_metric_key = MEMFAULT_METRICS_KEY(memory_shell_uart_pct_max),
});
```
Add example usage of per-thread stack usage support to the FreeRTOS QEMU example for the idle, timer service, console input, metrics, and heap tasks.
Add tracking of libc heap usage via the memory_pct_max
metric to the
FreeRTOS QEMU example
Zephyr:
Memfault Zephyr port.
This feature is enabled by default and can be disabled by setting
CONFIG_MEMFAULT_METRICS_THREADS=n
. The default threads monitored are
main
and sysworkq
.
Threads are registered for tracking by defining
MEMFAULT_METRICS_DEFINE_THREAD_METRICS()
in the application. For example:
Plaintext
```c
//! Set the list of threads to monitor for stack usage. The metric keys must
//! be defined in memfault_metrics_heartbeat_config.def, ex:
//!
//! MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(
//! memory_main_pct_max, kMemfaultMetricType_Unsigned,
//! CONFIG_MEMFAULT_METRICS_THREADS_MEMORY_SCALE_FACTOR
//! )
#include "memfault/ports/zephyr/thread_metrics.h"
MEMFAULT_METRICS_DEFINE_THREAD_METRICS (
{
.thread_name = "main",
.stack_usage_metric_key = MEMFAULT_METRICS_KEY(memory_main_pct_max),
},
{
.thread_name = "shell_uart",
.stack_usage_metric_key = MEMFAULT_METRICS_KEY(memory_shell_uart_pct_max),
});
```
Update to support removal of the global CSTD
compiler property (deprecated
in Zephyr v3.7.0, and just removed in Zephyr main
), when
CONFIG_MEMFAULT_COMPACT_LOG
is enabled. Thanks to
@fouge for providing this fix in
#78 !
Add a new built-in metric, cpu_usage_pct
, which reports the percentage of
the CPU used. This metric is enabled by default as part of the default set
of metrics, controlled with CONFIG_MEMFAULT_METRICS_DEFAULT_SET_ENABLE
.
For ARM targets implementing and enabling the MPU, automatically capture the
and
analyze the MPU configuration
as part of a coredump. This can be controlled with the
CONFIG_MEMFAULT_COREDUMP_COLLECT_MPU_STATE
Kconfig option.
Add a new Kconfig option, CONFIG_MEMFAULT_METRICS_HEARTBEAT_INTERVAL_SECS
,
which should be used instead of
#define MEMFAULT_METRICS_HEARTBEAT_INTERVAL_SECS xxx
in
memfault_platform_config.h
. A build error will occur if the value is set
in memfault_platform_config.h
to enforce migrating the setting. Thanks to
@JordanYates for reporting this feature
request in
#80
ESP-IDF:
A test command, esp_task_watchdog <cpuid>
, has been added to the
esp32 sample app to trigger a Task Watchdog fault on the
specified core. Be sure to enable the Kconfig option
CONFIG_ESP_TASK_WDT_PANIC=y
to have the system panic when a Task Watchdog
fault occurs. Memfault will capture and tag the fault appropriately, as for
other fault types.
Add a new Kconfig option, CONFIG_MEMFAULT_METRICS_HEARTBEAT_INTERVAL_SECS
,
which should be used instead of
#define MEMFAULT_METRICS_HEARTBEAT_INTERVAL_SECS xxx
in
memfault_platform_config.h
. A build error will occur if the value is set
in memfault_platform_config.h
to enforce migrating the setting.
nRF-Connect SDK:
MCUs, using the RESETREAS
register to determine the reset reason. This
will be automatically enabled when building for an nRF54Lx series device
(CONFIG_SOC_SERIES_NRF54LX=y
).
Zephyr:
MEMFAULT_METRICS_CPU_TEMP
Kconfig dependencies, to correctly checkfor presence of the DT die-temp0
alias, and remove the dependency on
ADC
, which doesn't apply to all boards implementing a temp sensor. Thanks
to @JordanYates for reporting this issue
in #79 !
General:
--memfault-sdk-dir
argument is now optional, and defaults to the parent
directory of the script folder.
FreeRTOS:
Example_HeapFreeBytes
and Example_HeapMinFreeBytes
to
FreeRTOS_HeapFreeBytes
and FreeRTOS_HeapMinFreeBytes
.
nRF-Connect SDK:
the UART log backend. Previously both the SHELL and UART log backends were enabled, resulting in duplicate log lines emitted to the console.
Update the nRF91 sample app and the nRF5x sample app to use the latest version of the nRF-Connect SDK, v2.9.0.
Zephyr:
main_thread_cpu_time_permille
-> cpu_usage_main_pct
.
General:
uptime_s
, which reports the total uptime of thedevice in seconds. This metric is enabled by default, and can be disabled
with #define MEMFAULT_METRICS_UPTIME_ENABLE 0
in
memfault_platform_config.h
.
Zephyr:
Zephyr v4.0.0 🥳.
ESP-IDF:
enabled by default and can be disabled with the Kconfig option
CONFIG_MEMFAULT_COREDUMP_CPU_COUNT=1
. Note: not all fault conditions will
cause both CPU cores to be captured in the coredump. The SDK will always
capture the core that triggered the fault, and if the non-faulting core is
available for capture, it will be included as well.
ESP-IDF:
non-volatile values into stack-allocated buffers. This reduces overall stack
usage for the main
thread by about 350 bytes.
General:
test_trace
commandin the core demo cli. This argument will be inserted as a custom log message with the trace event, which can be useful for testing the insertion of custom log messages into trace events at runtime.
Add the following built-in metrics, enabled by default (and quota-exempt):
MemfaultSDKMetric_log_recorded_lines
: the total number of log lineswritten into the Memfault log buffer during the heartbeat interval
- MemfaultSDKMetric_log_dropped_lines
: the total number of log lines
dropped (overwritten or not recorded) due to buffer exhaustion during the
heartbeat interval
For example, if the buffer is sufficiently large to store 10 logs, and 15 logs are written:
Plaintext
- `MemfaultSDKMetric_log_recorded_lines` will be 15
- `MemfaultSDKMetric_log_dropped_lines` will be 5
If 5 more logs are written:
Plaintext
- `MemfaultSDKMetric_log_recorded_lines` will be 20
- `MemfaultSDKMetric_log_dropped_lines` will be 10
Cosmetic updates to the examples/freertos/
app log format, including
applying ANSI color codes based on log level.
Bash
# Before:
mflt> test_log
Raw log!
MFLT:[INFO] Info log!
MFLT:[WARN] Warning log!
MFLT:[ERRO] Error log!
# After:
mflt> test_log
Raw log!
2024-11-14T17:01:12Z|4284 I Info log!
2024-11-14T17:01:12Z|4284 W Warning log!
2024-11-14T17:01:12Z|4284 E Error log!
ESP-IDF:
option CONFIG_MEMFAULT_NTP_SYNC
. After NTP synchronization, events
(heartbeats and trace events) will be timestamped with the current device
time.
Add a test_trace
command to the ESP-IDF demo cli to capture an example
trace event. This behaves the same as the test_trace
command in the
core demo cli.
Mark coredumps with the Software Watchdog
crash reason if the IWDT
triggered the fault, instead of marking them as Hard Fault
.
Add OTA update check-ins to the HTTP client's periodic upload, controlled
with the Kconfig option CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_OTA
. When
enabled, the system will be restarted after downloading the update. To
customize this behavior, enable
CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_OTA_CUSTOM_CBS
, and implement the
global callback struct g_memfault_ota_update_handler
. This feature is
disabled by default.
General:
char
pointers whenencoding compact logs. Previously, these types that should promote to a
string in the compact logging encoding fell into the default case of int
,
causing compact logging decode to fail when processed by the Memfault
backend.
ESP-IDF:
CONFIG_MEMFAULT_USE_MEMFAULT_BUILD_ID=y
(default). The command would
always run (was always out-of-date) when any idf.py [build|flash]
command
is run, even if the original .elf file did not change. This caused the
log_fmt
section (used for decoding compact logs) to be removed from the
/memfault-esp32-demo-app.elf.memfault_log_fmt
file, which causes Memfault
Compact Logs to fail to decode. The command is fixed to only run when the
.elf file changes.
Please contact us if you need support for earlier versions!
General:
eMemfaultRebootReason
is expressed as a 4-byte typeinstead of 2-bytes when compiling with Clang with high optimization, when
targeting ARM. This results in Coredumps tagged as Unknown
instead of the
correct reason code.
General:
memfault_reboot_tracking_load()
/ memfault_reboot_tracking_save()
, to
allow users to provide their own implementations for saving and loading
reboot tracking data. This is useful when the default implementation is not
suitable for the platform or when the user wants to store the data in a
different location.
The
Stable Sessions Device Vital
added in SDK version 1.15.0
is fully available and no longer considered
experimental.
Add an optional memfault_port_coredump_save_begin()
callback, for use by
Memfault ports. This allows memfault_platform_coredump_save_begin()
to be
implemented by the platform instead, for custom pre-coredump operations.
Thanks to @finger563 for reporting this issue in
#77!
Improved API docs for events and data packetizer components by noting restrictions for use in ISR contexts
Zephyr:
nucleo_l496zg
board, with support forthe Zephyr bbram
subsystem, and implement the new
memfault_reboot_tracking_load()
/ memfault_reboot_tracking_save()
functions to demonstrate the functionality.
Added a Kconfig flag, CONFIG_MEMFAULT_METRICS_LOGS_ENABLE
, to control the
new log lines metrics.
ESP-IDF:
CONFIG_MEMFAULT_ENABLE_REBOOT_DIAG_DUMP
, to print theESP-IDF reboot reason code on system boot, for debugging purposes. This feature is disabled by default.
CONFIG_MEMFAULT_METRICS_LOGS_ENABLE
, to control the
new log lines metrics.General:
https://mflt.io/contact-support instead of the Memfault support email. This link will redirect to a form where questions can be sent to the Memfault support team.
nRF-Connect SDK:
MEMFAULT_REBOOT_REASON_GET_CUSTOM
to be imply
instead of select
when the nRF-Connect SDK is enabled. This permits users
to disable the nrfx
-based reboot reason tracking if needed.
General:
Stable Sessions Device Vital
(session.operational_crashes
) which tracks crashes that occurred when a
session is active.
General:
MEMFAULT_METRIS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE()
to
MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE()
ESP-IDF:
IWDT
(Interrupt Watchdog Timer)before starting coredump saving, to prevent interrupting the coredump
process. The ESP-IDF fault handler enables the WDT_RWDT
hardware watchdog
when a fault occurs, so there is still protection if the fault handling
hangs.
FreeRTOS:
building for a multi-core device. Enable this setting by adding
#define MEMFAULT_FREERTOS_RUNTIME_STATS_MULTI_CORE_SPLIT 1
to
memfault_platform_config.h
. This setting is disabled by default.
ESP-IDF:
CONFIG_MEMFAULT_FREERTOS_RUNTIME_STATS_MULTI_CORE_SPLIT
,to control MEMFAULT_FREERTOS_RUNTIME_STATS_MULTI_CORE_SPLIT
. This Kconfig
is enabled by default for multi-core devices.
FreeRTOS:
(i.e. the complement of the idle task run time)
Renamed the following metrics:
idle_task_run_time_percent
-> cpu_usage_pct
idle0_task_run_time_percent
-> cpu_usage_pct
idle1_task_run_time_percent
-> cpu1_usage_pct
ESP-IDF:
get_reset_reason()
are now correctly recorded as kMfltRebootReason_Unknown
instead of
kMfltRebootReason_UnknownError
(UnknownError
is reserved for an
"unexpected" reboot path, where Unknown
is used when the reboot reason
cannot be determined).
Support for the following vendor platform versions is deprecated in this release, and will be removed in a future release:
v4.4
(Jan 26, 2022)v2.7.0
(Oct 16, 2021)v1.9.2
(Jul 14, 2022)Please contact us if you need support for earlier versions!
ESP-IDF:
ESP Component from the Espressif
registry, by adding the following lines to an esp-idf project's
idf_component.yml
manifest:
Plaintext
```yaml
dependencies:
memfault/memfault-firmware-sdk:
version: "1.12.0"
```
CONFIG_MEMFAULT_HEAP_STATS
. The Memfault Trace UI will show
information about the most recent heap allocations for malloc()
calls.ESP-IDF:
applied by default, controlled by the Kconfig setting
CONFIG_MEMFAULT_USE_MEMFAULT_BUILD_ID
. This is only valid for ESP-IDF
versions >= 4.2.5 , and will cause a build error on older versions,
requiring it to be set to n
. Updating to this version of the SDK will
require removing the similar logic in the project's CMakeLists.txt
file (a build error will occur if both are present).
The Memfault Core Vital for Periodic Connectivity will now count failures to sync Memfault data if the HTTP connection cannot be established, but WiFi connectivity is available. This can occur when the WAN connection is down but the access point is still up, or if there is an external DNS failure. Previously this was not counted as a failure.
Zephyr
CONFIG_MEMFAULT_HTTP_ENABLE
, requires POSIX_API
to be enabled on newer
versions of Zephyr. Previously, not explicitly enabling POSIX_API
would
result in a build error. Update it to be enabled by default in the Zephyr
SDK, via Kconfig imply POSIX_API
.
Zephyr 3.7.0+ requires enabling CONFIG_MBEDTLS_SHA1
when using Zephyr's
mbedtls implementation. Memfault added a build-time check for this setting
in Memfault SDK 1.11.2, but that check would also trip when not using
Zephyr's mbedtls implementation. Update the build check to be more precise.
nRF-Connect SDK:
target a Zephyr fork that is compatible with 3.7.0 but provides a "development" version number, 3.6.99.
ESP-IDF:
crash
command, detected by static analysis tools. The impacted function was and is
exclusively called with an argument of 10
, so this issue was not
exploitable in practice.
General:
MemfaultSdkMetric_os_name
andMemfaultSdkMetric_os_version
. These are string metrics that map to the OS
/ platform name and version string respectively, and are included in the the
ELF at build time, and processed out-of-band by Memfault for NCS, Zephyr,
and ESP-IDF. They are not ever transmitted over the air (no bandwidth
impact). For example, for Zephyr these metric string values would be
zephyr
and 3.7.0
for a project on Zephyr v3.7.0. These metrics are
attributes by default and will not be counted towards attribute quotas.
Zephyr:
default on systems with WiFi:
Plaintext
- `wifi_connected_time_ms` : time in milliseconds the device has been
connected to a WiFi network
- wifi_disconnect_count
: number of times the device has disconnected from
a WiFi network
- wifi_ap_oui
: the OUI of the WiFi AP the device is connected to
The metrics can be disabled by setting CONFIG_MEMFAULT_METRICS_WIFI=n
.
The Memfault Zephyr fault handler now labels faults as Stack Overflow, Bus Fault, MemManage Fault, and Usage Fault, among others, in addition to the existing Hard Fault label. Note that this does not change the types of faults collected (all these faults are already supported), but it does correct the label presented in the Memfault UI.
Add a new test command, mflt test stack_overflow
, that will trigger a
stack overflow fault when CONFIG_STACK_SENTINEL
or
CONFIG_MPU_STACK_GUARD
is enabled.
The cpu_temp
metric has been renamed to thermal_cpu_c
to better reflect
the metric's purpose. The metric is still collected by default on platforms
with an enabled die-temp0
sensor, and can be disabled by setting
CONFIG_MEMFAULT_METRICS_CPU_TEMP=n
.
Add a new metric, memory_pct_max
, which captures the max percentage of the
heap used. It is enabled by default. This metric and the existing
Heap_BytesFree
metric are controlled with
CONFIG_MEMFAULT_METRICS_MEMORY_USAGE
.
ESP-IDF:
MEMFAULT_HTTP_PERIODIC_UPLOAD
, controlled with the Kconfig symbol
MEMFAULT_HTTP_PERIODIC_UPLOAD_LOGS
. This can also be controlled at runtime
with the included API
memfault_esp_port_http_periodic_upload_logs(bool enable)
Add a new metric, memory_pct_max
, which captures the max percentage of the
heap used. It is enabled by default. This metric and the existing heap_*
metrics are now controlled with CONFIG_MEMFAULT_METRICS_MEMORY_USAGE
.
Print the Memfault OTA URL from memfault_esp_port_ota_update()
when a new
update is available, for example:
Bash
esp32> memfault_ota_check
I (98125) mflt: Checking for OTA Update
Download URL: https://ota-cdn.memfault.com/2950/9757/19036619757?token=0123456789abcdef&expires=1726192800&v=2
I (98775) mflt: Update available!
esp32> memfault_ota_perform
I (15515) mflt: Checking for OTA Update
Download URL: https://ota-cdn.memfault.com/2950/9757/19036619757?token=0123456789abcdef&expires=1726192800&v=2
I (16205) mflt: Starting OTA download ...
Zephyr:
cpu_temp
metric has been renamed to thermal_cpu_c
to better reflectthe metric's purpose. The metric is still collected by default on platforms
with an enabled die-temp0
sensor, and can be disabled by setting
CONFIG_MEMFAULT_METRICS_CPU_TEMP=n
.
ESP-IDF:
cpu_temp
metric has been renamed to thermal_cpu_c
to better reflectthe metric's purpose. The metric is still collected by default on ESP32
variants that support it (all but ESP32), and can be disabled by setting
CONFIG_MEMFAULT_METRICS_CPU_TEMP=n
.
CONFIG_MEMFAULT_ESP_HEAP_METRICS
has been replaced with
CONFIG_MEMFAULT_METRICS_MEMORY_USAGE
.ESP-IDF:
would be recorded twice in the log buffer.
General:
-Wc11-c2x-compat
compiler warning flag. This flag is not valid for the C++
compiler, and has been changed to be enabled only for the C compiler.
nRF-Connect SDK:
Connected Time Vital for the nRF9160 LTE connection, due to a change in the nRF-Connect SDK v2.7.0 from prior versions.
General:
-flto
is enabled.Zephyr:
CONFIG_MEMFAULT_SOC_FAMILY_ESP32
, to resolve anerror when referencing the deprecated CONFIG_SOC_FAMILY_ESP32
Kconfig
(removed in
Zephyr 3.7.0
as part of Hardware Model V2). This new option is used in the Memfault
Zephyr port to check if an ESP32 SOC is being used.
BOOTLOADER_ESP_IDF
Kconfig symbol in
the Memfault Zephyr port (removed in Zephyr 3.7.0).nRF-Connect SDK:
reboot reasons are tracked as kMfltRebootReason_DeepSleep
.
Plaintext
- `NRF_POWER_RESETREAS_OFF_MASK`
- `NRF_POWER_RESETREAS_NFC_MASK`
- `NRF_POWER_RESETREAS_CTRLAP_MASK`
Zephyr:
MEMFAULT_ASSERT_HALT_IF_DEBUGGING_ENABLED
to control whether coredumpstrigger a halt when a debugger is attached.
Add a new Kconfig option, CONFIG_MEMFAULT_RAM_BACKED_COREDUMP_REGION
, to
set the RAM region used for storing RAM-backed coredumps.
Fix a 🐛 when trying to communicate via HTTPS with Memfault on the nRF91x.
On the nRF91x, socket operations are offloaded to the nRF modem lib, which
does not currently support the socket option TLS_CERT_NO_COPY
. In v1.9.4,
this socket option was applied when TLS was enabled
(!g_mflt_http_client_config.disable_tls
) and Zephyr version was >=3.0.0
(when support for this socket option was added). Therefore, devices on SDK
versions >=1.9.4 and <1.11.2 trying to communicate with Memfault will run
into a no protocol support error (ENOPROTOOPT
) in the nRF modem lib. Since
this option is only required to use the DER format,
CONFIG_MEMFAULT_TLS_CERTS_USE_DER
now depends on the Zephyr-implemented
socket operations being used (!NET_SOCKET_OFFLOAD
).
Fix the build when using Zephyr 3.7.0 and leveraging the HTTP client and/or
ESP32 port. The Memfault HTTP client would fail to build due to the wrong
crypto.h
header getting picked up in the build. Additionally, due to the
removal of default support for mbedTLS hash algorithms in Zephyr,
CONFIG_MBEDTLS_SHA1
now must be enabled explicitly when using any of
Memfault's CA certificates. When using PEM and leveraging Zephyr's in-tree
mbedTLS and config file
(CONFIG_MBEDTLS_BUILTIN=y && CONFIG_MBEDTLS_CFG_FILE="config-tls-generic.h"
),
CONFIG_MBEDTLS_PEM_CERTIFICATE_FORMAT=y
is required for PEM certificate
support. To simplify certificate format selection, a new choice Kconfig
called CONFIG_MEMFAULT_TLS_CERTS_FORMAT
has been added. Use the configs
CONFIG_MEMFAULT_TLS_CERTS_USE_PEM
and CONFIG_MEMFAULT_TLS_CERTS_USE_DER
to choose the certificate format.CONFIG_MEMFAULT_TLS_CERTS_USE_DER
is the
default choice config. Finally, the Kconfig CONFIG_SOC_FAMILY_ESP32
is now
deprecated. References of this Kconfig now also check the new Kconfig
CONFIG_SOC_FAMILY_ESPRESSIF_ESP32
. See
Zephyr's 3.7 Migration guide
for more details.
Dialog
correct memory region for memfault_platform_sanitize_address_range()
.
memfault_reboot_reason_get()
and
memfault_platform_reboot()
implementations in the DA146x port. In
memfault_reboot_reason_get()
, the bit masks were incorrectly applied and a
block was missing to reset the reboot reason register if
MEMFAULT_REBOOT_REASON_CLEAR
is set. In memfault_platform_reboot()
, the
mechanism to reboot the system has been updated from
hw_cpm_reboot_system()
to SWRESET
.General:
ports/templates/memfault_platform_port.c
to helpwhen integrating on a new platform
ESP-IDF:
BOOT
button is pressed on theESP32 example app. This is useful for testing the Memfault crash handling functionality without using the serial console.
Add support for namespacing
Session Metrics
to support duplicate key names across heartbeats and sessions (eg
heartbeat.cpu_temp
and session.cpu_temp
). This requires a change to how
Session Metrics keys are set:
MEMFAULT_METRIC_SET_SIGNED(cpu_temp, 25)
(only 1 metric keycpu_temp
supported across heartbeats/sessions)
MEMFAULT_METRIC_SET_SIGNED(cpu_temp, 25)
for setting
heartbeat.cpu_temp
MEMFAULT_METRIC_SESSION_SET_SIGNED(cpu_temp, session, 25)
for setting
session.cpu_temp
General:
memfault_reboot_tracking_boot()
with a bootup_info
parameter containing
an unexpected type of reboot reason (or no reboot reason) after a previously
recorded expected reason. This results in
"Expected Reboots"
recorded using MEMFAULT_REBOOT_MARK_RESET_IMMINENT()
to be incorrectly
flagged as an "Unexpected Reboot" and causes an incorrect
operational_crashfree_hours
metric getting reported and a lower Stability
score.
Cleanup comment to old packetizer API
Add -fdebug-prefix-map
to FreeRTOS QEMU example
ESP-IDF:
post_chunks
test command (usedto trigger an upload to Memfault) to be more informative, for example:
Plaintext
```bash
esp32> post_chunks
I (12593) mflt: Data posted successfully, 262285 bytes sent
esp32> post_chunks
I (204093) mflt: No new data found
```
Zephyr
Update samples to use the newly-released Zephyr v3.7.0 🥳
Add explanatory output to Memfault test busfault|hardfault
shell commands
when Trusted Firmware-M (TF-M) is in use
The RTC-based implementation of
memfault_platform_time_get_current()
used a define named RTC
, which conflicts with the STM32 HAL definition
here.
Rename the define to MFLT_RTC_NODE
to avoid the conflict.
nRF-Connect SDK:
firmware SDK (v1.10.1, the previous SDK release).
General:
Support for this target is no longer experimental.
Improve coredump capture on ARMv7-A/R (Cortex-A/R), capturing additional CPU
registers r8
+ r9
in the coredump.
Fix a compilation issue with older versions of gcc-arm-none-eabi
that do
not support the PRIu64
format specifier (or are missing C99 format
specifiers). Thanks to @iotengtr for reporting this issue in
#72 !
Zephyr:
which can be used for reference. Memfault is exploring other use cases for
this data in our backend. This feature is controlled with
CONFIG_MEMFAULT_DTS_IN_ELF
, enabled by default.
Zephyr:
CONFIG_LOG_MODE_MINIMAL=y
, inaddition to the previously supported LOG_MODE_DEFERRED
(Zephyr default)
and LOG_MODE_IMMEDIATE
.
Zephyr minimal log mode
disables all backends- logs are simply sent to printk
.
For ESP32 chips, place the reboot reason tracking into a dedicated section,
.rtc_noinit
, to ensure the reboot reason is preserved across reboots. This
was previously only supported on Zephyr ESP32-S3/S2 devices (all ESP32
devices on ESP-IDF already support this).
Fix a bug where the default memfault_platform_get_device_info()
, which
uses the hwinfo subsystem, when available, was incorrectly disabled when
CONFIG_MEMFAULT_REBOOT_REASON_GET_CUSTOM=y
.
General:
memfault_demo_cli_cmd_busfault()
function (accessed viatest_busfault
/mflt test busfault
demo CLI commands) to produce BusFaults
on more devices. Previously, certain chips would either not produce a fault,
or would produce a MemManage exception instead.
Zephyr:
structure coming in Zephyr v3.7.0. This change is backward compatible with older Zephyr versions.
By default, include the zephyr.meta
build metadata in the output ELF file
as an unallocated section. This provides a list of module SHAs, useful when
reconstructing the dependencies used to build a particular ELF file. This
feature is controlled with CONFIG_MEMFAULT_BUILD_META_IN_ELF
.
Add a new Kconfig option, CONFIG_MEMFAULT_USE_MEMFAULT_BUILD_ID
, which
will apply a Memfault Build ID
instead of a GNU Build ID when enabled. It defaults to enabled when
CONFIG_BOOTLOADER_ESP_IDF
is enabled- this applies to ESP32 boards that
are using the ESP-IDF bootloader, instead of an MCUBoot bootloader. MCUBoot
bootable images are compatible with the standard GNU Build IDs.
Add a new API, memfault_zephyr_fota_download_callback()
, to the Zephyr
FOTA implementation to allow users to write their own callback that is
invoked when the download of a OTA payload is complete. The default download
callback will mark the new image as pending, set a firmware update reboot
reason, and reboot the system. Custom callbacks may, for example, be used to
perform application-specific system shutdown procedures, or allow the FOTA
update call to return to the calling context so a testing framework could
mark the operation successful. Users can override the default callback with
their own implementation using a new Kconfig option
CONFIG_MEMFAULT_ZEPHYR_FOTA_DOWNLOAD_CALLBACK_CUSTOM
.
ESP-IDF:
posting any available Memfault data via HTTPS. Enable with
CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y
.
General:
Cortex-M33. The targets can be found here
ESP-IDF:
CONFIG_MEMFAULT_DEVICE_INFO_SOFTWARE_VERSION
) has been updated to 0.0.0
from 1.0.0-dev
for the built-in Device Info implementation. See
menuconfig
or
ports/esp_idf/memfault/Kconfig for
details. This should only affect users who are using the default value for
that Kconfig.
Fix a bug when CONFIG_MEMFAULT_LWIP_METRICS=y
that may cause invalid
metric values. LwIP stats by default are only 16-bits wide and this can
cause underflow when calculating heartbeat values. This fix forces
LWIP_STATS_LARGE=1
to make LwIP use 32-bit counters.
Add a feature to the esp32 example app to enable overriding the Memfault server URLs (ex: for a proxy).
Improve docs and comments in example app
General:
from MemoryManagement_Handler
to MemManage_Handler
(set by
MEMFAULT_EXC_HANDLER_MEMORY_MANAGEMENT
in
default_config.h when not
overridden by the user). This aligns with the more recent CMSIS naming
convention for exception handlers. A backwards-compatible implementation is
included to avoid breaking users relying on the previous default.
ESP-IDF:
memfault_ota_check
, to return 0 to the console componentwhen an update is available.
Add the temperature metric cpu_temp
which is measured using an internal
temperature sensor that many ESP32 boards have built-in. This metric is
collected by default with the Kconfig CONFIG_MEMFAULT_METRICS_CPU_TEMP=y
.
Enable recording vprintf data into the Memfault log buffer through a vprintf
hook. Users can call memfault_esp_port_vprintf_log_hook()
from their
vprintf handler so they can use both their vprintf handler and record logs
into Memfault's log buffer. To use this feature, set
CONFIG_MEMFAULT_LOG_USE_VPRINTF_HOOK=n
.
Zephyr:
memfault_zephyr_port_post_data_return_size()
where a positivevalue could be returned in the event of a failure instead of a negative
value. This would result in mflt post_chunks
returning a successful post
message even though there was a failure such as a DNS lookup failure.
Add the temperature metric cpu_temp
which is measured using an internal
temperature sensor that some Zephyr boards have. Similar to ESP-IDF, this
metric is collected by default with the Kconfig
CONFIG_MEMFAULT_METRICS_CPU_TEMP=y
, but the board must have the device
tree node die-temp0
for this option to be used.
Add an example for collecting thread stack usage metrics when the thread
handles are not accessible in the desired scope. Users can leverage the
Zephyr routine k_thread_foreach()
to register a callback that will be
called with each thread's k_thread
handle. In the callback, users can read
the stack usage via the handle and set their metrics.
Zephyr:
memfault_zephyr_port_http_upload_sdk_data()
to a negative value instead
of 1. This change aligns with the error return value for the other Zephyr
HTTP client APIs, and simplifies logic in the HTTP client.
ESP-IDF:
esp_http_client_cleanup()
was not called in certainscenarios (for example, if the access point is connected, but there is no outside internet access), which resulted in a memory leak. Thanks to @mykmelez for providing the fix in #71 🎉!
ESP-IDF:
released ESP-IDF v5.1.4.
Zephyr:
.rtc_noinit
section. Thisimproves tracking of the OTA Reboot Reason when the device reboots after an OTA update.
Fix compilation warnings when
CONFIG_MEMFAULT_COREDUMP_FULL_THREAD_STACKS=y
is enabled. Thanks to @fouge
for providing this fix in
#70 🎉!
General:
Memfault SDK files to an STM32Cube IDE project.
General:
non-volatile event storage feature
when MEMFAULT_EVENT_STORAGE_NV_SUPPORT_ENABLED
is set to 0
. This feature
was previously not fully disabled, leaving some unused code in the final
executable. This is a minor code size improvement (approximately 300 bytes)
when the system is disabled (default).
Zephyr:
event timestamps
using Zephyr RTC devices, by adding support for RTC nodes identified using
DT_ALIAS()
in addition to DT_NODELABEL()
. Thanks to @corytodd for
providing the fix in
#68!
Add a Memfault HTTP OTA client backend for Zephyr MCUBoot platforms. This is
enabled with the CONFIG_MEMFAULT_ZEPHYR_FOTA_BACKEND_MCUBOOT
Kconfig flag.
The OTA process is triggered by calling the memfault_zephyr_fota_start()
function, which is also exposed in the shell via the
mflt get_latest_release
command.
Add basic support for Xtensa targets in the Memfault Zephyr port. This specifically targets the ESP32-S3 SOC.
Add a success message when the Zephyr HTTP client posts data to Memfault.
ESP-IDF:
esp_event_loop_create_default()
to prevent crashes if calledmultiple times. This feature is enabled by default and is disabled with
CONFIG_MEMFAULT_WRAP_EVENT_LOOP_CREATE_DEFAULT=n
Add an example Session Metric to the ESP32 example app, which tracks statistics during the ESP32 OTA session (bytes sent + received, etc).
nRF Connect SDK:
CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y
, by defaultfor nRF91x builds
Default to CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_USE_DEDICATED_WORKQUEUE
when periodic upload is enabled
Improve the stability of the
nRF9160 sample app, by increasing the
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE
to 2048
.
Zephyr:
g_mflt_http_client_config
for Zephyrdevices using the Memfault HTTP client, which holds the
Memfault Project Key set via the Kconfig
symbol CONFIG_MEMFAULT_PROJECT_KEY
. Users updating from a previous version
will have to set this Kconfig symbol when building, and any existing
implementation of g_mflt_http_client_config
should be removed.
General:
memfault_platform_metrics_connectivity_boot()
,can be enabled to be called from the Memfault SDK metrics_boot()
function
after the metrics subsystem is initialized. This platform function is used
for setting any initial state information for Connectivity metrics, and has
default implementations for ESP-IDF (WiFi) and nRF9160 (LTE) devices.
ESP-IDF:
CONFIG_MEMFAULT_COREDUMP_STORAGE_WRITE_OFFSET_SECTORS
, which can be used
to set an offset into the coredump storage area where coredumps are written.
The full partition will still be erased, but coredumps will be written
starting at the sector offset selected with this setting. The skipped sector
will remain at the erased value, 0xff
for all bytes.
Zephyr:
memfault_platform_get_device_info()
, which provides:
Plaintext
- `.device_serial` : A default device serial based on the SOC's unique ID
registers, via the
hwinfo
subsystem.
This is the default device serial when CONFIG_HWINFO=y
. If
CONFIG_HWINFO=n
, the fallback device serial is
CONFIG_SOC "-testserial"
.
- .software_type
: Configurable with
CONFIG_MEMFAULT_BUILTIN_DEVICE_INFO_SOFTWARE_TYPE
, defaults to "app"
- .software_version
: Configurable with
CONFIG_MEMFAULT_BUILTIN_DEVICE_INFO_SOFTWARE_VERSION
. Defaults to an
identifier based on the VERSION
file in the application, using the
Zephyr
Application Version
feature, or "0.0.0"
if unavailable.
- .hardware_version
: Configurable with
CONFIG_MEMFAULT_BUILTIN_DEVICE_INFO_HARDWARE_VERSION
. Defaults to an
identifier based on CONFIG_BOARD
and CONFIG_BOARD_REVISION
(if set).
Add a new Zephyr example app for the ST NUCLEO-WBA55CG board, under examples/zephyr/nucleo_wba55cg. This example demonstrates the Memfault SDK integration on the NUCLEO-WBA55CG board.
nRF-Connect SDK:
out-of-the-box for nRF9160 projects, tracking modem connected time. This is
controlled with the Kconfig
CONFIG_MEMFAULT_NRF_CONNECTIVITY_CONNECTED_TIME_NRF91X
, enabled by
default.
FreeRTOS:
ports/freertos/config/memfault_metrics_heartbeat_freertos_config.def
file is not included from the user memfault_metrics_heartbeat_config.def
file. Compilation would fail previously with hard-to-follow errors due to
missing metrics definitions. This change makes the compilation error
explicit.
ESP-IDF:
esp_log_set_vprintf()
(bydefault this is enabled on system boot). Use
CONFIG_MEMFAULT_LOG_USE_VPRINTF_HOOK=n
to disable the Memfault hook. Note
that this will disable capturing ESP-IDF logs in Memfault.
Allow disabling the built-in Connectivity
Core Metric collection, which
is enabled by default to track WiFi uptime. Use
CONFIG_MEMFAULT_ESP_WIFI_CONNECTIVITY_TIME_METRICS=n
to disable the
built-in implementation.
General:
The scale factor will in the future be used to divide the uploaded metric
values. For example, if a Metric is defined with a scale factor of 10
, all
values reported for that Metric will be divided by 10
when received by
Memfault. The resulting value is stored as a floating point number in
Memfault.
ESP-IDF:
memfault_boot()
in theESP32 example app that was causing the device to not boot correctly. This was a regression in v1.7.4.
FreeRTOS:
timer_task_stack_free_bytes
. This metric is enabled by default and can be
disabled by setting
#define MEMFAULT_FREERTOS_COLLECT_TIMER_STACK_FREE_BYTES 0
in
memfault_platform_config.h
.
ESP-IDF:
error to a warning
FreeRTOS:
hour), due to a limitation in the implementation of pdMS_TO_TICKS()
in
older FreeRTOS versions. Newer version of FreeRTOS (as of V11.0.0
published December 2023) have fixed this
issue.
nRF-Connect SDK:
example apps to nRF-Connect SDK v2.6.0
In the Memfault SDK nRF9160 example app,
set the Kconfig flag CONFIG_DOWNLOAD_CLIENT_HTTP_FRAG_SIZE_1024=y
in
prj.conf
instead of via a conditional CMakeLists.txt
expression. This
makes the setting more explicit for users that are referencing the sample
app.
ESP-IDF:
MEMFAULT_DISABLE=1
environment variable in the build environment (ex:
MEMFAULT_DISABLE=1 idf.py build
). This is useful in cases where the
Memfault component can not be n-selected in the application's root
CMakeLists.txt
but needs to be conditionally excluded, for example when
building a reduced factory firmware image.
Zephyr:
Add new Kconfig flags for the following Memfault Core Metrics:
MEMFAULT_METRICS_SYNC_SUCCESS
(default=y)MEMFAULT_METRICS_MEMFAULT_SYNC_SUCCESS
(default=y)MEMFAULT_METRICS_CONNECTIVITY_CONNECTED_TIME
(default=y)MEMFAULT_METRICS_BATTERY_ENABLE
(default=n)Additionally, a Kconfig flag MEMFAULT_BATTERY_METRICS_BOOT_ON_SYSTEM_INIT
will enable auto-initialization of battery metrics on system init (requires
memfault_platform_get_stateofcharge()
to be implemented).
See https://mflt.io/core-metrics for more information on Core Metrics.
ESP-IDF:
General:
are booted (previously only un-booted components would print):
Plaintext
```plaintext
MFLT:[INFO] =============================
MFLT:[INFO] Component Boot Test
MFLT:[INFO] =============================
MFLT:[INFO] Component | Booted?|
MFLT:[INFO] -----------------------------
MFLT:[INFO] Event Storage | yes|
MFLT:[INFO] Logging | yes|
MFLT:[INFO] Reboot Tracking | yes|
MFLT:[INFO] Trace Event | yes|
MFLT:[INFO] All components booted
MFLT:[INFO] =============================
```
Restore the Memfault Demo CLI heartbeat
command, which was unintentionally
removed in v1.7.1. This command triggers a heartbeat on-demand, for testing
heartbeat functionality.
Zephyr:
for devices that use mbedTLS for TLS connections.
ESP-IDF:
CONFIG_MEMFAULT_COMPACT_LOG_ENABLE
. Updating from older versions of the
SDK would require opting in to that option, even if Compact Logging was
enabled via the Memfault config flag, MEMFAULT_COMPACT_LOG_ENABLE
.
Instead, support enabling Compact Logs both via the Memfault config flag or
the Kconfig flag, to require no changes when updating the SDK for existing
users.
General:
function to avoid an empty archive not allowed by the system clang install
MEMFAULT_REBOOT_MARK_RESET_IMMINENT_CUSTOM()
that is more
concise for custom reboot reasons by taking the reboot reason name directly.
Previously, MEMFAULT_REBOOT_MARK_RESET_IMMINENT()
was the only option,
which requires passing a key with MEMFAULT_REBOOT_REASON_KEY()
.memfault_metrics_session_register_start_cb()
. This change enables, for
example, tracking battery percent drop across sessions; battery state
tracking variables can now be initialized at the start of a session.CONFIG_MEMFAULT_SHELL_SELF_TEST_COREDUMP_STORAGE=y
on Zephyr,
CONFIG_MEMFAULT_CLI_SELF_TEST_COREDUMP_STORAGE=y
on ESP-IDF, or by adding
#define MEMFAULT_DEMO_CLI_SELF_TEST_COREDUMP_STORAGE 1
to your
memfault_platform_config.h
for other platforms.heartbeat_dump
command to metrics_dump
that can
either dump all current heartbeat metrics with metrics_dump heartbeat
or
all session metrics with metrics_dump sessions
that haven't yet been
exported. These commands help with testing metrics collection locally
without needing to push chunks to Memfault.https://mflt.io/contact-support instead of the Memfault support email. This link will redirect to a form where questions can be sent to the Memfault support team.
Update the README.md
s in example apps to point to the
Demo CLI page on the Memfault
docs website where comprehensive information is available on commands and
their output
nRF-Connect SDK:
change will ensure that all certificates are updated if they do not match expected contents. Prior to v1.7.1, the SDK would only update a certificate by checking each tag for certificate existence, not certificate content. In v1.3.0, the order of root certificates was changed and one was removed. On devices running pre-1.3.0 firmware, updating to later versions can hit a mismatch between the expected certificates and those in modem storage.
General:
in addition to those defined in
components/include/memfault/core/reboot_reason_types.h.
Users can create custom reboot reasons for both expected and unexpected
reboots. For more information see
components/include/memfault/core/reboot_tracking.h.
Enable this feature with Kconfigs in Zephyr and ESP-IDF
(CONFIG_MEMFAULT_REBOOT_REASON_CUSTOM_ENABLE=y
) or by adding
#define MEMFAULT_REBOOT_REASON_CUSTOM_ENABLE 1
to your
memfault_platform_config.h
.
#define MEMFAULT_MESSAGE_HEADER_CONTAINS_PROJECT_KEY 1
and
#define MEMFAULT_PROJECT_KEY "<project key string>"
to your
memfault_platform_config.h
. Any chunks sent using this configuration will
be sent to the project routed with MEMFAULT_PROJECT_KEY
rather than the
project routed with the POST header's Project Key.General:
memfault_platform_get_time_since_boot_ms()
and
memfault_platform_time_get_current()
. This test will catch errors like
non-monotonically increasing counters and current time reported as near
epoch time
Fixed backspace handling in the FreeRTOS QEMU example console
Added -fsanitize=leak
to the SDK unit tests (Linux only)
Fixed a missing strnlen()
definition when enabling the self test with some
libc implementations. This function is part of a POSIX standard that might
be missing from some libc implementations
Added the previous release commit for 1.6.2 to .git-blame-ignore-revs
to
allow for better git blame
output since this commit contains only
formatting changes.
Zephyr:
CONFIG_MEMFAULT_RECORD_REBOOT_ON_SYSTEM_INIT
) to allowdeferring reboot reason collection to a later point in time. Setting this
option to n
is intended to help when device info is only available after
boot completes.
Added built-in metrics for Zephyr's IP subsystem,
(CONFIG_MEMFAULT_METRICS_TCP_IP
)
Added Kconfig to select either PEM or DER formats for TLS certificates,
(CONFIG_MEMFAULT_TLS_CERTS_USE_DER
)
ESP-IDF:
CONFIG_MEMFAULT_COMPACT_LOG_ENABLE
)connectivity_connected_time
core metric for WiFi devices,
(CONFIG_MEMFAULT_ESP_WIFI_CONNECTIVITY_TIME_METRICS
)General:
clang-format
to the entire codebase, to ensure consistent codeformatting. The formatting rules are defined in
.clang-format. No other changes are included in this
release. A
.git-blame-ignore-revs
entry will be added in the next release, to enable ignoring this commit when
running git blame
. Use this ignore file in your local repo with
git config blame.ignoreRevsFile=.git-blame-ignore-revs
.
General:
correctly preserved through device reboot. This test first sets a custom
reboot reason, then calls memfault_platform_reboot()
to reboot the system.
To verify the operation succeeded, the self test is called again to check
the reboot reason was saved. The reboot reason self test can be performed by
passing the appropriate flags when calling the memfault_self_test_run()
file (see
components/include/memfault/core/self_test.h
for details), and from the demo CLI as
self_test reboot
/self_test reboot_verify
.
Fix a ti-armcl
compiler warning due to enumeration mismatch in
initialization (#190-D
).
Add a compile-time option to enable the self-test module. Enabling the
self-test increases code space utilization, and is usually of use during
set-up and SDK integration testing. The self-test can be enabled by setting
#define MEMFAULT_SELF_TEST_ENABLED 1
in memfault_platform_config.h
, or
via CONFIG_MEMFAULT_CLI_SELF_TEST=y
for ESP-IDF and
CONFIG_MEMFAULT_SHELL_SELF_TEST=y
for Zephyr.
ESP-IDF:
memfault_esp_port_ota_get_release_url()
for fetchingthe OTA release URL without performing a download. This is useful for cases where the URL is needed for other purposes, such as for fetching a downstream device OTA artifact. See ports/esp_idf/memfault/include/memfault/esp_port/http_client.h for details.
nRF-Connect SDK:
fota_download_any()
(see documentationhere), which accepts a list of certificates to use when executing FOTA downloads. This API is expected to be included in the upcoming nRF-Connect SDK v2.6.0 release.
ESP-IDF:
for the FatFS shell command handler, which saves some ~20kB of heap memory.
Also in the ESP32 example app, add a new built-in metric
sync_successful
which is set to 1
when a successful Memfault OTA
check-in is performed. Primarily added for demonstration purposes for the
metric. See more information about Memfault Core Metrics
here.
General:
Enhanced the Self-Test component with the following new features:
checking that the output buffer is large enough) - Print information about the coredump regions that would be collected during a crash, for diagnostic purposes
nRF-Connect SDK:
(ports/zephyr/ncs/src/memfault_fota.c), where the allocated Memfault OTA download URL was freed too early. This issue was introduced in Memfault SDK v1.5.0, where support for FOTA on nRF-Connect SDK v2.4+ was improved.
Zephyr:
affected configurations with CONFIG_LOG_MODE_IMMEDIATE=y
. In certain cases
the logging ctx
could be corrupted, causing unpredictable behavior.
Replace the synchronization approach with an atomic primitive and correct a
potential concurrency issue in the log panic handler.
CONFIG_NEWLIB_LIBC=y
) due to a missing declaration for strnlen
. This
warning was introduced with the Memfault Self-Test additions in Memfault SDK
v1.5.2.General:
function,
int memfault_platform_get_stateofcharge(sMfltPlatformBatterySoc *soc)
,
where the platform data is loaded into the soc
struct. This should
simplify the platform implementation, and enables platforms to return a
non-zero value to indicate state-of-charge is unknown. See the new API in
the header file
memfault/metrics/platform/battery.h
General:
self test is available via the demo cli command self_test
, or can be
called directly via memfault_self_test_run()
(see
self_test.h for details).
Currently, it validates device info and the build ID.
Add a helper macro called MEMFAULT_REBOOT_MARK_RESET_IMMINENT
in order to
make marking an imminent reboot easier. It takes the reboot reason as an
argument.
ESP-IDF:
CONFIG_MEMFAULT_ASSERT_ON_ALLOC_FAILURE
. This is useful for tracking heap
memory issues. Depending on the design, a system may in general not have any
expected malloc failures, and may not be set up to handle them. This feature
will generate issues tagged as Out Of Memory
in the Memfault platform.
Zephyr:
memfault_zephyr_port_http_upload_sdk_data()
to check the socket before each incremental call to the send()
socket
operation and wait for the socket to become available. If the socket takes
too long (a healthy 5 second timeout is given), the function will return
with an error. Note this function was previously blocking, but may now abort
mid-transfer. This check was primarily added to prevent a busy loop that
hogs the CPU, preventing lower priority threads from running. This situation
could occur with larger HTTP transfers during which the socket may be busy
processing tx data when another send request occurs.
nRF-Connect SDK:
CONFIG_DOWNLOAD_CLIENT=y
+CONFIG_MEMFAULT_FOTA=n
. This fixes the second issue reported in
#66
General:
MEMFAULT_EVENT_STORAGE_NV_SUPPORT_ENABLED
now defaultsto 0
, disabled. This saves a minor amount of code space. Most
implementations don't need the feature; for users that require it, the flag
will now need to be set in memfault_platform_config.h
as
#define MEMFAULT_EVENT_STORAGE_NV_SUPPORT_ENABLED 1
.
General:
except they are set on an arbitrary session interval (not required to be aligned to Heartbeat interval). Session metrics are useful for tracking device operation sessions- for example, measuring properties for a BLE connected stove top during a single cooking session. Session metrics automatically include a "session duration" timer metric.
Session metrics must be defined using the new session-specific APIs, but are
set using the same MEMFAULT_METRIC_SET_*
APIs as Heartbeat metrics.
See the metrics.h header file for usage details.
New built in metrics for measuring the following properties:
operational_hours
and operational_crashfree_hours
metrics, which are automatically
processed by Memfault
Plaintext
- **battery drop**: enabled with `#define MEMFAULT_METRICS_BATTERY_ENABLE 1`
in memfault_platform_config.h
. See more information in the
header file for how to
use the metric.
Plaintext
- **connectivity**: enabled with
MEMFAULT_METRICS_SYNC_SUCCESS
/MEMFAULT_METRICS_MEMFAULT_SYNC_SUCCESS
/MEMFAULT_METRICS_CONNECTIVITY_CONNECTED_TIME
.
See more information in the
header file for how
to use the metric.
These metrics are considered first-class metrics by Memfault, are exempt from quota limits, and are automatically processed by Memfault.
Zephyr:
sync_memfault_successful
/sync_memfault_failure
metrics for devices using Memfault's Zephyr HTTP chunk upload functionality.
This feature is controlled with the CONFIG_MEMFAULT_SYNC_MEMFAULT_METRICS
Kconfig flag.
Automatically set captured timestamps for events for devices that either
implement the RTC subsystem, or use the Nordic date_time
library. The
appropriate option is enabled by default based on which features are
available, and can be controlled with the Kconfig flags:
CONFIG_MEMFAULT_SYSTEM_TIME_SOURCE_DATETIME
or
CONFIG_MEMFAULT_SYSTEM_TIME_SOURCE_RTC
.
ESP-IDF:
sync_memfault_successful
/sync_memfault_failure
metrics for devices using Memfault's ESP-IDF HTTP chunk upload
functionality. This feature is controlled with the
CONFIG_MEMFAULT_SYNC_MEMFAULT_METRICS
Kconfig flag.
General:
commands. This is used in the examples/freertos demo project to add 2 new commands:
Plaintext
- `freertos_tasks` : print FreeRTOS task information, via `vTaskList()`
- `freertos_vassert` : trigger a `vAssertCalled` FreeRTOS assert, via
configASSERT()
The Shell extension API is documented in
components/include/memfault/demo/shell_commands.h,
and must be enabled by setting
#define MEMFAULT_DEMO_SHELL_COMMAND_EXTENSIONS 1
in
memfault_platform_config.h
.
Zephyr:
zephyr/random/rand32.h
headerwas renamed to zephyr/random/random.h
. This was reported in
#66- thanks
to @nordicjm for reporting this!
Add test commands for exercising Secure Faults in ARM TrustZone-enabled chips:
mflt test badptr
mflt test isr_badptr
Note that non-TrustZone chips may not trigger a fault when running those commands.
nRF-Connect SDK:
CONFIG_AT_SHELL
setting to theexamples/nrf-connect-sdk/nrf9160 sample app. This permits sending raw AT commands, useful for testing.
Specific to nRF-Connect based apps using FOTA, add a warning if
CONFIG_DOWNLOAD_CLIENT_HTTP_FRAG_SIZE > 1024
, which can sporadically error
out on nRF9160 devices (there is a limitation in the modem, see
CONFIG_DOWNLOAD_CLIENT_HTTP_FRAG_SIZE_2048=y
) and DevZone note
here.
Improve FOTA support for nRF-Connect SDK 2.4+, by improving the technique used to find the correct Memfault server root cert. Memfault uses a fast CDN to improve OTA payload delivery, which uses a different root cert than the Memfault device server. Please contact support immediately if you encounter any cert-related issues.
MEMFAULT_HEARTBEAT_SET_*
and
others) have been renamed to MEMFAULT_METRIC_SET_*
, to better support the
new Session Metric feature.General:
Rename this file from [CHANGES.md
] to [CHANGELOG.md
].
For FreeRTOS, add a warning when configRECORD_STACK_HIGH_ADDRESS
is not
enabled. Memfault uses this to show stack sizes in the coredump view for
coredumps on FreeRTOS systems. The warning can be disabled by enabling the
configRECORD_STACK_HIGH_ADDRESS
FreeRTOS config flag, or by setting
#define MEMFAULT_FREERTOS_WARN_STACK_HIGH_ADDRESS_UNAVAILABLE 0
.
Make memfault_packetizer_get_chunk()
return false
if the buffer was too
small to load a full chunk. Previously the function would return true
but
with 0
bytes loaded into the output buffer and *buf_len
set to 0
.
Update all example Metrics implementations to use the new API from v1.4.3
(eg MEMFAULT_METRIC_SET_UNSIGNED
instead of
memfault_metrics_heartbeat_set_unsigned
).
Fix compilation for systems not integrating the Metrics component but using the Demo CLI (this regressed in v1.4.3).
General:
Add a new streamlined Metrics setter API:
MEMFAULT_METRIC_SET_SIGNED(key_name, signed_value)
MEMFAULT_METRIC_SET_UNSIGNED(key_name, unsigned_value)
MEMFAULT_METRIC_SET_STRING(key_name, value)
MEMFAULT_METRIC_TIMER_START(key_name)
MEMFAULT_METRIC_TIMER_STOP(key_name)
MEMFAULT_METRIC_ADD(key_name, amount)
These APIs can be used in place of the original APIs:
Plaintext
- `memfault_metrics_heartbeat_set_signed(MEMFAULT_METRICS_KEY(key_name), signed_value)`
- `memfault_metrics_heartbeat_set_unsigned(MEMFAULT_METRICS_KEY(key_name), unsigned_value)`
- `memfault_metrics_heartbeat_set_string(MEMFAULT_METRICS_KEY(key_name), value)`
- `memfault_metrics_heartbeat_timer_start(MEMFAULT_METRICS_KEY(key_name))`
- `memfault_metrics_heartbeat_timer_stop(MEMFAULT_METRICS_KEY(key_name))`
- `memfault_metrics_heartbeat_add(MEMFAULT_METRICS_KEY(key_name), amount)`
Saving some typing!
Add the ability to compute FreeRTOS task stack high watermarks when storing
coredumps. This is useful only if the entire RAM (.data
+ .bss
) cannot
be saved in the coredump. The feature is opt-in with the config flag
#define MEMFAULT_COREDUMP_COMPUTE_THREAD_STACK_USAGE 1
.
Add a heartbeat
command to the core demo cli. This
behaves the same as the commands of the same name already present in the
Zephyr + ESP-IDF port.
Add a test_cassert
command to the core demo cli. This command executes a C
stdlib <assert.h>``assert(0)
call. For platforms that do not implement a
assert()
handler, a config flag MEMFAULT_DEMO_DISABLE_CASSERT
can be
defined to 0
to disable the command.
ESP-IDF:
wifi_ap_oui
, which will record the associatedAP's Organizationally Unique Identifier (OUI) in the Memfault heartbeat.
Zephyr:
Memfault Coredump Settings
submenu, for easier navigation when using
graphical Kconfig frontends like menuconfig.
General:
(#188-D: enumerated type mixed with another type
) when initializing a
structure in
components/core/src/memfault_log.c
:314.
Improve the quality of Assert backtraces when using the ARM C Compiler v5.
Certain frames in the assert call stack were missing link register
information, due to compiler optimizations based on the noreturn
and
unreachable compiler hints. These hints have been removed for armcc
, which
should permit full stack unwinding for Assert coredumps generated from
builds on that toolchain.
Perform an update of the timer when calling the
memfault_metrics_heartbeat_timer_read()
debug function. Fixes
#65. Thanks to
@LuskeyNoah for providing this fix!
ESP-IDF:
in 1.4.0
)- the memfault_platform_port.h
file was still incorrectly
required. This is now fixed.
General:
optimization settings (-Oh
)
ESP-IDF:
disabled with the CONFIG_MEMFAULT_ESP_HEAP_METRICS
Kconfig flag.
Plaintext
- `heap_free_bytes`
- `heap_largest_free_block_bytes`
- `heap_allocated_blocks_count`
- `heap_min_free_bytes`
Zephyr:
on Zephyr systems. Note that this does not enable decoding
Zephyr "dictionary logs",
but requires using the Memfault logging APIs directly (i.e.
MEMFAULT_LOG_INFO("...")
instead of LOG_INF("...")
).
General:
coredump_size
CLI command to the Zephyr, ESP-IDF, and demo CLIimplementations. This command will print the computed size of the coredump and the available storage space. Can be used to tune coredump size.
Enable providing the Memfault HTTP Client with a custom
memfault_platform_get_device_info()
callback, for when the device is
uploading data for a downstream device, with different device info.
When compact logging is enabled, route all
MEMFAULT_LOG_x()
statements through the compact serializer
(MEMFAULT_COMPACT_LOG_SAVE
). Previously, logs had to explicitly use the
MEMFAULT_COMPACT_LOG_SAVE
API to store in the compact form.
Capture C stdlib assert.h
asserts, by implementing the correct assert
hooks for Newlib/Picolibc and IAR libc's. This can be disabled with the
Memfault platform config MEMFAULT_ASSERT_CSTDLIB_HOOK_ENABLED
. This should
improve the Trace quality for systems that are using the C stdlib
assert(x)
functions.
ESP-IDF:
makes the template + platform config files optional. See the ESP32 Integration Guide section on configuration files for details.
ESP-IDF:
CONFIG_MEMFAULT_DEFAULT_GET_DEVICE_INFO=n
. This was a regression in
1.3.3.
Add a new Kconfig flag, MEMFAULT_COREDUMP_STORAGE_MAX_SIZE
, which can be
used to set the Memfault SDK's built-in
ESP-IDF coredump storage implementation
to artificially limit the maximum coredump storage size. This is useful for
situations where the default memfault_platform_coredump_get_regions()
function is still desirable, but the coredump maximum size needs to be
limited (eg for bandwidth reasons).
Switch to using ESP_DRAM_LOGE
when logging an error from Memfault's
FreeRTOS task tracking when the number of tasks created on the system
exceeds MEMFAULT_PLATFORM_MAX_TRACKED_TASKS
(default of 16).
General:
on system boot. This value is now automatically extracted by the Memfault backend from the symbol file, and does not need to be set by devices.
ESP-IDF:
project on ESP-IDF versions earlier than v5. This was a regression in 1.3.4.
Conditionally remove a redundant call to esp_timer_init()
during the
memfault_boot()
sequence, which was causing a runtime error message. This
call was originally required when memfault_boot()
was called as part of
ESP-IDF system init, which was disabled by default in 0.31.4 and
deprecated in 0.40.0. The redundant call was harmless but generated a
nuisance error message.
Fix another build error in the public unit tests caused by the -fanalyzer
flag. The -fanalyzer
static analyzer was generating a false positive on
GCC 11. Updating the GCC version to 12 removes the false positive.
ESP-IDF:
memfault
component, esp_https_ota
. It'sonly linked into the target project if the memfault_esp_port_ota_update()
API is used. This was previously an implicit dependency from the common
component dependencies, when building memfault
into an ESP-IDF
component-style project. This change fixes building for non-component-style
ESP-IDF projects, where the default component dependencies might not be
included.
Multiple changes to the examples/esp32 sample project:
coredump_size
shell command, which prints out the maximumcoredump size and the available coredump storage capacity.
- Add new settings_[get|set]
shell commands, and enable setting the LED
brightness and blink interval to NVS. This is intended as a minor
quality-of-life change for internal Memfault users of the example app.
-fanalyzer
flag to the unit test compilation options.Zephyr:
CONFIG_MEMFAULT_FAULT_HANDLER_RETURN
, which willcall the normal z_fatal_error
handler at the end of Memfault fault
processing instead of rebooting the system. This is useful when user code
needs to run within k_sys_fatal_error_handler()
just prior to system
shutdown. Thanks to @JordanYates for the
patch! Fixes
#59.
Add a timeout to the initial send()
socket operation in
memfault_zephyr_port_http_upload_sdk_data()
, to abort the transfer if the
socket is blocking for too long. That function will execute repeated
send()
calls to drain all the buffered Memfault data; this update only
changes the initial call to check for a timeout, but otherwise will keep
trying until the process completes, or a watchdog triggers. This is to
balance the existing behavior, where a badly performing socket will still
eventually push data through, but improves the case where the socket fails
on the initial send (more common failure mode).
Remove a nuisance build warning generated when configured with
CONFIG_LOG_PRINTK=y && CONFIG_LOG_MODE_DEFERRED=y
. This impacts the
usability of exporting base64-encoded chunks on the shell for testing
(mflt export
command), but is otherwise harmless.
ESP-IDF:
examples/esp32 sample project:
Plaintext
- Disable WiFi SoftAP by setting `CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n`, since
it's unused in the sample app. This saves about 40kB flash.
- Permit setting the Memfault Project Key at runtime, with a new cli command
project_key
. The key is saved in Non-Volatile Storage on the ESP32
board.
General:
__no_alloc
attribute to the compact log symbols, to have the IAR linker
set the NO_LOAD
attribute correctly on the compact log output section.
ESP-IDF:
memfault_get_device_info()
function, which uses the device MAC address for
the Memfault Device Serial. When updating the Memfault SDK in an existing
project, this implementation will cause a linker error due to duplicate
definition. To disable the built-in definition, set
CONFIG_MEMFAULT_DEFAULT_GET_DEVICE_INFO=n
.
Zephyr:
<cmsis_core.h>
instead of <nmi.h>
. Thanks @kmeinhar for this change!(see #64)
nRF Connect SDK:
CONFIG_FLASH_MAP=y
+ CONFIG_STREAM_FLASH=y
forthe examples/nrf-connect-sdk/nrf5/ example app, for compatibility with nRF Connect SDK v2.4.1+. This was required due to an upstream Zephyr change.
MEMFAULT_LOG_COMPACT_ENABLE=1
in memfault_platform_config.h
. See
the docs for more
details.<intrinsics.h>
required by the IAR compilerCONFIG_MEMFAULT_COREDUMP_COMPUTE_THREAD_STACK_USAGE
, to
control whether thread stack usage is computed and collected on device
during a coredump.nmi.h
header which
moved recently.memfault_metrics_heartbeat_collect_data
.heartbeat
cli command to the ESP-IDF port that does the same thing
as in Memfault's default demo console + Zephyr's console.CONFIG_MEMFAULT_PLATFORM_EXTRA_CONFIG_FILE=y
, which causes
memfault_platform_config_extra.h
to be included in platform
configurations. This can be utilized by a third party consumer of Zephyr to
more easily extend the platform configurations set by Zephyr and avoid
potentially losing a user's platform configurations set in
memfault_platform_config.h
, which
happened in the nRF Connect SDK recently.Set Memfault SDK version in a string metric on device boot, for easier tracking of SDK versions in the Memfault UI
Support using a different identifier for the GNU build id symbol (previously
was fixed to __start_gnu_build_id_start
). Use the
MEMFAULT_GNU_BUILD_ID_SYMBOL
define in memfault_platform_config.h
to
override the default. For Zephyr, the Kconfig option
CONFIG_MEMFAULT_GNU_BUILD_ID_SOURCE_BUILTIN
can be used to override the
builtin section specifier + linker fragment for the GNU build ID. Thanks to
@JordanYates for posting this change in
#60 🎉
Improvements to the ARMv7-R exception handling when the supervisor processor mode is active
Zephyr:
Improve compatibility in reboot reason tracking and watchdog implementation on Silicon Labs Series 2 MCUs
Zephyr:
CONFIG_MEMFAULT_LOGGING=n
, see
#56. Thanks
to @JordanYates for reporting this issue!CONFIG_LOG_MODE_IMMEDIATE=y
when flushing of fault logs during a crashNew built-in metrics 🎉 !
idle_task_run_time_percent
.This is automatically enabled for FreeRTOS builds with the correct tracing options enabled, see ports/include/memfault/ports/freertos/metrics.h for details on how to enable or disable this metric.
MbedTLS metrics for maximum and current memory used: mbedtls_mem_max_bytes
and mbedtls_mem_used_bytes
. These are automatically enabled for ESP-IDF
projects, see
ports/mbedtls/memfault_mbedtls_metrics.c
for usage details
Renamed the built-in LwIP metrics added in SDK version 1.0.1 from
Tcp_Drop_Count
/Tcp_Rx_Count
/Tcp_Tx_Count
,
Udp_Drop_Count
/Udp_Rx_Count
/Udp_Tx_Count
to be all lowercase
tcp_drop_count
/tcp_rx_count
/tcp_tx_count
,
udp_drop_count
/udp_rx_count
/udp_tx_count
Add the following automatically enabled WiFi performance metrics to the ESP-IDF port:
wifi_connected_time_ms
wifi_disconnect_count
wifi_sta_min_rssi
Fix a bug in the mbedtls port causing an infinite loop under certain error conditions on TLS handshake
Zephyr:
logging is enabled. This ensures the latest log statements are included in
the coredump log data, when the CONFIG_MEMFAULT_LOGGING_ENABLE=y
ESP-IDF:
ESP_ERROR_CHECK()
assert coredumps will now correctly show as assert inthe Memfault coredump analysis view, instead of "Hard Fault"
Zephyr:
the full stack contents for each thread. This feature was originally
released in SDK 0.43.0
.
ESP-IDF:
Kconfig flag CONFIG_MEMFAULT_LWIP_METRICS
controls this feature, which is
enabled by default. The LwIP metrics helper is available for non-ESP-IDF
projects using LwIP, see
ports/lwip/memfault_lwip_metrics.c
for details
🎉🎉🎉
The Memfault Firmware SDK is now version 1.0.0
as of this release! Note that
this is just a procedural change, there are no breaking backwards-incompatible
changes in this release. We forgot to update our major version back in 2019, but
better late than never 😅! Hopefully the remaining 281,474,976,710,656 versions
are enough 🤞.
🎉🎉🎉
Zephyr:
FileSystem_BytesFree
for tracking VFS bytesfree. This is enabled automatically when CONFIG_FILE_SYSTEM=y
. Use the
Kconfig option MEMFAULT_FS_BYTES_FREE_VFS_PATH
to set the VFS mount point
to monitor utilization (default value is /lfs1
). The Kconfig option
MEMFAULT_FS_BYTES_FREE_METRIC
can be used to disable the metric.
shell_print
instead of
MEMFAULT_LOG
for command usage errorsZephyr:
memfault_zephyr_coredump_get_regions(). Default settings are identical to before this change.
Plaintext
- `CONFIG_MEMFAULT_COREDUMP_COLLECT_STACK_REGIONS`
- `CONFIG_MEMFAULT_COREDUMP_COLLECT_KERNEL_REGION`
- `CONFIG_MEMFAULT_COREDUMP_COLLECT_TASKS_REGIONS`
Fix a build error when an application is configured without
CONFIG_HEAP_MEM_POOL_SIZE=y
(i.e. no kmalloc
in use).
Fix a build error when building the nRF9160 example on nRF-Connect SDK v2.3.0.
ESP-IDF:
memfault_metrics_heartbeat_add()
would no longer be included in the serialized heartbeat data. This regression
occurred in 0.42.0
.Zephyr:
z_NmiHandlerSet
function is renamed for the upcoming Zephyr 3.4.Support the new name. Fixes #49. Thanks @mbolivar-nordic for filing this issue!
Add a QEMU-based FreeRTOS example project, find it under examples/freertos
Switch printf
function attribute to use __printf__
, to avoid collision
with user code that redefines the printf
token
Zephyr:
coredump. This enables showing high watermark information in the Memfault coredump analysis view without capturing the full stack for a thread
Zephyr:
LEGACY_CONFIG_PATH
Kconfig selection, now that the zephyr.h
header is no longer used as of Memfault SDK 0.42.0
. This option no longer
exists after Zephyr v3.3.0. Fixes
#48
memfault_log_export_logs()
. See the
log.h header for detailed usage.Zephyr:
determining stack high watermarks. This feature is enabled by setting
CONFIG_MEMFAULT_COREDUMP_FULL_THREAD_STACKS=y
Remove usage of the zephyr.h
header in preparation for Zephyr v3.4.0.
Thanks to @jfischer-no for the patch!
memfault_gdb.py
:
Zephyr / nRF-Connect SDK:
fail when building with Zephyr versions before 3.0 (nRF-Connect SDK < 2.0). This regression was introduced in Memfault Firmware SDK 0.33.3.
CONFIG_MEMFAULT_AUTOMATIC_INIT
has been deprecated and is no
longer supported. Users of this Kconfig should refactor their application to
call memfault_boot
during initialization. Use of this Kconfig now results
in a build error. For more information please seehttps://docs.memfault.com/docs/mcu/esp32-guide#initializing-memfault
memfault_platform_coredump_get_regions
is
changed to collect the current active stack, .bss, .data, and .heap regions.
Additionally if you are using ESP-IDF >= 4.4.0, the SDK will prioritize
collecting FreeRTOS regions containing task TCB and stack data.MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE
(see
default_config.h) can be set
to 0
in memfault_platform_config.h
to return to the previous behavior.CONFIG_POSIX_API=y
in the Zephyr port HTTP clientmemfault coredump --region x y
, now support parseable GDB expressions for
the range arguments instead of requiring integer values. Thanks to @alvarop
for this patch
#43 !info all-registers
command when dumping registers, instead of the
deprecated info registers all
command, which works better on certain
arch/monitor setups. Thanks to @alvarop for this patch
#44 !MEMFAULT_PLATFORM_FREERTOS_TCB_SIZE
in `memfault_platform_config.h".Built-in Metrics
MemfaultSdkMetric_UnexpectedRebootDidOccur
metric. This metric usesthe platform's reboot register and any reasons by the SDK function
memfault_reboot_tracking_mark_reset_imminent
to classify a reboot. When
reboot tracking determines a reboot is unexpected, this metric is set to 1.
Otherwise this metric is 0.
Demo CLI
mflt test loadaddr
command. This command is used to test specific
faults due to protected regionsMemfaultSdkMetric_UnexpectedRebootDidOccur
,
classifies all reboot reasons greater than or equal to
kMfltRebootReason_UnknownError
or equal to kMfltRebootReason_Unknown
as "unexpected reboots". It is recommended to ensure your platform's
implementation of memfault_reboot_reason_get
classifies the reboot
register values as accurately and precisely as possible to avoid incorrect
metric values.ESP-IDF:
just-released ESP-IDF v5 🎉! Thanks to @jlubawy and the patch supplied in #39 for this, very much appreciated!
Add an auto-OTA (and auto-WiFi-join) feature to the ESP32 example app- enabled by default but can be disabled with Kconfig
The Heap Stats tracing component has been revamped to make more efficient usage of the bookkeeping structure. Usage should be the same as before, but now should provide more data without significantly expanding the memory utilization.
mflt test hang
) in
examples/nrf-connect-sdk/nrf5/CONFIG_QEMU_ICOUNT=n
in
examples/zephyr/qemu/, which fixes the emulated
target execution speedmemfault_demo_cli_cmd_assert()
test command to take a single arg,
which is used in MEMFAULT_ASSERT_RECORD()
. This enables testing that assert
variant from the CLI.memfault_ota_check
test commandidf.py build && idf.py build
) would
report a nuisance failure.CONFIG_MEMFAULT_HEAP_STATS
Kconfig option (enabled by
default), and will track allocations done with k_malloc()
.memfault_metrics.c
when using the ARMCC v5
compiler.g_mflt_http_client_config
in your platform portCONFIG_MEMFAULT_PROJECT_KEY="YOUR_PROJECT_KEY"
to your projects
sdkconfig.defaults
examples/nrf-connect-sdk/nrf9160
, to build and run correctly with
nRF-Connect SDK v2.1.0LOG_PANIC()
before running the Memfault fault handler, to
flush any deferred logs before the rebootLOG_OUTPUT
when MEMFAULT_LOGGING_ENABLE
is enabled- this fixes a
build error if all other log backends are disabled. thanks to @balaji-nordic
for this fix! closes #33#include <zephyr.h>
→ #include <zephyr/zephyr.h>
). The includes
were moved
prior to v3.1
of Zephyr, but v3.2
changes the backwards compatibility support to opt-in.
The Memfault SDK is now updated to support both.E
prefix (regression introduced in Memfault SDK version 0.32.0)CONFIG_LOG_MODE_IMMEDIATE
and
using LOG2 to capture the full log line instead of each logged character as
a separate line.v2.x
migrated to common
, now that Zephyr v1.14
support has been removed (done in v0.32.0 of the Memfault SDK)crash 1
→ test_hardfault
, etc).printk
by default when no
logging is enabled. This can be disabled by setting
CONFIG_MEMFAULT_PLATFORM_LOG_FALLBACK_TO_PRINTK=n
.MEMFAULT_LOG_DEBUG()
etc) are now routed to the Zephyr
logging infrastructure. The typical set of Kconfig options for Memfault logs
are available (CONFIG_MEMFAULT_LOG_LEVEL_WRN
etc). See details in
"Breaking Changes" below for enabling logs in your project.MEMFAULT_ZEPHYR_FATAL_HANDLER
, which can be
used to disable the Zephyr fault handler print facilities.MEMFAULT_ROOT_CERT_STORAGE
, to avoid a nuisance build errorUsers will no longer see internal Memfault log output by default, but will have to enable it explicitly to see the output:
Ini
# enable LOG
CONFIG_LOG=y
# not required- enabling the Memfault logging component enables including the
# log buffer in coredumps
CONFIG_MEMFAULT_LOGGING_ENABLE=y
# if on pre-v3.1.0 zephyr, you can choose either the default LOG v1
# implementation, or select a LOG2 mode to enable LOG2. on zephyr 3.1.0+, LOG
# v1 is removed and LOG v2 is now the only log implementation
# CONFIG_LOG2_MODE_DEFERRED=y
# make sure to select a log backend to see the output
CONFIG_LOG_BACKEND_UART=y
The log statements affected by this change are likely only the internal
Memfault SDK logs (MEMFAULT_LOG_DEBUG()
etc), unless those macros are used
in the user application.
More logically grouped Kconfig settings in Zephyr example app's prj.conf
Fixed a few typos in particle port documentation
Simplified compilation steps for the nRF91 sample test app when compiling with older releases of the nRF Connect SDK and refreshed the example to target the v2.0.2 release by default
Updated default demo CLI commands to better align with our suggested integration test commands. The default set now looks like this:
Bash
mflt> help
clear_core: Clear an existing coredump
drain_chunks: Flushes queued Memfault data. To upload data see https://mflt.io/posting-chunks-with-gdb
export: Export base64-encoded chunks. To upload data see https://mflt.io/chunk-data-export
get_core: Get coredump info
get_device_info: Get device info
test_assert: Trigger memfault assert
test_busfault: Trigger a busfault
test_hardfault: Trigger a hardfault
test_memmanage: Trigger a memory management fault
test_usagefault: Trigger a usage fault
test_log: Writes test logs to log buffer
test_log_capture: Trigger capture of current log buffer contents
test_reboot: Force system reset and track it with a trace event
test_trace: Capture an example trace event
help: Lists all commands
Zephyr port: enable proper backtraces for Zephyr __ASSERT()
macro on
aarch32/cortex_m. Prior to this fix, crashes from __ASSERT()
triggering
would show an incorrect PC/LR for the active thread.
Support for pre-release nRF Connect SDK v2.0.99 and Zephyr > v3.1:
memfault_platform_reboot()
by default. It did not impact the
collected backtrace, but it would show a nuisance __ASSERT()
in the
console output, if CONFIG_ASSERT=y
.memfault_demo_cli_cmd_print_chunk()
in Memfault SDK release v0.31.4.ESP32 port: add new Kconfig option, CONFIG_MEMFAULT_AUTOMATIC_INIT
, that can
be explicitly set to n
to skip automatically initializing the Memfault SDK
on boot. This can be useful if Memfault SDK initialization needs to be
deferred to application start.
Zephyr port: add Kconfig options,
CONFIG_MEMFAULT_INIT_PRIORITY
/CONFIG_MEMFAULT_INIT_LEVEL_POST_KERNEL
for
controlling the Memfault SDK initialization level and priority. This can be
useful when needing Memfault to initialize earlier in the system startup
sequence, for example for diagnosing crashes in an early driver
initialization.
Partial support, still in progress, for NRF Connect SDK + Zephyr v3.1:
NET_SOCKETS_OFFLOAD_TLS
to enable building without warnings. NOTE: if
mbedtls is enabled (CONFIG_MBEDTLS=y
), but is not being used for HTTP
transfers (eg, mbedtls is used for security functions, but the device does
not use HTTP for transferring data), it may be necessary to explicitly set
CONFIG_MEMFAULT_HTTP_USES_MBEDTLS=n
.Zephyr port: remove an unused header file,
ports/zephyr/common/memfault_zephyr_http.h
Remove memfault_demo_cli_cmd_print_chunk()
demo function.
memfault_data_export_dump_chunks()
can be used instead, which is intended to
be used with the "Chunks Debug" UI in the Memfault web application- see
here for more details
MEMFAULT_ASSERT
with the TI ARM Clang Compilermemfault_platform_reboot()
. See details in
ports/zephyr/include/memfault/ports/zephyr/coredump.hMEMFAULT_NRF_CONNECT_SDK
by default
when targeting the nrf52 + nrf53 series SOCs (previously only enabled by
default for nrf91 series)Added clarifications around licensing in ports and examples folders. See README for more details.
hardware_version
argument when initializing the Memfault libraryPLATFORM_NAME
macro instead of
PRODUCT_SERIES
macroCONFIG_MEMFAULT_HTTP_USES_MBEDTLS
CONFIG_NORDIC_SECURITY_BACKEND
enabled. New Kconfig flag CONFIG_MEMFAULT_HTTP_USES_MBEDTLS
can be used to
manually control this configuration if necessary (default should be set
correctly in most cases)CONFIG_ARM_MPU
flag enabledCONFIG_OPENOCD_SUPPORT=y
in your prj.conf
kMfltRebootReason_KernelPanic
for explicitly tracking fatal resets from
within a OS or RTOSkMfltRebootReason_FirmwareUpdateError
for explicitly tracking resets due
to firmware update failures or rollbackslcov
is sourced from when running unit tests in CImemfault_metrics_heartbeat_set_string()
in
components/include/memfault/metrics/metrics.h
for the new API. See the Memfault Docs for
general information on using the metrics API.memfault_metrics_heartbeat_debug_print()
to also print current timer
values, instead of showing 0
. See
components/include/memfault/metrics/metrics.h
for details+
). Update the ESP port to check for reserved characters in query params
and emit an errorcmake/Memfault.cmake
, as reported in
issue #21
(thank you @C47D !)1.0.0-dev
instead of
1.0.0+<6 digits of build id>
for the version specifier. Build id is no
longer required for symbol file reconciliation and the +
character is a
reserved character for URI schemes; this impacted OTA release requests. See
this document for
Memfault's recommended versioning strategyblack
and isort
formatters on python codemflt_shell_init()
, see the Mynewt port README.md
for details. Huge thanks to @t3zeng for providing this implementation!LOG2
deferred mode on zephyr. This should fix bootloops when
enabling LOG2
.MEMFAULT_ASSERT_RECORD()
to
MEMFAULT_ASSERT_EXTRA_AND_REASON()
(regression in v0.23.0). This affected
the _extra
additional context value passed via this macro.MEMFAULT_COREDUMP_CB=1
memfault_fault_handler
that could
arise when compiling with -flto
.memfault_fault_handling_arm.c
that arose when
using certain versions of the Clang compiler.Added preview of the Memfault Diagnostic GATT Service (MDS). This service can be used to transparently forward data collected by the SDK to a Bluetooth Low Energy gateway and proxied to the cloud. See ports/include/memfault/ports/ble/mds.h for more details!
Implemented utility python script which can be
used for quickly adding a memfault-firmware-sdk
port to an eclipse project.
For more details, run
Bash
python scripts/eclipse_patch.py --help
Added example project demonstrating integration of Memfault on Cypress' CY8CKIT-064S0S2-4343W running Amazon-FreeRTOS publishing data using an AWS IoT MQTT broker. For more details about how to run the Memfault example, see examples/cypress/CY8CKIT-064S0S2-4343W/README.md.
Fixed a compiler warning emitted when using TI's GCC Compiler as reported by @albertskog in issue #18
flake8-pytest-style
linter to
scripts/tests/test_memfault_gdb.py.sort
to guarantee a deterministic file list order irrespestive of
make version. A consistent
order is useful for
reproducible builds.__has_include()
in Zephy port to remove the requirement of
always needing to creatememfault_platform_config.h
,
memfault_metrics_heartbeat_config.def
, &
memfault_trace_reason_user_config.def
for a build to compile. To force a
compile failure instead when any of these files do not exist, a user can set
CONFIG_MEMFAULT_USER_CONFIG_SILENT_FAIL=nmemfault_packetizer_set_active_sources
, to the
data_packetizer module,
which let's one control the exact data sources that will get packetized. See
description in the header for more detailsMEMFAULT_SOFTWARE_WATCHDOG
macrothe KConfig options used to select CONFIG_MEMFAULT_HTTP_ENABLE
&
CONFIG_MEMFAULT_ROOT_CERT_STORAGE_NRF9160_MODEM
&
CONFIG_MEMFAULT_NRF_CONNECT_SDK
when using nRF91 targets.
export
command to the demo cli to better mirror
our suggested integration test commandsBOARD_NRF9160DK_NRF9160NS
or BOARD_THINGY91_NRF9160NS
), the following
KConfig options will now be enabled by default. The following can be added to
your prj.conf
to restore the original behavior:CONFIG_MEMFAULT_HTTP_ENABLE=n
CONFIG_MEMFAULT_NRF_CONNECT_SDK=n
CONFIG_MEMFAULT_ROOT_CERT_STORAGE_TLS_CREDENTIAL_STORAGE=y
MEMFAULT_TRACE_EVENT_WITH_LOG
and an integer along with arguments will be serialized instead. The actual
string will recovered and formatted when it arrives in the Memfault cloud.
This leads to a massive reduction in space & bandwidth needed to send trace
events. For more details about how to set up,
check out this guide!-Wshadow
compiler error that would arise in
memfault_coredump_regions_armv7.c
when MEMFAULT_COLLECT_MPU_STATE
was enabledMEMFAULT_SOFTWARE_WATCHDOG
If you were already using MEMFAULT_SOFTWARE_WATCHDOG
, you will need to
update your call site invocations to remove the argument being passed. i.e
Diff
- MEMFAULT_SOFTWARE_WATCHDOG(0);
+ MEMFAULT_SOFTWARE_WATCHDOG();
-fsanitize=undefined
pypi
:
pip install mflt_build_id
MEMFAULT_HTTP_PERIODIC_UPLOAD_CONTEXT
, so the default can be overridden
from other Kconfig files.MEMFAULT_HTTP_DEDICATED_WORKQUEUE_STACK_SIZE
CONFIG_MEMFAULT_NRF_CONNECT_SDK
is now only enabled by default when
CONFIG_MEMFAULT=y
CONFIG_DEBUG_THREAD_INFO=y
is now selected by default (in prep for
deprecation of CONFIG_OPENOCD_SUPPORT
)CONFIG_MEMFAULT_USER_CONFIG_ENABLE=y
) which can be used
to remove requirement of providing any user specific configuration.CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_USE_SYSTEM_WORKQUEUE
. This is the
default and matches previous release behavior of posting data to Memfault
from the system work queueCONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD_USE_DEDICATED_WORKQUEUE
This is a
new option which can be used to post data from a dedicated worker queue.
This can be useful if the network stack may block for extended periods of
time which would stall other system work queue jobs from getting
processed.MEMFAULT_SHELL
by default when the Zephyr shell is enabled. CONFIG_SHELL=y
must now be
enabled explicitly in your prj.conf
for the Memfault Shell to be enabled.sMemfaultBuildIdStorage
structure to track the build id length used
for event serialization and updated fw_build_id.py
script to extract information.MEMFAULT_DEFAULT_REBOOT_REASON_IMPL
Kconfig option with
MEMFAULT_REBOOT_REASON_GET_CUSTOM
and updated default configuration for
the nRF Connect SDK. This fixes an issue resulting in the
generic memfault_reboot_reason_get
getting linked rather than the
nRF Connect SDK port.CONFIG_MEMFAULT_COREDUMP_COLLECT_DATA_REGIONS
to enable/disablecollection of .data
region
- CONFIG_MEMFAULT_COREDUMP_COLLECT_BSS_REGIONS
to enable/disable
collection of .bss
region
- CONFIG_MEMFAULT_COREDUMP_STORAGE_CUSTOM=y
can be used to opt out of
the default RAM backed coredump implementation and provide a custom one
in the port.
Added support for collecting additional register information when a Hardfault takes place when using the Zephyr port. This information will be decoded and displayed in the Memfault UI in the "Exceptions" tab.
Updated
buffered_coredump_storage.h
to use memmov
instead of memcpy
since dst
and src
buffers may overlap
when all of .bss
is saved in a coredump capture.
Added a new Kconfig option to the Zephyr port,
CONFIG_MEMFAULT_METRICS_EXTRA_DEFS_FILE=y
, which causes
memfault_metrics_heartbeat_extra.def
to be included in the metric
definitions. This can be utilized by a third party consumer of Zephyr to more
easily extend the default heartbeat metrics collected when using memfault.
If you are using nRF Connect SDK / Zephyr port, the SDK will now automatically be picked up as a Zephyr Module! You will need to make two changes:
ZEPHYR_EXTRA_MODULES
addition from your projectsCMakeLists.txt, i.e
Plaintext
```diff
--- a/your_application/CMakeLists.txt
+++ b/your_application/CMakeLists.txt
@@ -3,7 +3,6 @@
- list(APPEND ZEPHYR_EXTRA_MODULES $ENV{ZEPHYR_BASE}/../modules/memfault-firmware-sdk/ports/nrf-connect-sdk)
```
CONFIG_MEMFAULT_NRF_CONNECT_SDK=y
to your projects prj.conf
MEMFAULT_COREDUMP_USE_OTA_SLOT=y
which can be
used to save a coredump in an unused OTA slot rather than the default
coredump partition. This can be useful in situations where Memfault is being
integrated after a product has shipped and updating the partition table is
no longer possible.MEMFAULT_EVENT_STORAGE_NV_SUPPORT_ENABLED=0
which can be used to
disable dynamic configuration of non-volatile storage. Setting this flag when
the non-volatile event storage API is not in use will save several hundred
bytes of codespace.memfault_log_save_preformatted()
leading to invalid logs being
reported when attempting to save log lines > 128 bytes. (thanks @alvarop for
the report!)MEMFAULT_DEMO_SHELL_RX_BUFFER_SIZE
can be used to shrink the maximum
amount of bytes that can be buffered on a single line.memfault_demo_shell_commands.h
public and moved it to
memfault/demo/shell_commands.h
to facilitate easier overriding of the default set of commands used in a
build.export
command to demonstrate how data can be dumped via the consoleMEMFAULT_PLATFORM_FAULT_HANDLER_CUSTOM
,
which can be used to explicitly disable the stub
memfault_platform_fault_handler() implementationmemfault_fault_handling_assert()
declaration.memfault_platform_config.h
. Once enabled, the MPU will be
automatically analyzed for configuration errors and results will be presented
in the "MPU" tab in the Memfault UI for a coredump.test_log
& trigger_logs
CLI commands to nRF5 & Zephyr example
applications to exercise new log collection functionality.CONFIG_DOWNLOAD_CLIENT=y
& CONFIG_MEMFAULT_NRF_SHELL=y
NVMS_LOG_PART
) can be overridden
MEMFAULT_PLATFORM_COREDUMP_STORAGE_PARTITION
MEMFAULT_PLATFORM_COREDUMP_STORAGE_MAX_SIZE_BYTES
memfault_log_save
stub to unit tests to facilitate easier testing of
logging dependenciesmsp
& psp
register in
Cortex-M fault handler.memfault_circular_buffer_read_with_callback()
, to
circular buffer api.memfault_event_storage_bytes_used()
&
memfault_event_storage_bytes_free()
, to
event storage module.memfault_platform_halt_if_debugging()
to be called prior to triggering the
full coredump capture.memfault_metrics_heartbeat_debug_trigger()
is calledmemfault_platform_reboot_tracking_boot()
implementation from your
memfault_platform_port.c
file can be removed and the one in the port can be
picked up.memfault_platform_get_device_info()
dependency function.memfault_platform_coredump_get_regions()
implementation when capturing
regions that are not defined at compile time.memfault_coredump_storage_debug_test_*
which would generate
a false positive test failure when the coredump storage area was not divisible
by 16.MEMFAULT_PLATFORM_COREDUMP_STORAGE_USE_FLASH=1
to your
memfault_platform_config.h
ports/panics/src/memfault_platform_ram_backed_coredump.c
:MEMFAULT_PLATFORM_COREDUMP_STORAGE_RAM_SIZE 700
in your
memfault_platform_config.h
platforms
folder to examples to better capture that
the folder contains "example" integrations of the Memfault SDK into hello
world style apps from various SDKsCONFIG_LOG_IMMEDIATE=y
If you were linking any files from the platforms
folder into your project, the
path needs to be updated to examples
:
Diff
- ${MEMFAULT_FIRMWARE_SDK}/platforms/
+ ${MEMFAULT_FIRMWARE_SDK}/examples/
test_coredump_storage_debug
in
some environments where const
arrays were getting dynamically built on the
stack at runtime.memfault_fault_handling_arm.c
for Cortex-M0
targets.Improved documentation in README and components directories.
Added coredump capture support to panics component for the AARCH64 architecture.
Reference platform API implementations for the following MCUs/SDKs:
fw_build_id.py script improvements
--dump <chars>
option to simplify extraction of build id inautomation, i.e:
Plaintext
```bash
python scripts/fw_build_id.py <ELF> --dump 7
3a3e81f
```
memfault_nrf5_coredump.c
in your project:nrf5_coredump_regions.c
(which defines the
regions to collect in a coredump) & nrf5_coredump_storage.c
(which
implements the port for saving coredumps to internal flash). Both of these
files must be added to your build system.__CoreStart
& __MemfaultCoreStorageEnd
to
__MemfaultCoreStorageStart
& __MemfaultCoreStorageEnd
in linker
script.__MfltCoredumpRamStart
& __MfltCoredumpRamEnd
to
__MemfaultCoredumpRamStart
& __MemfaultCoredumpRamEnd
memfault_platform_config.h
You must create the file memfault_platform_config.h
and add it to your
include path. This file can be used in place of compiler defines to tune the
SDK configurations settings.
If you are not using a Memfault build system helper
${MEMFAULT_FIRMWARE_SDK}/components/${COMPONENT}/include
${MEMFAULT_FIRMWARE_SDK}/components/include
to your
build systemIf you were linking any of the nRF5 example app files in your project, the directory has changed:
Diff
- ${MEMFAULT_FIRMWARE_SDK}/nrf5/libraries/memfault/platform_reference_impl/memfault_platform_reboot_tracking.c
+ ${MEMFAULT_FIRMWARE_SDK}/ports/nrf5_sdk/resetreas_reboot_tracking.c
- ${MEMFAULT_FIRMWARE_SDK}/nrf5/libraries/memfault/platform_reference_impl/memfault_platform_coredump.c
+ ${MEMFAULT_FIRMWARE_SDK}/ports/nrf5_sdk/memfault_nrf5_coredump.c
make menuconfig
and be used
to disable the Memfault integration, CONFIG_MEMFAULT=n
.CONFIG_USING_ESP_CONSOLE=n
and CONFIG_MEMFAULT_CLI_ENABLED=n
MEMFAULT_GET_LR()
, MEMFAULT_GET_PC()
,
and MEMFAULT_BREAKPOINT()
to
compiler_gcc.h to
facilitate compilations of the SDK against other architectures.memfault_platform_metrics_timer_boot()
&
memfault_platform_get_time_since_boot_ms()
memfault dependencies to
Zephyr port. A custom implementation can still be provided by
settingMEMFAULT_METRICS_TIMER_CUSTOM=y
CONFIG_MEMFAULT=y
and can
be disabled by setting CONFIG_MEMFAULT_METRICS=n
CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y
optionmemfault_packetizer_abort()
was called after a coredump was partially sent.Added a convenience header for picking up includes for all Memfault components. If you are using the build system helpers, this path will be picked up automatically.
C
#include "memfault/components.h"
// call to any Memfault API in the components folder
Fixed a 🐛 leading to Root CAs not get loaded correctly when using the nRF
Connect SDK port and the MEMFAULT_ROOT_CERT_STORAGE_TLS_CREDENTIAL_STORAGE=y
Kconfig option.
Applied suggestions from @rerickson1 for the Zephyr and nRF Connect SDK ports:
CONFIG_MEMFAULT_METRICS=y
can now be used to compile the metrics component into the Zephyr and nRF
Connect SDK ports.CONFIG_MEMFAULT=y
must now be specified to enable the Memfault integration.memfault_trace_reason_user_config.def
or
memfault_metrics_heartbeat_config.def
file, respectively, and add it to your
include path.CONFIG_MEMFAULT=y
to your prj.conf
kMfltRebootReason_PinReset
for explicitly tracking external pin resets.kMfltRebootReason_SoftwareWatchdog
& kMfltRebootReason_HardwareWatchdog
for easier disambiguation between watchdog resets where a coredump was
captured versus ones where no software handler ran and hardware reset the
device.kMfltRebootReason_ClockFailure
for explicit tracking of resets due to loss
of a clock signal or PLL lock.kMfltRebootReason_Lockup
for explicit tracking of faults from within the
Hardfault or NMI exceptions on ARM Cortex-M MCUs.panics
component to support
ESP8266 (Tensilica Xtensa LX106) MCU architecture.nRF Connect Updates:
memfault_esp_port_ota_update()
. More details can be found in
ports/esp_idf/memfault/include/memfault/esp_port/http_client.hMEMFAULT_CLI_ENABLED=n
Kconfig option.MemfaultWatchdog_Handler
. The handler will save a coredump so the full
system state can be recovered when a watchdog takes place. More details can be
found in
ports/include/memfault/ports/watchdog.h.A log can now be captured alongside a trace event by using a new API: MEMFAULT_TRACE_EVENT_WITH_LOG(reason, ...). This can be useful to capture arbitrary diagnostic data with an error event or to capture critical error logs that you would like to be alerted on when they happen. For example:
C
// @file memfault_trace_reason_user_config.def
MEMFAULT_TRACE_REASON_DEFINE(Critical_Log)
C
// @file your_platform_log_implementation.h
#include "memfault/core/trace_event.h"
#define YOUR_PLATFORM_LOG_CRITICAL(fmt, ....) \
MEMFAULT_TRACE_EVENT_WITH_LOG(Critical_Log, fmt, __VA_ARGS__)
C
// @file your_platform_temperature_driver.c
void record_temperature(void) {
// ...
// erase flash to free up space
int rv = spi_flash_erase(...);
if (rv != 0) {
YOUR_PLATFORM_LOG_CRITICAL("Flash Erase Failure: rv=%d, spi_err=0x%x", spi_bus_get_status());
}
}
The error tracing facilities are now initialized automatically for the esp-idf
Fixed a 🐛 where an erroneous size was reported from
memfault_coredump_storage_check_size()
if
MEMFAULT_COREDUMP_COLLECT_LOG_REGIONS=1
and memfault_log_boot()
had not yet
been called
metrics
component is now included by default in the ESP32
portMEMFAULT_LOG_DEBUG
messages now print by defaultheartbeat_dump
CLI command for easy viewing of current heartbeat
metricsmemfault_platform_log
dependency). See
components/include/memfault/core/debug_log.h
for more details.memfault_metrics_boot()
can now be removedmemfault_platform_metrics_timer_boot()
&
memfault_platform_get_time_since_boot_ms()
can be removed as they are now
provided as part of the port.configSUPPORT_STATIC_ALLOCATION=1
configuration is used.kMfltRebootReason_SoftwareReset
& kMfltRebootReason_DeepSleep
.MEMFAULT_TRACE_REASON_USER_DEFS_FILE
as part of the compiler flags.MEMFAULT_EVENT_STORAGE_READ_BATCHING_ENABLED
compiler flag. More details can
be found in
memfault_event_storage.cmemfault_build_id_get_string
, for populating a buffer
with a portion of the
Memfault Build ID as a
string.MEMFAULT_ASSERT
s. Instead of
pending an NMI exception, the assert path will now "trap" into the fault
handler by executing a udf
instruction. This unifies the fault handling
paths within the SDK and leaves the NMI Handler free for other uses within the
user's environment.kMfltRebootReason_PowerOnReset
, kMfltRebootReason_BrownOutReset
, &
kMfltRebootReason_Nmi
.MEMFAULT_COREDUMP_COLLECT_LOG_REGIONS=1
, the logging region will
automatically be collected as part of a coredump. Step-by-step details can
also be found in the logging integration guide.MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE()
which can be used for
defining the minimum and maximum expected range for a heartbeat metric. This
information is used by the Memfault cloud to better normalize the data when it
is presented in the UI.panics
component, you will need to manually add the following file to
your build system:
$(MEMFAULT_SDK_ROOT)/components/panics/src/memfault_coredump_sdk_regions.c
memfault_data_export_chunk()
to guarantee the
GDB chunk test utility can always be
used to post chunks using the data export API.$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_data_export.c
$(MEMFAULT_SDK_ROOT)/components/util/src/memfault_base64.c
-Wunused-parameter
, GNU GCC's
-Wformat-signedness
, and Clang's -Wno-missing-prototypes
&
-Wno-missing-variable-declarations
.mflt get_latest_release
, to the Zephyr demo application
(tested on the STM32L4) to demonstrate querying the Memfault cloud for new
firmware updates.demo
component to make it easier to integrate an individual CLI
commands into a project since some of the commands can be helpful for
validating integrations. More details can be found in the README at
components/demo/README.md.If you are using the "demo" component and are not making use our CMake or Make build system helpers, you will need to make the following changes:
$(MEMFAULT_SDK_ROOT)/components/demo/src/{memfault_demo_cli.c => panics/memfault_demo_panics.c}
$(MEMFAULT_SDK_ROOT)/components/demo/src/{ => panics}/memfault_demo_cli_aux.c
$(MEMFAULT_SDK_ROOT)/components/demo/src/memfault_demo_core.c
$(MEMFAULT_SDK_ROOT)/components/demo/src/http/memfault_demo_http.c
If you are using the http
component, the following macro names changed:
Diff
-#define MEMFAULT_HTTP_GET_API_PORT()
-#define MEMFAULT_HTTP_GET_API_HOST()
+#define MEMFAULT_HTTP_GET_CHUNKS_API_PORT()
+#define MEMFAULT_HTTP_GET_CHUNKS_API_HOST()
reboot_tracking.h
to core
component since it has no dependencies on
anything from the panics
component. This allows the reboot tracking to be
more easily integrated in a standalone fashion.memfault_fault_handling_assert()
. This improves
the recovery of local variables of frames in the backtrace when certain
optimization levels are used.memfault_sdk_assert.c
to address a GCC warning
(-Wpointer-to-int-cast
) emitted when compiling the file for 64 bit
architectures.If you are already using reboot tracking in your system, you will need to update the following includes in your code:
Diff
-#include "memfault/panics/reboot_tracking.h"
-#include "memfault/panics/reboot_reason_types.h"
+#include "memfault/core/reboot_tracking.h"
+#include "memfault/panics/reboot_reason_types.h"
If you are not using our CMake or Make build system helpers, you will need to update the path for the following files:
$(MEMFAULT_SDK_ROOT)/components/{panics => core}/src/memfault_ram_reboot_info_tracking.c
$(MEMFAULT_SDK_ROOT)/components/{panics => core}/src/memfault_reboot_tracking_serializer.c
eMfltResetReason
was renamed to eMemfaultRebootReason
.
memfault_build_info_dump()
can be called on boot to display the build that
is running. This can be a useful way to sanity check that your debugger
successfully flashed a new image.memfault_build_info_read()
can be used to read the build id for your own
use cases. For example you could append a portion of it to a debug version
to make it unique.$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_build_id.c
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_core_utils.c
memfault install_chunk_handler
to
work with older versions of the GNU Arm Toolchain.$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_sdk_assert.c
to
your project.trace_event.h
to core
component since it has no dependencies on
anything from the panics
component. This allows the trace event feature to
be more easily integrated in a standalone fashion.If you are already using MEMFAULT_TRACE_EVENT()
in your project, you will
need to update the include as follows:
Diff
-#include "memfault/panics/trace_event.h"
+#include "memfault/core/trace_event.h"
If you are not using our CMake or Make
build system helpers, you will need
to update the source path for components/panics/src/memfault_trace_event.c
to components/core/src/memfault_trace_event.c
captured_date
for an event can now be set by implementing
memfault_platform_time_get_current().
If the API is not implemented, the captured_date
will continue to be set
based on the time the event was received by the memfault cloud.reboot
CLI command to easily exercise it.reset_reason
can now optionally be provided as part of
sResetBootupInfo.
This can be useful for scenarios where the reboot reason is known on bootup
but could not be set prior to the device crashing.memfault_reboot_tracking_boot()
is called even if no information about the
reboot has been provided. In this scenario, the reset reason will be
kMfltRebootReason_UnknownCONFIG_INIT_STACKS=y
) and determine if
stacks has overflowed (CONFIG_MPU_STACK_GUARD=y
).device_serial
is no longer encoded by default as part of events. Instead,
the device_serial
in an event is populated from the the unique device
identifier used when posting the data to the
chunks REST endpoint. This leads to ~20%
reduction in the size of a typical event. Encoding device_serial
as part of
the event itself can still be enabled by adding
-DMEMFAULT_EVENT_INCLUDE_DEVICE_SERIAL=1
as a compilation flag but should not be necessary for a typical integration.sCoredumpCrashInfo
when
memfault_platform_coredump_get_regions
is invoked. This can (optionally) be used to configure regions collected based
on the state or run platform specific cleanup based on the state.memfault_serializer_helper_encode_metadata()
to encode common event data.test_memfault_root_cert.cpp
and moved the base64
implementation
within the unit test to the util
component so it is easier to share the code
elsewhere in the future.const
to a few circular_buffer.h API signatures.memfault_metrics_boot()
changed as part of this
update. If you are already using the metrics
component, you will need to
update the call accordingly. See the notes in
metrics.h for more details.$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_log.c
to your
project. (Note that until
memfault_log_boot()
is called, all calls made to the logging module will be a no-op).memfault_platform_coredump_storage_clear()
NRF52 reference
implementation for situations where the SoftDevice is enabled and there is a
lot of Bluetooth activity. (In this scenario, NRF52 flash operations may need
retries or take a while to complete).MemfaultWatchdog_Handler
can now be
registered as the Exception Handler to automatically collect a coredump.__has_include
macro for IAR compiler since not all versions
fully support it.MEMFAULT_TRACE_EVENT()
from interrupts. Note: If you
are not using our CMake or Make
build system helpers, this change
requires that you add
$(MEMFAULT_SDK_ROOT)/components/core/src/arch_arm_cortex_m.c
to your
project.memfault_demo_shell
instead mbed-client-cli
,
since mbed-client-cli
is not part of the main Mbed OS 5 distribution.__task
from IAR Cortex-M function handler declarations since it's not
explicitly required and can lead to a compiler issue if the function prototype
does not also use it.https://mflt.io/iar-tutorial. As part of the change MEMFAULT_GET_LR()
now
takes an argument which is the location to store the LR to
(void *lr = MEMFAULT_GET_LR()
-> void *lr;
MEMFAULT_GET_LR(lr)
)
memfault_coredump_read
while the system is running.memfault_packetizer_get_chunk()
, to
data_packetizer module.MemoryWordAccessOnly
which can be used to
force the region to be read 32 bits at a time. This can be useful for
accessing certain peripheral register ranges which are not byte addressable.-DMEMFAULT_COLLECT_INTERRUPT_STATE=0
to your compiler flags. More
configuration options can be found in
memfault_coredump_regions_armv7.c.psp
and msp
registers when the system crashes. This allows for the running
thread backtrace to be more reliably recovered when a crash occurs from an
ISR.MEMFAULT_EXC_HANDLER_...
preprocessor defines to enable
custom naming of exception handlers in the panics component.print_core
to print_chunk
in demo applications to better align
with the Memfault nomenclature for
data transfer.Updated memfault_platform_coredump_get_regions()
to take an additional
argument, crash_info
which conveys information about the crash taking place
(trace reason & stack pointer at time of crash). This allows platform ports to
dynamically change the regions collected based on the crash if so desired.
This will require an update that looks like the following to your port:
Diff
-const sMfltCoredumpRegion *memfault_platform_coredump_get_regions(size_t *num_regions) {
+const sMfltCoredumpRegion *memfault_platform_coredump_get_regions(
+ const sCoredumpCrashInfo *crash_info, size_t *num_regions) {
Added a new API, memfault_coredump_storage_compute_size_required()
which can
be called on boot to sanity check that platform coredump storage is large
enough to hold a coredump. For example:
C
sMfltCoredumpStorageInfo storage_info = { 0 };
memfault_platform_coredump_storage_get_info(&storage_info);
const size_t size_needed = memfault_coredump_storage_compute_size_required();
if (size_needed > storage_info.size) {
MEMFAULT_LOG_ERROR("Coredump storage too small. Got %d B, need %d B",
storage_info.size, size_needed);
}
MEMFAULT_ASSERT(size_needed <= storage_info.size);
Added a convenience RAM backed reference port for coredump platform APIs. This can be used for persisting a coredump in RAM across a reset.
memfault/core/reboot_tracking.h
for more details andhttps://mflt.io/2QlOlgH for a step-by-step setup tutorial.
makefiles/MemfaultWorker.mk
). A user of the SDK can
include this makefile when using a make as their build system to easily
collect the sources and include paths needed to build Memfault SDK componentsmemfault_packetizer_get_next()
API in data_packetizer.h
. More
details herememfault_coredump_read()
so platform ports can
easily add locking on reads to coredump storage if necessary for transmission.examples/stm32/stm32h743i/README.md
for more details.memfault_fault_handling_arm.c
when using old versions of GCCmemfault_platform_get_device_info()
memfault/core/errors.h
examples/nrf5/README.md
for more details.First Public Release of Memfault Firmware SDK 0.0.2 - June 26, 2019
README.md
in root for summarycomponents/panics/README.md
for more detailsexamples/wiced/README.md
idf.py add-dependency "memfault/memfault-firmware-sdk^1.21.0"