La familia Freescale HCS08 tiene un registro de "Estado de restablecimiento del sistema" que se establece en función de la fuente del último restablecimiento, identificando cosas como LVD, POR, restablecimiento del depurador, código de operación ilegal, acceso ilegal a la dirección, tiempo de espera de vigilancia, pérdida de reloj, y hardware (reset externo). ¿Podría haber un equivalente en los PIC?
Me ha ahorrado un 50% de dolor después de aprender a usarlo, ya que te indica la posible fuente del error. Un punto de interrupción solo funciona si sabe aproximadamente dónde y cuándo el código causará un error fatal, de lo contrario, tendrá que pasar miles de veces, probablemente a través del mismo código, hasta que alcance el error.
Editar: Aquí está el código estúpido que escribí para él (obviamente, solo HCS08). No es tan bonito, pero bueno, soy un desarrollador de hardware, no software.
#ifdef Debug_MP16VLF
const char rstsrc[] = "Source :";
const char clrColors[] = "\x1B[0m";
const char * const rst_srcs[] = {
" \x1B[32mPower On Reset", " \x1B[32mReset Pin",
" \x1B[31mWatchdog", " \x1B[35mIllegal Opcode",
" \x1B[36mIllegal Address", " \x1B[33mLow Voltage Detect",
" \x1B[33mDebugger Reset"
};
enum rst_srcs_idxs{
RST_POR, RST_PIN,
RST_COP, RST_ILOP,
RST_ILAD, RST_LVD,
RST_DBG
};
#endif
...
# ifdef Debug_MP16VLF
// Find reason(s) for reset and display
print_str(rstsrc, 0, 1);
if (SRS_LVD) {
if (SRS_POR) print_str(rst_srcs[RST_POR], 0, 1);
print_str(rst_srcs[RST_LVD], 0, 1);
} else if (SRS) {
// possible multiple reset sources
uint8_t i, j;
for (i = SRS_ILAD_MASK, j = RST_ILAD;
i <= SRS_PIN_MASK;
i <<= 1, j--) {
if (i & SRS) print_str(rst_srcs[j], 0, 1);
}
} else {
print_str(rst_srcs[RST_DBG], 0, 1);
}
print_str(clrColors, 1, 1);
# endif