Domanda

Durante l'esecuzione il mio programma su un dispositivo microchip ICD3, la gestione delle eccezioni sembra strano. Il programma si arresta la risposta, mentre si verifica un'eccezione. Durante il controllo del codice, ho notato che il default-general-eccezioni-handler.c creerà un ciclo infinito. E 'davvero confusione perché non posso sapere dove si verifica l'errore e qual è la ragione. Questo significa che Microchip fa la gestione delle eccezioni non il supporto? O c'è un modo per leggere il messaggio di errore?

ciclo 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        

Con la definizione di un _general_exception_handler, funziona!

// 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
    }
}
È stato utile?

Soluzione

Nella maggior parte dei microcontrollori, non v'è alcun codice al di là di ciò che si mette lì. Nella maggior parte dei casi, se si verifica un'eccezione e non è stato definito un gestore per esso, il processore non avrebbe alcuna idea di come mettere un "Mi dispiace, un errore di sistema si è verificato" finestra di dialogo. Utilizzando due byte per istruzione "ramo-sé" è sufficiente per produrre una risposta prevedibile a un'eccezione; senza particolari conoscenze di meglio corso d'azione, un ramo a sé o di reset forzato è probabilmente un buon risposta come qualcosa.

PS - Alcuni compilatori per varie piattaforme ometterà vettori di interrupt o eccezioni non utilizzati; se tali eccezioni si verificano inaspettatamente, cose strane e bizzarre possono accadere. Alcuni compilatori produrre codice che costringerà un reset immediato (si noti che, se il timer watchdog è abilitato, un salto-per-sé causerà un reset, alla fine). Alcuni compilatori generano un immediato ritorno da interrupt (che su alcuni di CPU può essere inutile, e altri possono causare cattivo comportamento). Il mio modello preferito sarebbe quello di avere tutti gli interrupt non utilizzati effettuare una chiamata (non un ramo) per un'etichetta UnexpectedInterrupt, che, in assenza di una definizione esplicita punterà ad un'istruzione di salto a sé. Se uno fa quello, un gestore UnexpectedInterrupt può pop lo stack e registrare che tipo di interrupt imprevisto. Non ho mai visto un tale modello, però, al di fuori le mie tabelle di interruzione vettore manualmente generati.

Altri suggerimenti

Proprio come un heads-up per ulteriori debug eccezione PIC32, i codici di eccezione e tutti i bit nel registro perche '' (il valore che stai leggendo nella vostra variabile _excep_code prima e-ing tutti gli altri bit di distanza) sono definita in:

Manuale PIC32 Famiglia di riferimento , Sezione 2.12.9 CAUSA Registrati http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top