Перейти к содержанию
    

ОЗУ бывают разные, в том числе внешние

Будьте любезны, дайте ссылочку на внешнее ОЗУ с сигналом сброса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Будьте любезны, дайте ссылочку на внешнее ОЗУ с сигналом сброса.

https://www.maximintegrated.com/en/products...cts/DS1200.html

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю другой план. Устанавливаем некий флаг "перевести ноги и зависнуть", вызываем программный сброс. Программа при старте проверяет условие "сброс == программный && флаг == установлен". Ну и при выполнении условия делает что надо. Так проще.

 

По-моему проще в обработчике исключения

__set_MSP(TOP_RAM_ADDR);

 

Дальше дернуть ногой через функцию - она уже есть и активно используется в разных местах колда.

И зависнуть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сказали бы тогда, что любая DDR3+ подходит под определение "внешнее ОЗУ с сигналом сброса", чем людей экзотикой пугать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вся эта тема - по сути баян,

 

Тема не как реализовывать обработчик исключений, а насколько безопасно просто так из него вызывать функции ))))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чем людей экзотикой пугать.

Ну, какой был вопрос, такой же и вышел ответ ;)

 

Экзотика - это нужда в бытовых МК в обнулении содержимого ОЗУ после сброса.

 

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

Отличить полезную инфу от мусора в ОЗУ можно с помощью примитивных "маркеров" или элементарной контрольной суммы. Разумеется, эти данные нужно объявлять с соотв. квалификаторами или в соотв. не стираемой при старте секции.

Если есть "чё", то писать это уже в реальный энергонезависимый журнал (на флэшку, sd-карточкуи т.п.) и жить дальше до очередного HF ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Много лет использую именно такой механизм. Хорошее, годное решение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема не как реализовывать обработчик исключений, а насколько безопасно просто так из него вызывать функции ))))

Периферия после сбоя может быть в отключенном из адресного пространства состоянии.

Обычными "функциями" я бы пользоваться не рисковал.

Некоторые прерывания, например от WDOG, в принципе вам дают всего сотню тактов до сброса.

Поэтому только прямое обращение к регистрам.

Кстати, сбой и последующий reset может привести и к переходу на код в Bootloader-е, тогда и на RAM надеяться нельзя.

Практичней думать о таких ситуациях учитывая бутлодер. А он может быть и в ROM-е и даже не документирован.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня план такой. При попадании в исключительную ситуацию перевести некоторые ноги МК в определенное состояние.

И после этого зависнуть в этом прерывании навсегда.

А вот для управления нужными ногами у меня есть свои функции.

Выполняете CPSID I, CPSID F и после этого спокойно вызываете свои функции и зависаете. Только эти "свои функции" должны быть реентерабельны.

 

Честно говоря, не знаю семейств, где бы сброс обнулял содержимое ОЗУ. Хотя вполне допускаю, что и такое встречается.

Не обнуляется, но затирается часть - у многих.

 

Тема не как реализовывать обработчик исключений, а насколько безопасно просто так из него вызывать функции ))))

Сам вызов безопасен. А почему он должен быть не безопасен?

Только функция обязательно должна быть реентерабельной. Так как исключение может произойти в любой точке программы.

 

По-моему проще в обработчике исключения

__set_MSP(TOP_RAM_ADDR);

А вот так делать - как раз не безопасно. Если уж и переустанавливать указатель стека, то на вершину существующего выделенного статически стека.

 

Периферия после сбоя может быть в отключенном из адресного пространства состоянии.

Это на каком-же из МК (соответствующих заголовку темы) такое делается? :wacko:

 

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

Отличить полезную инфу от мусора в ОЗУ можно с помощью примитивных "маркеров" или элементарной контрольной суммы. Разумеется, эти данные нужно объявлять с соотв. квалификаторами или в соотв. не стираемой при старте секции.

Лучше использовать соответствующий периферийный регистр, где флажками указан тип сброса (POR, внешняя нога, WDT, программный, ...) и не возиться с флагами в ОЗУ, которые нужно ещё и правильно расположить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

жирные вы тут.. скомпилировал с -fexception, получил 86К кода хелло ворд на О3, приуныл и забил

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше использовать соответствующий периферийный регистр, где флажками указан тип сброса (POR, внешняя нога, WDT, программный, ...) и не возиться с флагами в ОЗУ, которые нужно ещё и правильно расположить.

Аппаратные флажки-то - это само собой.

Но имелось ввиду проверять валидность (актуальность) самих данных, дабы не спутать их с мусором в ОЗУ и не записать это мусор в журнал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам вызов безопасен. А почему он должен быть не безопасен?

Например, как писали выше, вот поэтому

 

Если такое исключение возникло именно из-за проблем со стеком, то логично предположить, что сразу пользоваться стеком не стоит (точнее, таким указателем стека).

 

Выполняете CPSID I, CPSID F и после этого спокойно вызываете свои функции и зависаете

Я так понимаю это команды запрещения прерываний и исключительных ситуаций.

А зачем они в обработчике исключений ?

Их же и так никто прервать не может.

 

Только функция обязательно должна быть реентерабельной.

Мои функции дергания норкой таковыми и являются. Просто запись в регистр порта ввода вывода.

 

Если уж и переустанавливать указатель стека, то на вершину существующего выделенного статически стека.

Я в своем сообщении это и имел ввиду, просто наверное некорректно изъяснился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например, как писали выше, вот поэтому

В Cortex-M при вызове функции стек не используется. Внутри функции он конечно может быть использован, но только если она вызывает другие функции или имеет много локальных переменных. Но Вы пишете, что внутри только - дёргание ногой. Тогда - о каком стеке вообще речь?

 

Я так понимаю это команды запрещения прерываний и исключительных ситуаций.

А зачем они в обработчике исключений ?

Их же и так никто прервать не может.

Это - запрет и разрешение прерываний. Не могут прервать только исключения с приоритетом ниже.

 

Мои функции дергания норкой таковыми и являются. Просто запись в регистр порта ввода вывода.

А если это исключение произошло до того как сконфигурили ногу (которой хотите дёрнуть) на вывод? Просто повиснете навсегда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если это исключение произошло до того как сконфигурили ногу (которой хотите дёрнуть) на вывод? Просто повиснете навсегда?

 

Это ножка включает/выключает внешнее устройство. Если ножка не сконфигурирована, то устройство выключено. А в обработчике исключения я хочу это внешнее устройство выключать. Значит все нормально будет )))

 

В принципе, я получил ответ на свои вопросы.

Все откликнувшимся спасибо !!!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Cortex-M при вызове функции стек не используется.

а как он вызовет он передаст ,к примеру 35 аргументов в нее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...