static avr_cycle_count_t avr_watchdog_timer(struct avr_t * avr, avr_cycle_count_t when, void * param) { avr_watchdog_t * p = (avr_watchdog_t *)param; printf("WATCHDOG timer fired.\n"); avr_raise_interrupt(avr, &p->watchdog); if (!avr_regbit_get(avr, p->watchdog.enable)) { printf("WATCHDOG timer fired and interrupt is not enabled. Quitting\n"); avr_sadly_crashed(avr, 10); } return 0; }
void crash(avr_t* avr) { DUMP_REG(); printf("*** CYCLE %" PRI_avr_cycle_count "PC %04x\n", avr->cycle, avr->pc); for (int i = OLD_PC_SIZE-1; i > 0; i--) { int pci = (avr->trace_data->old_pci + i) & 0xf; printf(FONT_RED "*** %04x: %-25s RESET -%d; sp %04x\n" FONT_DEFAULT, avr->trace_data->old[pci].pc, avr->trace_data->codeline ? avr->trace_data->codeline[avr->trace_data->old[pci].pc>>1]->symbol : "unknown", OLD_PC_SIZE-i, avr->trace_data->old[pci].sp); } printf("Stack Ptr %04x/%04x = %d \n", _avr_sp_get(avr), avr->ramend, avr->ramend - _avr_sp_get(avr)); DUMP_STACK(); avr_sadly_crashed(avr, 0); }
void crash(avr_t* avr) { avr_sadly_crashed(avr, 0); }