обработка исключений микрочипа - PullRequest
3 голосов
/ 20 октября 2011

Во время работы моей программы на устройстве с микрочипом ICD3 обработка исключений выглядит странно. Программа прекратит отклик при возникновении исключения. При проверке кода я заметил, что default-general-exception-handler.c создаст бесконечный цикл. Это действительно сбивает с толку, потому что я не могу знать, где происходит ошибка и в чем причина. Означает ли это, что Microchip не поддерживает обработку исключений? Или есть способ прочитать сообщение об ошибке?

бесконечный цикл:

---  \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        

Определяя обработчик _general_exception_handler, он работает!

// 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
    }
}

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

На большинстве микроконтроллеров нет кода, кроме того, что вы там поместили.В большинстве случаев, если возникает исключение, и вы не определили для него обработчик, процессор не будет знать, как открыть диалоговое окно «Извините, произошла системная ошибка».Использование двух байтов для инструкции «переход к себе» достаточно для получения предсказуемого ответа на исключение;без особого знания какого-либо лучшего способа действий ответвление к себе или принудительный сброс, вероятно, являются таким же хорошим ответом, как и все.

PS - Некоторые компиляторы для различных платформ пропускают векторы для неиспользуемых прерываний или исключений;если такие исключения происходят неожиданно, могут происходить странные и странные вещи.Некоторые компиляторы генерируют код, который вызывает немедленный сброс (обратите внимание, что если сторожевой таймер включен, переход к самому себе в конечном итоге приведет к сбросу).Некоторые компиляторы генерируют немедленный возврат от прерывания (что на некоторых процессорах может быть бесполезным, а на других может вызывать плохое поведение).Моим любимым шаблоном было бы, чтобы все неиспользуемые прерывания вызывали (не ветвь) метку UnexpectedInterrupt, которая при отсутствии какого-либо явного определения будет указывать на инструкцию перехода к себе.Если это сделать, обработчик UnexpectedInterrupt может вытолкнуть стек и записать, какой тип неожиданного прерывания произошел.Однако я не видел такой схемы за пределами моих собственных сгенерированных вручную таблиц векторов прерываний.

2 голосов
/ 04 января 2012

Точно так же, как хедс-ап для дальнейшей отладки исключений PIC32, коды исключений и все биты в регистре 'CAUSE' (значение, которое вы читаете в переменную _excep_code перед тем, как убрать все остальные биты)определяется в:

Справочное руководство по семейству PIC32 , раздел 2.12.9 Регистр ПРИЧИНЫ http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

...