void pp_soft_wdt_feed() { struct rst_info rst_info; rst_info.exccause = RSR(EXCCAUSE); rst_info.epc1 = RSR(EPC1); rst_info.epc2 = RSR(EPC2); rst_info.epc3 = RSR(EPC3); rst_info.excvaddr = RSR(EXCVADDR); rst_info.depc = RSR(DEPC); rst_info.reason = WDT_RST_FLAG; system_rtc_mem_write(0, &rst_info, sizeof(rst_info)); if(wdt_flg == true) { Cache_Read_Disable(); Cache_Read_Enable_New(); system_restart_local(); } else { #if SDK_VERSION >= 1119 wDev_MacTim1Arm(soft_wdt_interval); #else ets_timer_disarm(SoftWdtTimer); ets_timer_arm_new(SoftWdtTimer, soft_wdt_interval, 0, 1); #endif wdt_flg = true; pp_post(12); } }
void pp_soft_wdt_feed_local() { struct rst_info rst_info; rst_info.exccause = RSR(EXCCAUSE); rst_info.epc1 = RSR(EPC1); rst_info.epc2 = RSR(EPC2); rst_info.epc3 = RSR(EPC3); rst_info.excvaddr = RSR(EXCVADDR); rst_info.depc = RSR(DEPC); if(wdt_flg == true) { rst_info.reason = REASON_SOFT_WDT_RST; // =3 system_rtc_mem_write(0, &rst_info, sizeof(rst_info)); ets_intr_lock(); Wait_SPI_Idle(flashchip); Cache_Read_Enable_New(); system_restart_local(); } else { rst_info.reason = REASON_WDT_RST; // =1 system_rtc_mem_write(0, &rst_info, sizeof(rst_info)); #if DEF_SDK_VERSION >= 1119 wDev_MacTim1Arm(soft_wdt_interval); #else ets_timer_disarm(SoftWdtTimer); ets_timer_arm_new(SoftWdtTimer, soft_wdt_interval, 0, 1); #endif wdt_flg = true; pp_post(12); } }
/* * xtos low level exception handler (in rom) * populates an xtos_regs structure with (most) registers * present at the time of the exception and passes it to the * high-level handler. * * Note that the a1 (sp) register is clobbered (bug? necessity?), * however the original stack pointer can be inferred from the address * of the saved registers area, since the exception handler uses the same * user stack. This might be different in other execution modes on the * quite variegated xtensa platform family, but that's how it works on ESP8266. */ IRAM NOINSTR void esp_exception_handler(struct xtensa_stack_frame *frame) { uint32_t cause = RSR(EXCCAUSE); uint32_t vaddr = RSR(EXCVADDR); fprintf(stderr, "\nTrap %d: pc=%p va=%p\n", cause, (void *) frame->pc, (void *) vaddr); memcpy(®s.a[2], frame->a, sizeof(frame->a)); regs.a[0] = frame->a0; regs.a[1] = (uint32_t) frame + ESP_EXC_SP_OFFSET; regs.pc = frame->pc; regs.sar = frame->sar; regs.ps = frame->ps; regs.litbase = RSR(LITBASE); handle_exception(®s); fprintf(stderr, "rebooting\n"); fs_flush_stderr(); /* * Documented `system_restart` does a lot of things (cleanup) which (seems) * cannot be done from exc handler and only after cleanup it calls * `system_restart_local`. */ system_restart_local(); }