|
|
|
Cortex-Mx, исключительные ситуации |
|
|
|
Sep 14 2018, 19:45
|
developer
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032
|
Цитата(scifi @ Sep 14 2018, 21:09) Предлагаю другой план. Устанавливаем некий флаг "перевести ноги и зависнуть", вызываем программный сброс. Программа при старте проверяет условие "сброс == программный && флаг == установлен". Ну и при выполнении условия делает что надо. Так проще. По-моему проще в обработчике исключения Код __set_MSP(TOP_RAM_ADDR); Дальше дернуть ногой через функцию - она уже есть и активно используется в разных местах колда. И зависнуть.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 14 2018, 20:29
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(aaarrr @ Sep 14 2018, 22:52) чем людей экзотикой пугать. Ну, какой был вопрос, такой же и вышел ответ Экзотика - это нужда в бытовых МК в обнулении содержимого ОЗУ после сброса. Вот есть мысля: при исключении писать в определенную область ОЗУ отладочную информацию, делать программный сброс (в STM32 типа NVIC Reset), а в коде при старте каждый раз проверять содержимое этой области. Отличить полезную инфу от мусора в ОЗУ можно с помощью примитивных "маркеров" или элементарной контрольной суммы. Разумеется, эти данные нужно объявлять с соотв. квалификаторами или в соотв. не стираемой при старте секции. Если есть "чё", то писать это уже в реальный энергонезависимый журнал (на флэшку, sd-карточкуи т.п.) и жить дальше до очередного HF ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 15 2018, 04:24
|
Ally
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050
|
Цитата(dimka76 @ Sep 14 2018, 22:52) Тема не как реализовывать обработчик исключений, а насколько безопасно просто так из него вызывать функции )))) Периферия после сбоя может быть в отключенном из адресного пространства состоянии. Обычными "функциями" я бы пользоваться не рисковал. Некоторые прерывания, например от WDOG, в принципе вам дают всего сотню тактов до сброса. Поэтому только прямое обращение к регистрам. Кстати, сбой и последующий reset может привести и к переходу на код в Bootloader-е, тогда и на RAM надеяться нельзя. Практичней думать о таких ситуациях учитывая бутлодер. А он может быть и в ROM-е и даже не документирован.
|
|
|
|
|
Sep 15 2018, 05:18
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(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, программный, ...) и не возиться с флагами в ОЗУ, которые нужно ещё и правильно расположить.
|
|
|
|
|
Sep 16 2018, 16:38
|
developer
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032
|
Цитата(jcxz @ Sep 15 2018, 08:18) Сам вызов безопасен. А почему он должен быть не безопасен? Например, как писали выше, вот поэтому Цитата(Forger @ Sep 14 2018, 20:19) Если такое исключение возникло именно из-за проблем со стеком, то логично предположить, что сразу пользоваться стеком не стоит (точнее, таким указателем стека). Цитата(jcxz @ Sep 15 2018, 08:18) Выполняете CPSID I, CPSID F и после этого спокойно вызываете свои функции и зависаете Я так понимаю это команды запрещения прерываний и исключительных ситуаций. А зачем они в обработчике исключений ? Их же и так никто прервать не может. Цитата(jcxz @ Sep 15 2018, 08:18) Только функция обязательно должна быть реентерабельной. Мои функции дергания норкой таковыми и являются. Просто запись в регистр порта ввода вывода. Цитата(jcxz @ Sep 15 2018, 08:18) Если уж и переустанавливать указатель стека, то на вершину существующего выделенного статически стека. Я в своем сообщении это и имел ввиду, просто наверное некорректно изъяснился.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 17 2018, 06:25
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(dimka76 @ Sep 16 2018, 19:38) Например, как писали выше, вот поэтому В Cortex-M при вызове функции стек не используется. Внутри функции он конечно может быть использован, но только если она вызывает другие функции или имеет много локальных переменных. Но Вы пишете, что внутри только - дёргание ногой. Тогда - о каком стеке вообще речь? Цитата(dimka76 @ Sep 16 2018, 19:38) Я так понимаю это команды запрещения прерываний и исключительных ситуаций. А зачем они в обработчике исключений ? Их же и так никто прервать не может. Это - запрет и разрешение прерываний. Не могут прервать только исключения с приоритетом ниже. Цитата(dimka76 @ Sep 16 2018, 19:38) Мои функции дергания норкой таковыми и являются. Просто запись в регистр порта ввода вывода. А если это исключение произошло до того как сконфигурили ногу (которой хотите дёрнуть) на вывод? Просто повиснете навсегда?
|
|
|
|
|
Sep 18 2018, 19:13
|
developer
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032
|
Цитата(jcxz @ Sep 17 2018, 09:25) А если это исключение произошло до того как сконфигурили ногу (которой хотите дёрнуть) на вывод? Просто повиснете навсегда? Это ножка включает/выключает внешнее устройство. Если ножка не сконфигурирована, то устройство выключено. А в обработчике исключения я хочу это внешнее устройство выключать. Значит все нормально будет ))) В принципе, я получил ответ на свои вопросы. Все откликнувшимся спасибо !!!
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|