Атмел Студия Манекен_Хандлер

Иногда я получаю неожиданное прерывание, и мой код будет висеть внутри Dummy_Handler()вexceptions.cфреймворка Atmel Studio (ASF). Я использую микроконтроллер ATSAM3X8E из Arduino Due.

void Dummy_Handler(void)
{
    while(1) {
    }
}

Есть идеи, как определить,какое это было прерывание?

Конечно, я мог бы заменить этот единственный обработчик уникальными фиктивными обработчиками, по одному на каждое исключение. (Их около пятидесяти.) Например, измените каждую строку в одном и том же файле exceptions.c:

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_Handler")));

к этому

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));

И т.д.... Или попытайтесь понять, как мой код мог сгенерировать какое прерывание. Но у кого есть такое время?

1 ответ

Решение

Этот MCU имеет регистр состояния программы прерывания, который дает некоторую подсказку относительно источника. ASF обернул его в функцию __get_IPSR() в core_cmFunc.h:

uint32_t phantomISR = 9999;

void Dummy_Handler(void)
{
    while(1) {
        phantomISR = __get_IPSR();
    }
}

Затем эту глобальную переменную можно отслеживать во время выполнения. (В моем случае я приостановил сборочный код для этой петли смерти и увидел значение 3 в регистре R3.) Документ Atmel MCU объясняет его значение:

ISR_NUMBER
Это номер текущего исключения:
0 = режим резьбы
1 = зарезервировано
2 = НМИ
3 = Жесткая неисправность
4 = Ошибка управления памятью
5 = ошибка шины
6 = ошибка использования
7-10 = Зарезервировано
11 = SVCall
12 = Зарезервировано для отладки
13 = Зарезервировано
14 = PendSV
15 = SysTick
16 = IRQ0
45 = IRQ29

Оба раза это случалось со мной, это был Hard Fault, своего рода "синий экран смерти" для Ardunio Due. Поэтому я также установил собственный обработчик Hard Fault.

ISR(HardFault_Handler)
{
    while (1) {
    }
}

Кроме того, обнаруживается в режиме отладки с помощью паузы. Конечно, продолжение, что вызывает Hard Fault? Я предполагаю стирание памяти или бесконечную рекурсию.

Другие вопросы по тегам