Skip to content

Commit de66fe8

Browse files
author
Memfault Inc
committed
Memfault Firmware SDK 1.11.0 (Build 9315)
1 parent 0901fbb commit de66fe8

29 files changed

+431
-206
lines changed

CHANGELOG.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,72 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to
77
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
88

9+
## [1.11.0] - 2024-08-07
10+
11+
### :boom: Breaking Changes
12+
13+
- Add support for namespacing
14+
[Session Metrics](https://docs.memfault.com/docs/mcu/metrics-api#session-metrics)
15+
to support duplicate key names across heartbeats and sessions (eg
16+
`heartbeat.cpu_temp` and `session.cpu_temp`). This requires a change to how
17+
Session Metrics keys are set:
18+
19+
- Before: `MEMFAULT_METRIC_SET_SIGNED(cpu_temp, 25)` (only 1 metric key
20+
`cpu_temp` supported across heartbeats/sessions)
21+
- After:
22+
- `MEMFAULT_METRIC_SET_SIGNED(cpu_temp, 25)` for setting
23+
`heartbeat.cpu_temp`
24+
- `MEMFAULT_METRIC_SESSION_SET_SIGNED(cpu_temp, session, 25)` for setting
25+
`session.cpu_temp`
26+
27+
### :chart_with_upwards_trend: Improvements
28+
29+
- General:
30+
31+
- Fix a :bug: in reboot tracking classification when calling
32+
`memfault_reboot_tracking_boot()` with a `bootup_info` parameter containing
33+
an unexpected type of reboot reason (or no reboot reason) after a previously
34+
recorded expected reason. This results in
35+
["Expected Reboots"](components/include/memfault/core/reboot_reason_types.h#L33)
36+
recorded using `MEMFAULT_REBOOT_MARK_RESET_IMMINENT()` to be incorrectly
37+
flagged as an "Unexpected Reboot" and causes an incorrect
38+
`operational_crashfree_hours` metric getting reported and a lower Stability
39+
score.
40+
41+
- Cleanup comment to old packetizer API
42+
43+
- Add `-fdebug-prefix-map` to FreeRTOS QEMU example
44+
45+
- ESP-IDF:
46+
47+
- Improved the CLI results when running the `post_chunks` test command (used
48+
to trigger an upload to Memfault) to be more informative, for example:
49+
50+
```bash
51+
esp32> post_chunks
52+
I (12593) mflt: Data posted successfully, 262285 bytes sent
53+
esp32> post_chunks
54+
I (204093) mflt: No new data found
55+
```
56+
57+
- Zephyr
58+
59+
- Update samples to use the newly-released Zephyr v3.7.0 🥳
60+
61+
- Add explanatory output to Memfault `test busfault|hardfault` shell commands
62+
when Trusted Firmware-M (TF-M) is in use
63+
64+
- The RTC-based implementation of
65+
[`memfault_platform_time_get_current()`](ports/zephyr/common/memfault_platform_system_time.c)
66+
used a define named `RTC`, which conflicts with the STM32 HAL definition
67+
[here](https://github.com/zephyrproject-rtos/hal_stm32/blob/f1317150eac951fdd8259337a47cbbc4c2e6d335/stm32cube/stm32h7xx/soc/stm32h7b3xxq.h#L2441-L2442).
68+
Rename the define to `MFLT_RTC_NODE` to avoid the conflict.
69+
70+
- nRF-Connect SDK:
71+
72+
- Fix a compilation error when building NCS v2.7.0 with the latest Memfault
73+
firmware SDK (v1.10.1, the previous SDK release).
74+
975
## [1.10.1] - 2024-07-24
1076

1177
### :chart_with_upwards_trend: Improvements

VERSION

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
BUILD ID: 9081
2-
GIT COMMIT: 5183b73f74
3-
VERSION: 1.10.1
1+
BUILD ID: 9315
2+
GIT COMMIT: 2d67818dc2
3+
VERSION: 1.11.0

components/core/src/memfault_ram_reboot_info_tracking.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,19 @@ static void prv_record_reboot_reason(eMemfaultRebootReason reboot_reg_reason,
128128
}
129129

130130
static bool prv_get_unexpected_reboot_occurred(void) {
131-
// Check prior_stored_reason, reboot is unexpected if prior reason is set and in error range or
132-
// unknown
131+
// Use prior_stored_reason as source of reboot reason. Fallback to reboot_reg_reason if
132+
// prior_stored_reason is not set
133+
eMemfaultRebootReason reboot_reason;
133134
if (s_reboot_reason_data.prior_stored_reason !=
134135
(eMemfaultRebootReason)MEMFAULT_REBOOT_REASON_NOT_SET) {
135-
if (s_reboot_reason_data.prior_stored_reason == kMfltRebootReason_Unknown ||
136-
s_reboot_reason_data.prior_stored_reason >= kMfltRebootReason_UnknownError) {
137-
return true;
138-
}
136+
reboot_reason = s_reboot_reason_data.prior_stored_reason;
137+
} else {
138+
reboot_reason = s_reboot_reason_data.reboot_reg_reason;
139139
}
140140

141-
// Check reboot_reg_reason second, reboot is unexpected if in error range or unknown
142-
return (s_reboot_reason_data.reboot_reg_reason == kMfltRebootReason_Unknown ||
143-
s_reboot_reason_data.reboot_reg_reason >= kMfltRebootReason_UnknownError);
141+
// Check if selected reboot_reason is unexpected if in error range or unknown
142+
return (reboot_reason == kMfltRebootReason_Unknown ||
143+
reboot_reason >= kMfltRebootReason_UnknownError);
144144
}
145145

146146
static void prv_record_reboot_event(eMemfaultRebootReason reboot_reason,

components/include/memfault/core/data_packetizer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ typedef enum {
4444
kMemfaultPacketizerStatus_EndOfChunk,
4545

4646
//! Indicates there is more data to be received for the chunk. This will _only_ be returned
47-
//! as a value if multi packet chunking has been enabled by a call to
48-
//! memfault_packetizer_enable_multi_packet_chunks()
47+
//! as a value if multi packet chunking has been enabled by setting the boolean option
48+
//! enable_multi_packet_chunk to true in the packetizer config (sPacketizerConfig)
4949
kMemfaultPacketizerStatus_MoreDataForChunk,
5050
} eMemfaultPacketizerStatus;
5151

components/include/memfault/metrics/ids_impl.h

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
//! Copyright (c) Memfault, Inc.
66
//! See License.txt for details
77
//!
8+
//! Copyright (c) Memfault, Inc.
9+
//! See License.txt for details
10+
//!
811
//! NOTE: The internals of the metric APIs make use of "X-Macros" to enable more flexibility
912
//! improving and extending the internal implementation without impacting the externally facing API
1013

@@ -14,53 +17,36 @@ extern "C" {
1417

1518
#include "memfault/config.h"
1619

17-
#define MEMFAULT_METRICS_SESSION_TIMER_NAME(key_name) mflt_session_timer_##key_name
18-
19-
//! Generate extern const char * declarations for all IDs (used in key names):
20-
#define MEMFAULT_METRICS_KEY_DEFINE_(key_name) \
21-
extern const char *const g_memfault_metrics_id_##key_name;
22-
23-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE(key_name, value_type, _min, _max) \
24-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
25-
26-
#define MEMFAULT_METRICS_STRING_KEY_DEFINE(key_name, max_length) \
27-
MEMFAULT_METRICS_KEY_DEFINE(key_name, _)
28-
29-
#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION(key_name, max_length, session_name) \
30-
MEMFAULT_METRICS_KEY_DEFINE(key_name, _)
20+
// Clear any potential issues from transitive dependencies in these files by
21+
// including them one time, with stubs for the macros we need to define. This
22+
// set up any multiple-include guards, and we can safely include the x-macro
23+
// definitions later.
24+
25+
#define MEMFAULT_METRICS_KEY_DEFINE(...)
26+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE(...)
27+
#define MEMFAULT_METRICS_STRING_KEY_DEFINE(...)
28+
#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION(...)
29+
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(...)
30+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION(...)
31+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION(...)
32+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(...)
33+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE(...)
3134

32-
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(key_name) \
33-
MEMFAULT_METRICS_KEY_DEFINE(MEMFAULT_METRICS_SESSION_TIMER_NAME(key_name), _)
34-
35-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION(key_name, value_type, session_name) \
36-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
37-
38-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION(key_name, value_type, min_value, \
39-
max_value, session_name) \
40-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
41-
42-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(key_name, value_type, scale_value) \
43-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
44-
45-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE(key_name, value_type, \
46-
session_key, scale_value) \
47-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
48-
49-
#define MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type) MEMFAULT_METRICS_KEY_DEFINE_(key_name)
5035
#include "memfault/metrics/heartbeat_config.def"
5136
#include MEMFAULT_METRICS_USER_HEARTBEAT_DEFS_FILE
37+
5238
#undef MEMFAULT_METRICS_KEY_DEFINE
5339
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE
5440
#undef MEMFAULT_METRICS_STRING_KEY_DEFINE
5541
#undef MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION
5642
#undef MEMFAULT_METRICS_SESSION_KEY_DEFINE
5743
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION
5844
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION
59-
#undef MEMFAULT_METRICS_KEY_DEFINE_
6045
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE
6146
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE
6247

63-
#define MEMFAULT_METRICS_KEY_DEFINE_(key_name) kMfltMetricsIndex_##key_name,
48+
#define MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name) \
49+
kMfltMetricsIndex_##session_name##__##key_name,
6450

6551
//! Generate an enum for all IDs (used for indexing into values)
6652
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE(key_name, value_type, min_value, max_value) \
@@ -70,26 +56,29 @@ extern "C" {
7056
MEMFAULT_METRICS_KEY_DEFINE(key_name, _)
7157

7258
#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION(key_name, max_length, session_name) \
73-
MEMFAULT_METRICS_KEY_DEFINE(key_name, _)
59+
MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name)
7460

75-
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(key_name) \
76-
MEMFAULT_METRICS_KEY_DEFINE(MEMFAULT_METRICS_SESSION_TIMER_NAME(key_name), _)
61+
//! Sessions have the following built-in keys:
62+
//! - "<session name>__MemfaultSdkMetric_IntervalMs"
63+
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(session_name) \
64+
kMfltMetricsIndex_##session_name##__##MemfaultSdkMetric_IntervalMs,
7765

7866
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION(key_name, value_type, session_name) \
79-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
67+
MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name)
8068

8169
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION(key_name, value_type, min_value, \
8270
max_value, session_name) \
83-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
71+
MEMFAULT_METRICS_KEY_DEFINE_(session_name, key_name)
8472

8573
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(key_name, value_type, scale_value) \
8674
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
8775

8876
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE(key_name, value_type, \
8977
session_key, scale_value) \
90-
MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
78+
MEMFAULT_METRICS_KEY_DEFINE_(session_key, key_name)
9179

92-
#define MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type) MEMFAULT_METRICS_KEY_DEFINE_(key_name)
80+
#define MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type) \
81+
MEMFAULT_METRICS_KEY_DEFINE_(heartbeat, key_name)
9382

9483
typedef enum MfltMetricsIndex {
9584
#include "memfault/metrics/heartbeat_config.def"
@@ -103,17 +92,19 @@ typedef enum MfltMetricsIndex {
10392
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION
10493
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE
10594
#undef MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE
106-
} eMfltMetricsIndex;
95+
} eMfltMetricsIndexV2;
96+
typedef eMfltMetricsIndexV2 eMfltMetricsIndex;
10797

10898
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(key_name) kMfltMetricsSessionKey_##key_name,
10999
#define MEMFAULT_METRICS_KEY_DEFINE(key_name, value_type)
110100
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE(key_name, value_type, min_value, max_value)
111101
#define MEMFAULT_METRICS_STRING_KEY_DEFINE(key_name, max_length)
102+
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(key_name, value_type, scale_value)
103+
112104
#define MEMFAULT_METRICS_STRING_KEY_DEFINE_WITH_SESSION(key_name, max_length, session_key)
113105
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION(key_name, value_type, session_name)
114106
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_RANGE_AND_SESSION(key_name, value_type, min_value, \
115107
max_value, session_name)
116-
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SCALE_VALUE(key_name, value_type, scale_value)
117108

118109
#define MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION_AND_SCALE_VALUE(key_name, value_type, \
119110
session_key, scale_value)
@@ -149,10 +140,11 @@ typedef struct {
149140

150141
#define MEMFAULT_METRICS_SESSION_KEY(key_name) kMfltMetricsSessionKey_##key_name
151142

152-
#define _MEMFAULT_METRICS_ID_CREATE(id) \
153-
{ kMfltMetricsIndex_##id }
143+
#define _MEMFAULT_METRICS_ID_CREATE(id, session_name) \
144+
{ kMfltMetricsIndex_##session_name##__##id }
154145

155-
#define _MEMFAULT_METRICS_ID(id) ((MemfaultMetricId){ kMfltMetricsIndex_##id })
146+
#define _MEMFAULT_METRICS_ID(id, session_name) \
147+
((MemfaultMetricId){ kMfltMetricsIndex_##session_name##__##id })
156148

157149
#ifdef __cplusplus
158150
}

components/include/memfault/metrics/metrics.h

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,20 @@ typedef enum MemfaultMetricValueType {
129129
//! when the modem is powered off.
130130
#define MEMFAULT_METRICS_SESSION_KEY_DEFINE(key_name) MEMFAULT_METRICS_KEY_DEFINE_TRAP_()
131131

132-
//! Uses a metric key. Before you can use a key, it should defined using MEMFAULT_METRICS_KEY_DEFINE
133-
//! in memfault_metrics_heartbeat_config.def.
132+
//! Use a Heartbeat metric key. Before you can use a key, it should defined using
133+
//! MEMFAULT_METRICS_KEY_DEFINE in memfault_metrics_heartbeat_config.def.
134134
//! @param key_name The name of the key, without quotes, as defined using
135135
//! MEMFAULT_METRICS_KEY_DEFINE.
136-
#define MEMFAULT_METRICS_KEY(key_name) _MEMFAULT_METRICS_ID(key_name)
136+
#define MEMFAULT_METRICS_KEY(key_name) _MEMFAULT_METRICS_ID(key_name, heartbeat)
137+
138+
//! Use a Session metric key. Before you can use a key, it should defined using
139+
//! MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION etc in memfault_metrics_heartbeat_config.def.
140+
//! @param key_name The name of the key, without quotes, as defined using
141+
//! MEMFAULT_METRICS_KEY_DEFINE_WITH_SESSION etc
142+
//! @param session_key The name of the session, without quotes, as defined using
143+
//! MEMFAULT_METRICS_SESSION_KEY_DEFINE
144+
#define MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key) \
145+
_MEMFAULT_METRICS_ID(key_name, session_key)
137146

138147
typedef struct MemfaultMetricsBootInfo {
139148
//! The number of times the system has rebooted unexpectedly since reporting the last heartbeat
@@ -220,6 +229,23 @@ int memfault_metrics_heartbeat_add(MemfaultMetricId key, int32_t amount);
220229
#define MEMFAULT_METRIC_ADD(key_name, amount) \
221230
memfault_metrics_heartbeat_add(MEMFAULT_METRICS_KEY(key_name), (amount))
222231

232+
//! Alternate API for Session metrics
233+
#define MEMFAULT_METRIC_SESSION_SET_SIGNED(key_name, session_key, signed_value) \
234+
memfault_metrics_heartbeat_set_signed(MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key), \
235+
(signed_value))
236+
#define MEMFAULT_METRIC_SESSION_SET_UNSIGNED(key_name, session_key, unsigned_value) \
237+
memfault_metrics_heartbeat_set_unsigned( \
238+
MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key), (unsigned_value))
239+
#define MEMFAULT_METRIC_SESSION_SET_STRING(key_name, session_key, value) \
240+
memfault_metrics_heartbeat_set_string(MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key), \
241+
(value))
242+
#define MEMFAULT_METRIC_SESSION_TIMER_START(key_name, session_key) \
243+
memfault_metrics_heartbeat_timer_start(MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key))
244+
#define MEMFAULT_METRIC_SESSION_TIMER_STOP(key_name, session_key) \
245+
memfault_metrics_heartbeat_timer_stop(MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key))
246+
#define MEMFAULT_METRIC_SESSION_ADD(key_name, session_key, amount) \
247+
memfault_metrics_heartbeat_add(MEMFAULT_METRICS_KEY_WITH_SESSION(key_name, session_key), (amount))
248+
223249
//! For debugging purposes: prints the current heartbeat values using
224250
//! MEMFAULT_LOG_DEBUG(). Before printing, any active timer values are computed.
225251
//! Other metrics will print the current values. This can be called from the

components/include/memfault/version.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ typedef struct {
1919
uint8_t patch;
2020
} sMfltSdkVersion;
2121

22-
#define MEMFAULT_SDK_VERSION { .major = 1, .minor = 10, .patch = 1 }
23-
#define MEMFAULT_SDK_VERSION_STR "1.10.1"
22+
#define MEMFAULT_SDK_VERSION { .major = 1, .minor = 11, .patch = 0 }
23+
#define MEMFAULT_SDK_VERSION_STR "1.11.0"
2424

2525
#ifdef __cplusplus
2626
}

0 commit comments

Comments
 (0)