Pregunta

Durante la ejecución de mi programa en un dispositivo microchip ICD3, a excepción miradas manejo raro. El programa se detendrá la respuesta, mientras que se produce una excepción. Mientras que el registro del código, he notado que el valor por defecto de lo general a excepción-handler.c creará un bucle infinito. Realmente es confuso porque no puedo saber dónde se produce el error y cuál es la razón. Significa eso Microchip hace el manejo de excepciones no ayuda? ¿O hay una manera de leer el mensaje de error?

bucle infinito:

---  \home\c11067\work\C32\builds\pic32-microchip-release-1.12-20101221-rc2-20101221\pic32-libs\libc\stubs\default-general-exception-handler.c
9D00DD28  1000FFFF   beq         zero,zero,0x9d00dd28
9D00DD2C  00000000   nop        

Al definir un _general_exception_handler, funciona!

// declared static in case exception condition would prevent
// auto variable being created
static enum {
    EXCEP_IRQ = 0,          // interrupt
    EXCEP_AdEL = 4,         // address error exception (load or ifetch)
    EXCEP_AdES,             // address error exception (store)
    EXCEP_IBE,              // bus error (ifetch)
    EXCEP_DBE,              // bus error (load/store)
    EXCEP_Sys,              // syscall
    EXCEP_Bp,               // breakpoint
    EXCEP_RI,               // reserved instruction
    EXCEP_CpU,              // coprocessor unusable
    EXCEP_Overflow,         // arithmetic overflow
    EXCEP_Trap,             // trap (possible divide by zero)
    EXCEP_IS1 = 16,         // implementation specfic 1
    EXCEP_CEU,              // CorExtend Unuseable
    EXCEP_C2E               // coprocessor 2
} _excep_code;



static unsigned int _epc_code;
static unsigned int _excep_addr;

// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));

    _excep_code = (_excep_code & 0x0000007C) >> 2;

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
    }
}
¿Fue útil?

Solución

En la mayoría de los microcontroladores, no hay ningún código más allá de lo que se pone ahí. En la mayoría de los casos, si se produce una excepción y no se ha definido un controlador para él, el procesador tendría ni idea de cómo poner un "Lo siento, se produjo un error del sistema" cuadro de diálogo. El uso de dos bytes para una instrucción de "-rama-a la libre" es suficiente para producir una respuesta predecible a una excepción; sin conocimiento particular de mejor curso de acción, una rama-a-uno mismo o reinicio forzado es probablemente tan bueno como cualquier cosa una respuesta.

PS - Algunos compiladores para varias plataformas omitiremos vectores de interrupciones no utilizados o excepciones; si dichas excepciones se producen de forma inesperada, cosas raras y extrañas pueden suceder. Algunos compiladores producir código que obligue a un restablecimiento inmediato (nota que si está activado el temporizador de vigilancia, una auto-salto-a causará un reinicio, con el tiempo). Algunos compiladores generan una rentabilidad-from-interrupción inmediata (que en algunas de CPU puede ser inútil, y en otros pueden causar el mal comportamiento). Mi patrón favorito sería tener todas las interrupciones no utilizados hacen una llamada (no una rama) a una etiqueta UnexpectedInterrupt, que en ausencia de cualquier definición explícita apuntará a una instrucción de bifurcación a la libre. Si uno hace eso, un controlador UnexpectedInterrupt puede hacer estallar la pila y el registro de qué tipo de interrupción inesperada. No he visto un patrón de este tipo, sin embargo, fuera de mis propias tablas de vectores de interrupción generada manualmente.

Otros consejos

Así como un mano a mano para su posterior depuración excepción PIC32, los códigos de excepción y todos los bits en el registro 'causa' (el valor que está leyendo en su variable de _excep_code antes y-ción de todos los otros bits de distancia) son se define en:

Manual de Referencia PIC32 Familia , Sección 2.12.9 Registro Causa http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top