You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mbed OS provides error code and error status definitions and error handling APIs for error construction, reporting and retrieving previously reported errors. Mbed OS also provides functions and macros to generate and define new error status values, extract information from error status values and to report errors into the system. Any software layer, such as applications, drivers, HAL and protocol stacks, can use these error handling APIs. The error functions also facilitate emitting an error message through STDOUT. `mbed_error.h` declares the error functions that Mbed OS provides.
3
+
Mbed OS provides error status definitions and APIs for error construction, reporting and retrieving previously reported errors. Mbed OS also provides functions and macros to generate and define new error status values, extract information from error status values and to report errors into the system. Any software layer, such as applications, drivers, HAL and protocol stacks, can use these error handling APIs. The error functions also facilitate emitting an error message through STDOUT. `mbed_error.h` declares the error functions that Mbed OS provides.
4
4
5
5
Conceptually, error handling is a platform service that the Mbed OS platform layer implements. Error handling provides the following:
For more info, visit: https://mbed.com/s/error?error=0x80FF013D&mbedos=999999&core=0x410FC241&compile=1&ver=5060528
97
+
For more info, visit: https://mbed.com/s/error?error=0x80FF013D
98
98
-- MbedOS Error Info --
99
99
```
100
100
@@ -130,6 +130,45 @@ Mbed OS application and system developers may need to define error codes specifi
130
130
131
131
Some applications may want to do custom error handling when an error is reported using `MBED_ERROR()` or `MBED_WARNING()`. Applications can accomplish this by registering an error hook function with the Mbed OS error handling system using the **mbed_set_error_hook()** API. This function is called with error context information whenever the system handles an **MBED_ERROR()** or **MBED_WARNING()** invocation. This function should be implemented for re-entrancy because multiple threads may invoke `MBED_ERROR()` or `MBED_WARNING()`, which may cause the error hook to be called in parallel.
132
132
133
+
### Crash reporting and auto-reboot
134
+
135
+
Whenever a fatal error happens in the system, the Mbed OS error handling system collects key information such as error code, error location, register context (in the case of fault exceptions) and so on. The error handing system stores that information in a reserved RAM region called Crash-data-RAM. The error information stored in Crash-data-RAM is in binary format and follows the `mbed_error_ctx` structure defined in `mbed_error.h`. The system then triggers a warm-reset without losing the RAM contents that store the error information. After the system reboots, during Mbed OS initialization, the Crash-data-RAM region is checked to find if there is valid error information captured. This is done by using a CRC value calculated over the stored error information and is appended as part of information stored in Crash-data-RAM. If the system detects that the reboot was triggered by a fatal error, it will invoke a callback function with a pointer to the error context structure stored in Crash-data-RAM. The default callback function is defined with the `WEAK` attribute, which the application can override. Below is the signature for the callback:
<spanclass="notes">**Note:** This callback is invoked before the system starts executing the application `main()`. The implementation of callback should be aware any resource limitations or availability. Also, the callback is invoked only when there is a new error.</span>
140
+
141
+
#### Adding the Crash-data-RAM region for crash reporting
142
+
143
+
The crash reporting feature requires a special memory region, called Crash-data-RAM, to work. This region is 256 bytes and is allocated using linker scripts for the target for each toolchain. Although all platforms support crash reporting feature, not all targets are currently modified to allocate this Crash-data-RAM region.
144
+
145
+
See `mbed_lib.json` in the platform directory to see which targets are currently enabled with crash reporting. To enable crash reporting in other targets, you must modify the linker scripts for those targets to allocate the Crash-data-RAM region. You can refer to the linker scripts for one of the targets already enabled with crash reporting to understand how the Crash-data-RAM region is allocated. Below are some guidelines to make the linker script changes:
146
+
147
+
- The region size should be 256 bytes and aligned at 8-byte offset.
148
+
- If you are enabling the Crash-data-RAM for the *ARM compiler*, linker scripts must export the following symbols:
149
+
150
+
__Image$$RW_m_crash_data$$ZI$$Base__ - Indicates start address of Crash-data-RAM region.
151
+
__Image$$RW_m_crash_data$$ZI$$Size__ - Indicates size of Crash-data-RAM region.
152
+
153
+
- If you are enabling the Crash-data-RAM for the *GCC ARM compiler* or *IAR Compiler*, linker scripts must export the following symbols:
154
+
155
+
__\_\_CRASH_DATA_RAM_START\_\___ - Indicates start address of Crash-data-RAM region.
156
+
__\_\_CRASH_DATA_RAM_END\_\___ - Indicates end address of Crash-data-RAM region.
157
+
158
+
It's important that this region is marked with the appropriate attributes (based on the toolchain) to mark it as an uninitialized region. For example, you can mark the ARM Compiler Crash-data-RAM with the attribute *EMPTY*. The only requirement about the placement of this region is that no other entity can overwrite this region during reboot or at runtime. However, to avoid fragmentation, it's best if you place this region just after the vector table region, or if there is no vector table region, iat the bottom of RAM (lowest address).
159
+
160
+
See [memory model](memory.html) for more info on the placement of this region.
161
+
162
+
#### Configuring crash reporting and autoreboot
163
+
164
+
The Mbed OS crash reporting implementation provides many options to configure the crash reporting behavior. Below is the list of configuration options available to configure crash reporting functionality. These configuration options are defined in `mbed_lib.json` under the platform directory:
165
+
166
+
-`crash-capture-enabled` - Enables crash context capture when the system enters a fatal error or crash. When this is disabled, it also disables other dependent options mentioned below.
167
+
-`fatal-error-auto-reboot-enabled` - Setting this to true enables autoreboot on fatal errors.
168
+
-`error-reboot-max` - Maximum number of auto-reboots(warm-resets) permitted on fatal errors. The system stop auto-rebooting once it reaches the maximum limit. Setting this value to 0 disable auto-reboot.
169
+
170
+
Crash reporting feature also provides APIs to read and clear error context information captured in Crash-data-RAM region. Please see the API reference below for [crash reporting related APIs](#crash-reporting-api).
171
+
133
172
### Error handling functions reference
134
173
135
174
The below link provides the documentation for all the APIs that Mbed OS provides for error definitions and handling:
@@ -298,12 +337,106 @@ void save_all_errors() {
298
337
mbed_clear_all_errors();
299
338
}
300
339
```
340
+
341
+
#### Using `mbed_get_reboot_error_info()` to retrieve the reboot error info
342
+
343
+
In the example below, status variable `reboot_error_detected` is set to 1 when the callback is invoked. Then, the `main()`
344
+
function reads the reboot error information using `mbed_get_reboot_error_info()`.
if (MBED_SUCCESS == mbed_get_reboot_error_info(&error_ctx)) {
391
+
printf("\nRead in reboot info\n");
392
+
if (error_ctx.error_status == MBED_ERROR_HARDFAULT_EXCEPTION) {
393
+
if (MBED_SUCCESS == mbed_get_reboot_fault_context(&fault_ctx)) {
394
+
printf("\nRead in fault context info\n");
395
+
}
396
+
}
397
+
}
398
+
}
399
+
//main continues...
400
+
}
401
+
```
402
+
403
+
#### Using `mbed_reset_reboot_error_info()` to clear the reboot error info
404
+
405
+
You can use `mbed_reset_reboot_error_info()` to clear the reboot error information:
406
+
407
+
```CPP TODO
408
+
voidclear_reboot_errors() {
409
+
410
+
//Clear the currently stored error info in Crash-data-RAM
411
+
mbed_reset_reboot_error_info();
412
+
}
413
+
```
414
+
415
+
#### Using `mbed_reset_reboot_count()` to reset the reboot count
416
+
417
+
You can use `mbed_reset_reboot_error_info()` to specifically reset the reboot count stored in Crash-data-RAM. Calling this function sets the reboot count to 0:
418
+
419
+
```CPP TODO
420
+
voidclear_reboot_count() {
421
+
422
+
//Clear the currently stored error info in Crash-data-RAM
423
+
mbed_reset_reboot_count();
424
+
}
425
+
```
426
+
301
427
### Error handling example
302
428
303
429
The example application below demonstrates usage of error handling APIs:
0 commit comments