Атмел Студия Манекен_Хандлер
Иногда я получаю неожиданное прерывание, и мой код будет висеть внутри 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? Я предполагаю стирание памяти или бесконечную рекурсию.