The fault handler on Teensy 4 - TeensyUser/doc GitHub Wiki
Teensy 4.x ( and MicroMod with same 1062 MCU ) in release of TeensyDuino 1.54 offers a CrashReport feature.
It can be tested and printed with code like the following that will expose a Crash if recorded - it will also CAUSE a crash to show the behavior when one was not present to start.
// Typical Usage Example : when a sketch is leaving the Teensy non-responsive
// Compile this sketch with USB Serial
// With Serial Monitor attaching it will restart and show the CrashReport
// If Serial Monitor is not active it will continue to Crash and restart
void setup() {
Serial.begin(9600); // With TeensyDuino 1.54 Serial.begin() may return connected
if ( Serial && CrashReport )
{ // Make sure Serial is alive and there is a CrashReport stored.
Serial.print(CrashReport); // Once called any crash data is cleared
// In this case USB Serial is used - but any Stream capable output will work : SD Card or other UART Serial
}
else
{
// Following code will cause a Fault of the processor from writing to a NULL pointer
// Don't run it again until the next restart showing normal after a fault
uint32_t *y = 0;
y[0] = 5; // Comment or remove this line to preevent causing a Crash
}
pinMode( LED_BUILTIN, OUTPUT );
}
elapsedMillis blinkTime;
void loop() {
if ( blinkTime > 1000 ) {
digitalToggle( LED_BUILTIN );
blinkTime = 0;
}
}
In the event of a found CrashReport the persistent ( while powered ) nature of the RAM2/DMAMEM can retain data values in use before the Crash restart can be present on restart after the watchdog time out.
DMAMEM byte myWarmRam[13]; // This array will be in RAM2 and present with prior values on restart.
When allocated this way it will reside at a specific location between restarts, and this memory is not zero initialized or otherwise overwritten - unless new code upload has it moved during the build.
arm_dcache_flush(myWarmRam, sizeof(myWarmRam)); // As long as the cache was flushed to physical RAM before the Crash