Цитата(jeka @ Jul 12 2017, 22:58)

Собственно, зачем это нужно - в случае аварии вызывается определенный irq.
На случай аварий - системой уже предусмотрено несколько стандартных аппаратных прерываний разного уровня. От мягких программных, до жёстких системных.
Собаку можно обработать программно, и успеть перевести внешнюю периферию в необходимое для выключение состояние. Например полностью блокировать внешний силовой драйвер мощных транзисторов, да и вообще отрубить всё питание.
Чтение мимо адресного пространства BusFault - можно поймать отладчиком, вернуться в точку остановки кода, и найти сбойное место. Часто причиной сбоя является неисправность указателей, тогда приходится искать намного дольше.
Модуль защиты MPU - на самом деле замечательная вещь, на M4-M7 без него никак. Дело в том что ядро обрабатывает программный код на конвейере, дополнительно - сам код собирается для внеочередного исполнения. GCC знает про MPU, и умеет использовать его настройки. Например для линейной области памяти управления почти всей периферией (0x40000000 - (0.5G)) - запрет кеша, сквозная запись, запрет обратной записи, запрет исполнения кода, ожидать выполнения физической записи. В этом случае состояние периферии будет меняться программой - как задумал пользователь, но не как удобно GCC. Дополнительно - конвейер команд будет сбрасываться при обнаружении обращения к области периферии - чтоб ни одна сволочь вперёд очереди не проскочила (типа я только спросить).
Если при таких настройках выполнить переход на адреса периферии (исполнение программного кода) - то сработает прерывание MemManage_Handler. Оно является мягким, и его можно обработать возвратом в программный код с поиском ошибки.
HardFault - являться жёстким отказом системы, его можно обработать ручным способом, и даже найти место сбоя - но невозможно исправить в реальном времени.
Ну и всё скопом по порядку:
Reset_Handler - стартовый адрес прошивки
NMI_Handler - неизвестное прерывание Default_Handler, любое из неопределённых
HardFault_Handler - отказы: шины, арбитра памяти, сбой чтения вектора прерываний.
MemManage_Handler - ошибка доступа к памяти, срабатывание правил MPU
BusFault_Handler - чтение/запись по недопустимому адресу
UsageFault_Handler - прерывание специально для пользователя, можно оформить как критическую секцию
часть прерываний от старших ARM процессоров вырезана тупым ржавым скальпелем, ещё не успело зарубцеваться
SVC_Handler - крутое прерывание пользователя из разряда - пусть весь мир подождёт
DebugMon_Handler - запуск кода отладчика на ядре мк в момент контрольной точки, остановка ядра после кода - для считывания данных отладчиком
пусто
PendSV_Handler - типа удобная функция для переключения контекста, я так не думаю
SysTick_Handler - самый примитивный таймер во всей системе, он даже не полностью 32 бита.
/* External Interrupts */
WWDG_IRQHandler - сторожевая собака, гавкает когда перестают ходить строем