Как я могу сохранить некоторые данные до аппаратного сброса микроконтроллера? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над одним из микроконтроллеров Freesacle.Этот микроконтроллер имеет несколько источников сброса (например, сброс монитора часов, сброс сторожевого таймера и ...).Предположим, что из-за сторожевого таймера мой микроконтроллер сброшенКак я могу сохранить некоторые данные непосредственно перед сбросом.Я имею в виду, например, как я могу понять, где был программный счетчик перед сбросом сторожевого таймера.С помощью этого метода я хочу знать, где у меня ошибка (другими словами, длинный процесс), которая вызывает сброс сторожевого таймера.

Ответы [ 6 ]

0 голосов
/ 06 февраля 2019

Единственное надежное решение - использовать отладчик с возможностью трассировки, если ваша микросхема поддерживает встроенную трассировку команд.

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

Однако в некоторых случаях ни одно из решений не являетсянадежный метод достижения вашей цели.В многозадачной среде или системе с обработчиками прерываний код, выполняемый по истечении времени ожидания сторожевого таймера, может не являться процессом, вызывающим проблему.

0 голосов
/ 06 февраля 2019

Большинство микроконтроллеров Freescale работают следующим образом:

  • ОЗУ сохраняется после сброса сторожевого таймера.Но, вероятно, не после сброса LVD и, конечно, не после сброса при включении питания.В большинстве случаев это полностью недокументировано.
  • У MCU либо будет регистр состояния, в котором вы можете проверить причину сброса (например, HCS08, MPC5x, Kinetis), либо у него будут специальные векторы сброса для различных причин сброса.(например, HC11, HCS12, Coldfire).

Невозможно сохранить что-либо после сброса.Сброс происходит, и только после этого вы можете узнать, что послужило причиной сброса.

Однако можно зарезервировать часть оперативной памяти как специальный сегмент.После сброса при включении питания вы можете инициализировать этот сегмент, установив все в ноль.Если вы получите сброс сторожевого таймера, вы можете предположить, что этот сегмент ОЗУ все еще действителен и не поврежден.Таким образом, вы не инициализируете это, но оставляете это как есть.Этот метод позволяет сохранять значения переменных при сбросе. Вероятно, - это плохо документировано для большинства семейств MCU.Я использовал этот трюк по крайней мере на HCS08, HCS12 и MPC56.

Что касается счетчика программ, вам не повезло.Это сбрасывается без средств, чтобы восстановить его.Это означает, что единственный способ выяснить, где произошел сброс сторожевого таймера, - это утомительный способ старой школы постепенно перемещать точку останова в коде, запустить программу и проверить, достигла ли она точки останова.

Хотя в этом случаесовременных MCU, таких как MPC56 или Cortex M, вы просто проверяете буфер трассировки и видите, какой код вызвал сброс.Вы не только получаете ПК, но и видите исходный код языка Си.Но для этого вам может понадобиться профессиональная цепочка инструментов без Eclipse.

0 голосов
/ 06 февраля 2019

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

Это зависит от того, что вы хотите сохранить после сброса, определенного поведения или данных?Энергозависимая память может или не может быть очищена после сторожевого таймера (см. Таблицу данных uC), и вы сможете обнаружить сброс после проверки регистров сброса (снова смотрите таблицу данных uC).Обнаружив сброс и проверив энергозависимую память, вы сможете подготовить свой ОК к перезагрузке так, как вы предпочитаете после маловероятного события сброса.Вы можете создать глобальное значение и установить для него определенное значение в глобальной области видимости, а затем, если оно сбрасывается, сравнить его с ним при возникновении события сброса - если оно совпадает, можно предположить, что другая память также может быть такой же,Если энергозависимая память недоступна, вам необходимо взглянуть на таблицу данных об энергонезависимых параметрах, однако также рекомендуется не выполнять постоянную запись в энергонезависимую память из-за ограничений записи.

0 голосов
/ 06 февраля 2019

Две вещи:

  1. Написать журнал !И вращайте этот журнал, чтобы сохранить последние 30 минут.или в любое разумное количество времени, которое вы считаете необходимым для воспроизведения ошибки.Там, где журнал останавливается, вы можете увидеть, что произошло прямо перед этим.Даже в устройствах уровня производства есть некоторый уровень регистрации.
  2. (Меньше, практично) Вы можете подключить отладчик практически к каждому микроконтроллеру и выполнить код.Вероятно, установите точку останова, которая достигается непосредственно перед входом в критический раздел кода.Некоторые IDE / uC допускают наличие « точек прерывания данных », которые запускаются, когда определенные переменные содержат определенные значения.Отказ от ответственности: я не знаю, какой именно микроконтроллер вы используете.
0 голосов
/ 06 февраля 2019

В зависимости от вашего микроконтроллера вы можете получить Reset Reason, но получить предыдущий program counter (PC/IP) после сброса невозможно.

Большинство современных микроконтроллеров имеют возможность для Watchdog Interrupt вместо reset.Вы можете настроить сторожевое периферийное устройство для включения прерывания. В этом ISR вы можете проверить сохраненный контекст в стеке.(Вы можете получить помощь от отладчика JTAG для проверки стека вызовов).

Существует несколько методов отладки, если ваш микроконтроллер не поддерживает вышеуказанный метод.

Например, в простой архитектуре, основанной на while(1), вы можете использовать HW-таймер и перезапустить его после некоторого фрагмента кода.В Timer ISR вы будете знать, какая часть кода потребляет достаточно долго, чем таймер.

0 голосов
/ 06 февраля 2019

Это написано в вашем руководстве.

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

Вам необходимо опубликовать более конкретную информацию на вашем Freescale µC, чтобы получить правильный ответ.

...