- Zephyr / nRF Connect SDK port:
- Made periodic upload a named choice,
MEMFAULT_HTTP_PERIODIC_UPLOAD_CONTEXT
, so the default can be overriden from other Kconfig files. - Added prompt text for
MEMFAULT_HTTP_DEDICATED_WORKQUEUE_STACK_SIZE
- Made periodic upload a named choice,
- Zephyr / nRF Connect SDK port:
CONFIG_MEMFAULT_NRF_CONNECT_SDK
is now only enabled by default whenCONFIG_MEMFAULT=y
CONFIG_DEBUG_THREAD_INFO=y
is now selected by default (in prep for deprecation ofCONFIG_OPENOCD_SUPPORT
)- Added new option (
CONFIG_MEMFAULT_USER_CONFIG_ENABLE=y
) which can be used to remove requirement of providing any user specific configuration. - Added two choices for periodic posting of memfault data:
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.
- The Zephyr & nRF Connect SDK ports will now only enable the
MEMFAULT_SHELL
by default when the Zephyr shell is enabled.CONFIG_SHELL=y
must now be enabled explicitly in yourprj.conf
for the Memfault Shell to be enabled.
- Updated
sMemfaultBuildIdStorage
structure to track the build id length used for event serialization and updatedfw_build_id.py
script to extract information.
- Zephyr / nRF Connect SDK port:
- Replaced
MEMFAULT_DEFAULT_REBOOT_REASON_IMPL
Kconfig option withMEMFAULT_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.
- Replaced
- Updated memfault_fault_handling_arm.c to work around a compiler bug when using 6.x of the GNU ARM Toolchain
- Port Improvements:
- SAML10/SAML11
- Updated esp-idf port to streamline integrations making use of the amazon-freertos
- Zephyr
- Added several Kconfig options for better control over information
collected in a coredump:
CONFIG_MEMFAULT_COREDUMP_COLLECT_DATA_REGIONS
to enable/disable collection of.data
regionCONFIG_MEMFAULT_COREDUMP_COLLECT_BSS_REGIONS
to enable/disable collection of.bss
regionCONFIG_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 several Kconfig options for better control over information
collected in a coredump:
- Reduced instruction cycles required to update a heartbeat metric
- Events will now store an abbreviated build id when serialized
-
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 usememmov
instead ofmemcpy
sincedst
andsrc
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 causesmemfault_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.
- Updated
memfault_gdb.py
helper script to use latest Memfault API for uploading symbol files.
- 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:
- Remove the
ZEPHYR_EXTRA_MODULES
addition from your projects CMakeLists.txt, i.e
--- 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)
- Add
CONFIG_MEMFAULT_NRF_CONNECT_SDK=y
to your projectsprj.conf
- Remove the
- Support for Dialog DA145xx chip family (Huge thanks to @iandmorris for the
help here!)
- GCC & Keil based demo application for the DA14531 & DA14585/DA14586 can be found here.
- Ports for applications using the DA145xx SDK can be found here.
- ESP32 port improvements
- Added example of periodically posting data to memfault via a background task.
- Added a new Kconfig option,
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.
- Added
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. - Hardened memfault_http_parse_response() utility to parse HTTP responses with headers that exceed a length of 128 bytes
- Fixed a 🐛 in
memfault_log_save_preformatted()
leading to invalid logs being reported when attempting to save log lines > 128 bytes. (thanks @alvarop for the report!) - Added a convenience API,
memfault_create_unique_version_string()
, which can be used for easily appending a build id on the software version reported.
- Updates to demo cli:
MEMFAULT_DEMO_SHELL_RX_BUFFER_SIZE
can be used to shrink the maximum amount of bytes that can be buffered on a single line.- Made
memfault_demo_shell_commands.h
public and moved it tomemfault/demo/shell_commands.h
to facilitate easier overriding of the default set of commands used in a build.
- ESP32 Example App Updates:
- Added
export
command to demonstrate how data can be dumped via the console - Added Memfault Build ID to example app as a reference
- Added
- Fixed a 🐛 in
memfault_platform_sanitize_address_range()
template example. - Refactored nRF5 example app to mirror integration steps listed in the latest integration guide
- Added a new configuration option,
MEMFAULT_PLATFORM_FAULT_HANDLER_CUSTOM
, which can be used to explicitly disable the stubmemfault_platform_fault_handler()
implementation - Improve the quality of backtrace recovery for asserts when using Arm Compiler
5 by removing use of noreturn function attribute for
memfault_fault_handling_assert()
declaration.
- Added support for collecting ARMv7-M MPU regions as part of coredump
collection. To enable, set
MEMFAULT_COLLECT_MPU_STATE=1
in yourmemfault_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. - Added a new API,
memfault_log_trigger_collection
, which can be used to "freeze" the current contents of the log buffer when unexpected behavior takes place on the device for upload to Memfault. The logs can then be uploaded to Memfault just like any other data and appear in the UI for a device. For more details about the Memfault log subsystem see https://mflt.io/logging
- Fixed compilation error when compiling the panics component against Cortex-M0+ with ARM Compiler 5
- Added several default heartbeat metrics to the Zephyr port around timer task stack usage and execution time.
- Refreshed esp32 example app README and updated instructions for the v3.3.5 esp-idf
- Added
test_log
&trigger_logs
CLI commands to nRF5 & Zephyr example applications to exercise new log collection functionality.
- Fixed a 🐛 in Zephyr port leading to a compilation error with nRF Connect
SDK when
CONFIG_DOWNLOAD_CLIENT=y
&CONFIG_MEMFAULT_NRF_SHELL=y
- Dialog DA1468x
QSPI coredump storage port
updates:
- default storage parition (
NVMS_LOG_PART
) can be overriddenMEMFAULT_PLATFORM_COREDUMP_STORAGE_PARTITION
- Max space used within partition can be limited using
MEMFAULT_PLATFORM_COREDUMP_STORAGE_MAX_SIZE_BYTES
- default storage parition (
- Updated zephyr example application and docs to be compatible with v2.5 release.
- Added
memfault_log_save
stub to unit tests to facilitate easier testing of logging dependencies - Improved correctness of strategy used to capture
msp
&psp
register in Cortex-M fault handler. - Added new convenience utility,
memfault_circular_buffer_read_with_callback()
, to circular buffer api.
- Added new convenience APIs,
memfault_event_storage_bytes_used()
&memfault_event_storage_bytes_free()
, to event storage module. - Added a new configuration option,
MEMFAULT_ASSERT_HALT_IF_DEBUGGING_ENABLED
. By default, it is off, but when enabled will causememfault_platform_halt_if_debugging()
to be called prior to triggering the full coredump capture. - Fixed a type conversion compiler warning emitted by IAR and ARMCC in
resetreas_reboot_tracking.c
. - Port Updates:
- Removed "Heartbeat triggered!" print when
memfault_metrics_heartbeat_debug_trigger()
is called
- If you were using
ports/dialog/da1468x/reset_stat_reboot_tracking.c
, thememfault_platform_reboot_tracking_boot()
implementation from yourmemfault_platform_port.c
file can be removed and the one in the port can be picked up.
- Added a new convenience API,
memfault_device_info_dump()
which can be used to pretty print the device information populated in thememfault_platform_get_device_info()
dependency function. - Added
memfault_platform_sanitize_address_range()
. This functrions is intended for use in yourmemfault_platform_coredump_get_regions()
implementation when capturing regions that are not defined at compile time. - Fixed a 🐛 with
memfault_coredump_storage_debug_test_*
which would generate a false positive test failure when the coredump storage area was not divisible by 16. - C++ header guards are now included in all headers in the ports/ directory for easier integration in mixed C/C++ environments
- Port Updates:
- Dialog DA1468x: Added patch which can be used to add GNU Build ID
- Added support for FreeRTOS 8 to the FreeRTOS port.
- STM32H7 family / STM32CubeH7:
- STM32WBxx family / STM32CubeWB:
- Improved configurability of RAM backed coredump storage port with new configuration options for to control where RAM is allocated, what memory regions are collected, and stack size to collect.
- Added additional comments to
ports/templates
directory to facilitate porting.
- Demo CLI Shell commands are now defined as weak symbols so they can be overriden with a custom set.
- If you were using the
ports/emlib/msc_coredump_storage.c
port in your system, you must addMEMFAULT_PLATFORM_COREDUMP_STORAGE_USE_FLASH=1
to yourmemfault_platform_config.h
- If you were using
ports/panics/src/memfault_platform_ram_backed_coredump.c
:memfault_platform_sanitize_address_range()
must be implemented.- The default coredump storage RAM size was changed from 700 to 1024 bytes so
more information can be captured. The original size can be restored by
setting
MEMFAULT_PLATFORM_COREDUMP_STORAGE_RAM_SIZE 700
in yourmemfault_platform_config.h
- Renamed
platforms
folder toexamples
to better capture that the folder contains "example" integrations of the Memfault SDK into hello world style apps from various SDKs - Port Updates:
- Zephyr: added a software watchdog port which can be used for capturing coredumps ahead of a hardware watchdog reset.
- EFR32: rich reboot reason info derived from EMU_RSTCAUSE register
- Updated nRF9160 Demo Application to be compatible with nRF Connect SDK 1.5
- Added support for capturing coredumps with GDB from GNU GCC 4.9 to
memfault_gdb.py
- Added support for automatically capturing logs with Zephyr when logging in
synchronous mode
CONFIG_LOG_IMMEDIATE=y
- Unified nomenclature for references to the "Project Key" used to push data to Memfault
If you were linking any files from the platforms
folder into your project, the
path needs to be updated to examples
:
- ${MEMFAULT_FIRMWARE_SDK}/platforms/
+ ${MEMFAULT_FIRMWARE_SDK}/examples/
- Reference platform API implementations for DA1468x:
- Fixed a 🐛 that led to a unit test failure in
test_coredump_storage_debug
in some environments whereconst
arrays were getting dynamically built on the stack at runtime. - Worked around a limitation in GNU GCC 4.9's extended ASM to fix a compiler bug
that would arise when compiling
memfault_fault_handling_arm.c
for Cortex-M0 targets. - Added a new
ports/templates
folder that can be copy/pasted into a project and used as a starting point for a Memfault port!
- 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:
- STM32WBxx family / STM32CubeWB:
- nRF5 SDK
fw_build_id.py
script improvements- script is now compatible with Python2 environments.
- Added new
--dump <chars>
option to simplify extraction of build id in automation, i.e:python scripts/fw_build_id.py <ELF> --dump 7 3a3e81f
- Started work to enable automatic capture of logs in a coredump for the Zephyr & nRF Connect SDK.
- If you were linking
memfault_nrf5_coredump.c
in your project:- the file has been split into
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. - Linker script names for region to save coredump to and regions to collect
need to be updated:
- Update
__CoreStart
&__MemfaultCoreStorageEnd
to__MemfaultCoreStorageStart
&__MemfaultCoreStorageEnd
in linker script. - Update
__MfltCoredumpRamStart
&__MfltCoredumpRamEnd
to__MemfaultCoredumpRamStart
&__MemfaultCoredumpRamEnd
- Update
- the file has been split into
- The SDK now includes a central configuration header at
components/include/memfault/config.h
. Platform overrides can be defined inmemfault_platform_config.h
- Reference platform API implementations for the nRF5 SDK
- All headers for Memfault "components" can now be found under
components/include/memfault/
. This simplifies adding components to build systems as only a single path is now needed!
- 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
- Remove all include paths at
${MEMFAULT_FIRMWARE_SDK}/components/${COMPONENT}/include
- Add include path
${MEMFAULT_FIRMWARE_SDK}/components/include
to your build system
- Remove all include paths at
- If you were linking any of the nRF5 example app files in your project, the directory has changed:
- ${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
- ESP8266 Updates
- Added new Kconfig option which can be set via
make menuconfig
and be used to disable the Memfault integration,CONFIG_MEMFAULT=n
. - Fixed a 🐛 leading to a compilation error when
both
CONFIG_USING_ESP_CONSOLE=n
andCONFIG_MEMFAULT_CLI_ENABLED=n
- Added new Kconfig option which can be set via
- Added default implementations for
MEMFAULT_GET_LR()
,MEMFAULT_GET_PC()
, andMEMFAULT_BREAKPOINT()
tocompiler_gcc.h
to facilitate compilations of the SDK against other architectures.
- Reference platform API implementations for the following MCUs/SDKs:
- nRF Connect SDK
- Added support for nRF Connect SDK v1.3.x
- Added support for FOTA with Memfault. See
memfault_fota_start()
for more details
- Zephyr
- Added implementations for
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
- Metrics support is now enabled by default when
CONFIG_MEMFAULT=y
and can be disabled by settingCONFIG_MEMFAULT_METRICS=n
- Added support for periodically uploading Memfault data in the background.
This is off by default and can be enabled with the
CONFIG_MEMFAULT_HTTP_PERIODIC_UPLOAD=y
option
- Added implementations for
- nRF Connect SDK
- Fixed a 🐛 that could lead to an invalid coredump being sent to Memfault
when
memfault_packetizer_abort()
was called after a coredump was partially sent.
- Added support for nRF Connect SDK v1.2.x and updated the integration guide accordingly.
- Added full support for the ESP8266 (Tensilica Xtensa LX106) MCU architecture! A step-by-step integration guide can be found here and the port to the ESP8266 RTOS SDK can be found here.
- 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.
#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.
- Refactored the nRF Connect SDK port to build directly on top of the zephyr port reducing code duplication and facilitate the rollout of additional features to both SDKs at the same time moving forward.
- If you are using a Memfault
build system helper and not using
the trace or metrics functionality, you will now need to create a
memfault_trace_reason_user_config.def
ormemfault_metrics_heartbeat_config.def
file, respectively, and add it to your include path. - When using the Zephyr port, the memfault integration must be enabled
explicitly by adding
CONFIG_MEMFAULT=y
to yourprj.conf
- Reference platform API implementations for the following MCUs/SDKs:
- STM32F4 family / STM32CubeF4:
- STM32L4 family / STM32CubeL4
- nRF Connect SDK
- rich reboot reason info derived from PMU RESETREAS register
- refactored HTTP port to support multiple backing storage strategies for
root certificates. See
MEMFAULT_ROOT_CERT_STORAGE_*
Kconfig options for more details - Added support for Memfault OTA downloads. See memfault_nrfconnect_port_ota_update() for more details
- Updated
memfault_freertos_ram_regions.c
port to collect all TCBs and then stacks. This way, the state of all tasks can be recovered even if the coredump storage regin is filled while writing all the task stacks. - Reference platform API implementations for the following MCUs/SDKs:
- STM32F4 family / STM32CubeF4
- STM32L4 family / STM32CubeL4
- NXP's S32K1xx family / S32K1 SDL
- Silicon Lab's EFM/EFR family / v3.0 Gecko SDK
- Added several more
reboot reason options:
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.
- Added a utility which can be used to verify a platform coredump storage implementation is working as corrected. For more details about how to use, see memfault_coredump_storage_debug.c.
- Added infrastructure to coredump collection in
panics
component to support ESP8266 (Tensilica Xtensa LX106) MCU architecture.
-
nRF Connect Updates:
- Updated port to support nRF Connect SDK v1.4.0
- Added port of HTTP client to post data to Memfault
- Added support for capturing state of all Zephyr tasks during a crash. This way the state of all threads can be seen in the Memfault UI when a crash is uploaded.
- Updated memfault_demo_app to use the nRF9160-DK
- Added notes to the step-by-step integration guide for the nRF9160.
- Added Memfault OTA support to esp-idf port. Updates can now be performed by
calling
memfault_esp_port_ota_update()
. More details can be found inports/esp_idf/memfault/include/memfault/esp_port/http_client.h
- The esp-idf port debug CLI can now easily be disabled by using the
MEMFAULT_CLI_ENABLED=n
Kconfig option. - Added FreeRTOS utility to facilitate collecting minimal set of RAM in a
coredump necessary to recover backtraces for all tasks. More details can be
found in
ports/freertos/include/memfault/ports/freertos_coredump.h
- Previously, if the Memfault event storage buffer was out of space, a "storage out of space" error would be printed every time. Now, an error message is printed when the issue first happend and an info message is printed when space is free again.
- Added a reference software watchdog port for the STM32H7 series LPTIM
peripheral. Users of the STM32 HAL can now compile in the reference port and
the
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 inports/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:
// @file memfault_trace_reason_user_config.def
MEMFAULT_TRACE_REASON_DEFINE(Critical_Log)
// @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__)
// @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()
ifMEMFAULT_COREDUMP_COLLECT_LOG_REGIONS=1
andmemfault_log_boot()
had not yet been called
- ESP32 port improvements:
- The Memfault
metrics
component is now included by default in the ESP32 port MEMFAULT_LOG_DEBUG
messages now print by default- Added a
heartbeat_dump
CLI command for easy viewing of current heartbeat metrics - Custom handling of collecting Memfault data can now easily be implemented in
the ESP32 port using the new
memfault_esp_port_data_available()
&memfault_esp_port_get_chunk()
APIS. This can be useful in scenarios where there are external MCUs forwarding Memfault chunks to the ESP32.
- The Memfault
- The platform port for the memfault log dependency can now be implemented by
macros (rather than the
memfault_platform_log
dependency). Seecomponents/include/memfault/core/debug_log.h
for more details.
- If you were using the ESP32 port:
- Call to
memfault_metrics_boot()
can now be removed - Custom implementations for
memfault_platform_metrics_timer_boot()
&memfault_platform_get_time_since_boot_ms()
can be removed as they are now provided as part of the port.
- Call to
- Coredumps will now be truncated (instead of failing to save completely) when
the memory regions requested take up more space than the platform storage
allocated for saving. A warning will also be displayed in the Memfault UI when
this happens. Regions are always read in the order returned from
memfault_platform_coredump_get_regions()
so it is recommended to order this list from the most to least important regions to capture. - Updated FreeRTOS port to use static allocation APIs by default when the
configSUPPORT_STATIC_ALLOCATION=1
configuration is used.
- Added several more
reboot reason options:
kMfltRebootReason_SoftwareReset
&kMfltRebootReason_DeepSleep
. - Extended ESP32 port to include integrations for reboot reason tracking and log collection.
- Apply missing check to unit test reported on Github
- Added a new convenience API,
memfault_coredump_storage_check_size()
, to check that coredump storage is appropriately sized. - Fixed a 🐛 with heartbeat timers that would lead to an incorrect duration being reported if the timer was started and stopped within the same millisecond.
- Fixed an issue when using TI's compiler that could lead to the incorrect register state being captured during a fault.
- If you were not using the
error tracing functionality, you will need to
create the configuration file "memfault_trace_reason_user_config.def" and add
it to your include path. This removes the requirement to manually define
MEMFAULT_TRACE_REASON_USER_DEFS_FILE
as part of the compiler flags.
- Add support for sending multiple events in a single chunk. This can be useful
for optimizing throughput or packing more data into a single transmission
unit. The behavior is disabled by default but can be enabled with the
MEMFAULT_EVENT_STORAGE_READ_BATCHING_ENABLED
compiler flag. More details can be found in memfault_event_storage.c - Added convenience API,
memfault_build_id_get_string
, for populating a buffer with a portion of the Memfault Build ID as a string. - Added default implementations of several Memfault SDK dependency functions when using FreeRTOS to ports/freertos.
- A status or error code (i.e bluetooth disconnect reason, errno value, etc) can
now be logged alongside a trace event by using a new API:
MEMFAULT_TRACE_EVENT_WITH_STATUS(reason, status_code)
.
- Added support for TI's ARM-CGT Compiler
- Removed dependency on NMI Exception Handler for
MEMFAULT_ASSERT
s. Instead of pending an NMI exception, the assert path will now "trap" into the fault handler by executing audf
instruction. This unifies the fault handling paths within the SDK and leaves the NMI Handler free for other uses within the user's environment. - Added several more
reboot reason options:
kMfltRebootReason_PowerOnReset
,kMfltRebootReason_BrownOutReset
, &kMfltRebootReason_Nmi
.
- Added utility to facilitate collection of the memory regions used by the
logging module as part of a
coredump. With this change, when the SDK is compiled with
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. - Added
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.
- If you are not using our CMake or Make
build system helpers and are using
the
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
- Added a port for projects using the nRF Connect SDK along with a step-by-step integration guide.
- Disabled optimizations for
memfault_data_export_chunk()
to guarantee the GDB chunk test utility can always be used to post chunks using the data export API.
- Added memfault/core/data_export.h API to facilitate production and evaluation use cases where Memfault data is extracted over a log interface (i.e shell, uart console, log file, etc). See the header linked above or the integration guide for more details.
- Fixed a 🐛 that would cause the demo shell to get stuck if backspace chracters were entered while no other characters had been entered.
- Updated the GDB chunk test utility to automatically detect when the data export API is integrated and post-chunks to the cloud directly from GDB when the function is invoked.
- If you are not using our CMake or Make
build system helpers and want to make
use of the new data export API, you will need to manually add the following
files to your build system:
- Add:
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_data_export.c
- Add:
$(MEMFAULT_SDK_ROOT)/components/util/src/memfault_base64.c
- Add:
- Updated code to support compilations with
-Wunused-paramater
, GNU GCC's-Wformat-signedness
, and Clang's-Wno-missing-prototypes
&-Wno-missing-variable-declarations
. - Updated unit test setup to compile with newly supported warnings treated as errors
- Misc utility additions including support for encoding floats and int64_t's in the cbor utility
- Add additional utilities to the http component to facilitate easier release management integration in environments with no pre-existing http stack.
- Add new cli command,
mflt get_latest_release
, to the Zephyr demo application (tested on the STM32L4) to demonstrate querying the Memfault cloud for new firmware updates.
- Refactored
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:
- Update:
$(MEMFAULT_SDK_ROOT)/components/demo/src/{memfault_demo_cli.c => panics/memfault_demo_panics.c}
- Update:
$(MEMFAULT_SDK_ROOT)/components/demo/src/{ => panics}/memfault_demo_cli_aux.c
- Add:
$(MEMFAULT_SDK_ROOT)/components/demo/src/memfault_demo_core.c
- Add:
$(MEMFAULT_SDK_ROOT)/components/demo/src/http/memfault_demo_http.c
- Update:
- If you are using the
http
component, the following macro names changed:
-#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()
- Moved
reboot_tracking.h
tocore
component since it has no dependencies on anything from thepanics
component. This allows the reboot tracking to be more easily integrated in a standalone fashion. - Published a new guide detailing how to manage firmware updates using Memfault.
- Disabled optimizations for
memfault_fault_handling_assert()
. This improves the recovery of local variables of frames in the backtrace when certain optimization levels are used. - Updated
memfault_sdk_assert.c
to address a GCC warning (-Wpointer-to-int-cast
) emitted when compiling the file for 64 bit architectures. - Misc README improvements.
- If you are already using reboot tracking in your system, you will need to update the following includes in your code:
-#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 toeMemfaultRebootReason
.
- Added native SDK support for tracking and generating a unique firmware build
id with any compiler! Quick integration steps can be found in
memfault/core/build_info.h.
It is very common, especially during development, to not change the firmware
version between editing and compiling the code. This will lead to issues when
recovering backtraces or symbol information because the debug information in
the symbol file may be out of sync with the actual binary. Tracking a build id
enables the Memfault cloud to identify and surface when this happens! You can
also make use of two new APIs:
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 succesfully 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.
- The CMake build system helper is now compatible with any 3.x version of CMake (previously required 3.6 or newer).
- The unique firmware build id is stored automatically as part of coredump collection.
- If you are not using our CMake or Make
build system helpers, you will need
to add the following files to your build:
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_build_id.c
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_core_utils.c
- We also encourage you to add a unique build id to your build (several line code change).
- Added support for (optionally) storing events collected by the SDK to non-volatile storage mediums. This can be useful for devices which experience prolonged periods of no connectivity. To leverage the feature, an end user must implement the nonvolatile_event_storage platform API.
- Added an assert used internally by the SDK which makes it easier to debug API
misuse during bringup. The assert is enabled by default but can easily be
disabled or overriden. For more details see
memfault/core/sdk_assert.h
. - Added a default implementation of
memfault_platform_halt_if_debugging()
for Cortex-M targets. The function is defined as weak so a user can still define the function to override the default behavior.
- Updated
memfault install_chunk_handler
to work with older versions of the GNU Arm Toolchain.
- If you are not using our CMake or Make
build system helpers, you will need
to add
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_sdk_assert.c
to your project.
- Moved
trace_event.h
tocore
component since it has no dependencies on anything from thepanics
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:
-#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
tocomponents/core/src/memfault_trace_event.c
- Added a new GDB command which can be used to post packetized Memfault data directly from GDB to the Memfault cloud. This can be helpful as a way to quickly test data collection functionality while working on an integration of the SDK.
- The
captured_date
for an event can now be set by implementingmemfault_platform_time_get_current()
. If the API is not implemented, thecaptured_date
will continue to be set based on the time the event was received by the memfault cloud.
- Added a reference implementation of
reboot reason tracking to the
NRF52 demo app
and a new
reboot
CLI command to easily exercise it. - A
reset_reason
can now optionally be provided as part ofsResetBootupInfo
. This can be useful for scenarios where the reboot reason is known on bootup but could not be set prior to the device crashing. - A reboot reason event will now always be generated when
memfault_reboot_tracking_boot()
is called even if no information about the reboot has been provided. In this scenario, the reset reason will bekMfltRebootReason_Unknown
- Updated a few Kconfig options in the Zephyr demo app to improve the ability to
compute stack high water marks (
CONFIG_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, thedevice_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. Encodingdevice_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.
- Added
memfault_log_read()
API to make it possible to use the module to cache logs in RAM and then flush them out to slower mediums, such as a UART console or Flash, from a background task.
- A pointer to the stack frame upon exception entry is now included in
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. - Added Root Certificates needed for release downloads to
MEMFAULT_ROOT_CERTS_PEM
.
- All sources that generate events now use the same utility function,
memfault_serializer_helper_encode_metadata()
to encode common event data.
- Introduced a lightweight logging module. When used, the logs leading up to a crash will now be decoded and displayed from the Memfault Issue Details Web UI. For instructions about how to use the module in your project, check out log.h.
- The metrics component will now automatically collect the elapsed time and the number of unexpected reboots during a heartbeat interval. The Memfault cloud now uses this information to automatically compute and display the overall uptime of your fleet.
- Added a new document walking through the design of Memfault event serialization.
- Cleaned up
test_memfault_root_cert.cpp
and moved thebase64
implementation within the unit test to theutil
component so it is easier to share the code elsewhere in the future. - Added
const
to a few circular_buffer.h API signatures. - Misc code comment improvements.
- The function signature for
memfault_metrics_boot()
changed as part of this update. If you are already using themetrics
component, you will need to update the call accordingly. See the notes in metrics.h for more details. - If you are not using our CMake or Make
build system helpers, you will need
to add
$(MEMFAULT_SDK_ROOT)/components/core/src/memfault_log.c
to your project. (Note that untilmemfault_log_boot()
is called, all calls made to the logging module will be a no-op).
- Improve the
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). - Fixed compiler error that could arise with the metrics component when using Arm Compiler 5 due to multiply defined weak symbols.
- Add support for ESP32 (Tensilica Xtensa LX6 MCU) to the panics component.
- A step-by-step integration guide can be found here.
- A drop-in port for an existing v3.x or v4.x based ESP-IDF project can be found at ports/esp_idf.
- An example application exercising the memfault-firmware-sdk can be found here.
- If a software watchdog has been
implemented on a Cortex-M device,
MemfaultWatchdog_Handler
can now be registered as the Exception Handler to automatically collect a coredump. - For heartbeat metrics, instead of serializing the name of each metric, we now recover it from the debug information in the symbol file in the Memfault cloud. For a typical heartbeat this reduces the serialization size by more than 50% and results in a smaller footprint than other structured serialization alternatives such as Protobuf.
- Remove usage of
__has_include
macro for IAR compiler since not all versions fully support it.
- Add support for calling
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. - Misc documentation improvements.
- Add support for compressing coredumps as they are sent using Run Length Encoding (RLE). More details can be found in memfault/core/data_source_rle.h.
- Update metrics component to support compilation with the IAR ARM C/C++ Compiler.
- Update Mbed OS 5 port to use
memfault_demo_shell
insteadmbed-client-cli
, sincembed-client-cli
is not part of the main Mbed OS 5 distribution. - Update nrf52 example application to only collect the active parts of the stack to reduce the overall size of the example coredump.
- Add a new API ("Trace Event") for tracking errors. This allows for tracing issues that are unexpected but are non-fatal (don't result in a device reboot). A step-by-step guide detailing how to use the feature can be found at: https://mflt.io/error-tracing
- Update GDB coredump collection script to work with the ESP32 (Tensilica Xtensa LX6 Architecture)
- Remove
__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. - Misc documentation and comment tweaks to make nomenclature more consistent
- Update panics component to support compilation with IAR ARM C/C++
Compiler. More details about integrating IAR can be found at
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)
)
- Update the chunk protocol to encode CRC in last chunk of message instead of first. This allows the CRC to be computed incrementally and the underlying message to be read once (instead of twice). It also makes it easier to use the data packetizer in environments where reads from data sources need to be performed asynchronously. More details can be found at https://mflt.io/data-to-cloud
- Fixed a couple documentation links
- Guarantee that all accesses to the platform coredump storage region route
through
memfault_coredump_read
while the system is running. - Scrub unused portion of out buffer provided to packetizer with a known pattern for easier debugging
- Add convenience API,
memfault_packetizer_get_chunk()
, to data_packetizer module. - Add a new eMfltCoredumpRegionType,
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. - Automatically collect Exception / ISR state for Cortex-M based targets. NOTE
that the default config requires an additional ~150 bytes of coredump storage.
The feature can be disabled completely by adding
-DMEMFAULT_COLLECT_INTERRUPT_STATE=0
to your compiler flags. More configuration options can be found in memfault_coredump_regions_armv7.m. - Improve documentation about integrating the SDK within a project in README
- Update Release note summary to use markdown headings for easier referencing.
- Update try script used to collect coredumps via GDB to also collect Exception/ISR register information.
- Add ARMv6-M fault handling port to panics component for MCUs such as the ARM Cortex-M0 and Cortex-M0+.
- Update panics component to support compilation with Arm Compiler 5.
- Updated Cortex-M fault handler in panics component to also collect
psp
andmsp
registers when the system crashes. This allows for the running thread backtrace to be more reliably recovered when a crash occurs from an ISR. - Added optional
MEMFAULT_EXC_HANDLER_...
preprocessor defines to enable custom naming of exception handlers in the panics component. - Add port for Cortex-M based targets using Quantum Leaps' QP™/C & QP™/C++ real-time embedded framework. See ports/qp/README.md for more details.
- Add demo application running Quantum Leaps' QP™/C running on the STM32F407 discovery board. See examples/qp/README.md for more details.
- Added demo application and port for Arm Mbed OS 5 running on the STM32F429I-DISC1 evaluation board. See examples/mbed/README.md for more details.
- Changed
print_core
toprint_chunk
in demo applications to better align with the Memfault nomenclature for data transfer.
- Expose root certificates used by Memfault CI in DER format for easier integration with TLS libraries which do not parse PEM formatted certificates.
- Add utilities to the http component for constructing Memfault cloud chunk endpoint POST requests to facilitate easier integration in environments with no pre-existing http stack.
- Add port for Cortex-M based targets in the Zephyr RTOS. Ports are available for the 1.14 Long Term Support Release as well as the 2.0 Release. See ports/zephyr/README.md for more details
- Add Zephyr demo application (tested on the STM32L4). See zephyr demo app directory for more details
- Release of metrics component. This API can easily be used to monitor device health over time (i.e connectivity, battery life, MCU resource utilization, hardware degradation, etc) and configure Alerts with the Memfault backend when things go astray. To get started, see this document
- 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:
-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:
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.
- Enhanced Reboot Tracking module within the panics component. Reboots that
don't result in coredumps can now be easily tracked (i.e brown outs, system
watchdogs, user initiated resets, resets due to firmware updates, etc). See
memfault/core/reboot_tracking.h
for more details and https://mflt.io/2QlOlgH for a step-by-step setup tutorial. - Added Event Storage module within the core component. This is a small RAM backed data store that queues up traces to be published to the Memfault cloud. To minimize the space needed and transport overhead, all events collected within the SDK are stored using the Concise Binary Object Representation (CBOR)
- Added helper makefile (
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 components - Make unit tests public & add CI to external SDK
- Added firmware side support for the Memfault cloud chunk endpoint. This is
a sessionless endpoint that allows chunks of arbitrary size to be sent and
reassembled in the Memfault cloud. This transport can be used to publish any
data collected by the Memfault SDK. The data is read out on the SDK side by
calling the
memfault_packetizer_get_next()
API indata_packetizer.h
. More details here - Updated demo apps to use the new chunk endpoint
- Added a new weak function,
memfault_coredump_read()
so platform ports can easily add locking on reads to coredump storage if necessary for transmission. - Updates to this version of the sdk will require the util component get compiled when using the panics API
- Added example port and demo for the STM32H743I-NUCLEO144 evaluation board
running ChibiOS. See
examples/stm32/stm32h743i/README.md
for more details. - general README documentation improvements
- Fixed compilation error that could arise in
memfault_fault_handling_arm.c
when using old versions of GCC
- Updated panics SDK to support complex hardware toplogies such as systems
with multiple MCUs or systems running multiple binaries on a single MCU. More
details here. Users of the SDK will need to update
the implementation for
memfault_platform_get_device_info()
- Updated all ports to be in sync with SDK updates
- Updated panics core code to always collect fault registers for ARMv6-M & ARMv7-M architectures. The Memfault cloud will auto-analyze these and present an analysis.
- Updated https://try.memfault.com gdb script to collect Cortex-M MPU region information for auto-analysis
- general README documentation improvements
- improved error reporting strategy and documentation in
memfault/core/errors.h
- added example port and demo of panics SDK for the Nordic nRF52840
(PCA10056) development kit. See
examples/nrf5/README.md
for more details. - Made SDK headers suitable for includion in C++ files
First Public Release of Memfault Firmware SDK 0.0.2 - June 26, 2019
- published initial Memfault SDK, see
README.md
in root for summary - published panics API which is a C SDK that can be integrated into any
Cortex-M device to save a "core" (crash state) on faults and system asserts.
See
components/panics/README.md
for more details - Added example port and demo of panics SDK for the BCM943364WCD1 evaluation
board running the WICED Wifi stack. More details in
examples/wiced/README.md
- add python invoke based CLI wrapper for demo ports