diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index dd3d3f5c..0b8cf350 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1820,13 +1820,40 @@ static void lcd_serial_dump() } #endif //MENU_SERIAL_DUMP -#if defined(WATCHDOG) && defined(DEBUG_BUILD) && defined(EMERGENCY_HANDLERS) +#defined(DEBUG_BUILD) && defined(EMERGENCY_HANDLERS) +#include + +#ifdef WATCHDOG static void lcd_wdr_crash() { while (1); } #endif +static uint8_t lcd_stack_crash_(uint8_t arg, uint32_t sp = 0) +{ + // populate the stack with an increasing value for ease of testing + volatile uint16_t tmp __attribute__((unused)) = sp; + + _delay(arg); + uint8_t ret = lcd_stack_crash_(arg, SP); + + // required to avoid tail call elimination and to slow down the stack growth + _delay(ret); + + return ret; +} + +static void lcd_stack_crash() +{ +#ifdef WATCHDOG + wdt_disable(); +#endif + // delay choosen in order to hit the stack-check in the temperature isr reliably + lcd_stack_crash_(10); +} +#endif + //! @brief Show Support Menu //! @@ -2027,9 +2054,12 @@ static void lcd_support_menu() MENU_ITEM_FUNCTION_P(_i("Dump to serial"), lcd_serial_dump); #endif #ifdef DEBUG_BUILD -#if defined(WATCHDOG) && defined(EMERGENCY_HANDLERS) +#ifdef EMERGENCY_HANDLERS +#ifdef WATCHDOG MENU_ITEM_FUNCTION_P(PSTR("WDR crash"), lcd_wdr_crash); -#endif +#endif //WATCHDOG + MENU_ITEM_FUNCTION_P(PSTR("Stack crash"), lcd_stack_crash); +#endif //EMERGENCY_HANDLERS MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18 #endif /* DEBUG_BUILD */