Цитата(dimka76 @ Sep 14 2018, 20:37)

У меня план такой. При попадании в исключительную ситуацию перевести некоторые ноги МК в определенное состояние.
И после этого зависнуть в этом прерывании навсегда.
А вот для управления нужными ногами у меня есть свои функции.
Выполняете CPSID I, CPSID F и после этого спокойно вызываете свои функции и зависаете. Только эти "свои функции" должны быть
реентерабельны.
Цитата(aaarrr @ Sep 14 2018, 21:58)

Честно говоря, не знаю семейств, где бы сброс обнулял содержимое ОЗУ. Хотя вполне допускаю, что и такое встречается.
Не обнуляется, но затирается часть - у многих.
Цитата(dimka76 @ Sep 14 2018, 22:52)

Тема не как реализовывать обработчик исключений, а насколько безопасно просто так из него вызывать функции ))))
Сам вызов безопасен. А почему он должен быть не безопасен?
Только функция обязательно должна быть реентерабельной. Так как исключение может произойти в любой точке программы.
Цитата(dimka76 @ Sep 14 2018, 22:45)

По-моему проще в обработчике исключения
Код
__set_MSP(TOP_RAM_ADDR);
А вот так делать - как раз не безопасно. Если уж и переустанавливать указатель стека, то на вершину существующего выделенного статически стека.
Цитата(AlexandrY @ Sep 15 2018, 07:24)

Периферия после сбоя может быть в отключенном из адресного пространства состоянии.
Это на каком-же из МК (соответствующих заголовку темы) такое делается?

Цитата(Forger @ Sep 14 2018, 23:29)

Вот есть мысля: при исключении писать в определенную область ОЗУ отладочную информацию, делать программный сброс (в STM32 типа NVIC Reset), а в коде при старте каждый раз проверять содержимое этой области.
Отличить полезную инфу от мусора в ОЗУ можно с помощью примитивных "маркеров" или элементарной контрольной суммы. Разумеется, эти данные нужно объявлять с соотв. квалификаторами или в соотв. не стираемой при старте секции.
Лучше использовать соответствующий периферийный регистр, где флажками указан тип сброса (POR, внешняя нога, WDT, программный, ...) и не возиться с флагами в ОЗУ, которые нужно ещё и правильно расположить.