Как узнать, когда сброс микроконтроллера? - PullRequest
0 голосов
/ 18 февраля 2019

Я изучаю встроенные системы на процессоре ARM9 (SAM9G20).Я больше знаком с процедурным программированием для общего назначения.Таким образом, то, что я делаю, проходит через лист данных и изучает, какие существуют регистры и как ими манипулировать.

У меня вопрос, как узнать, когда компьютер перезагрузится?Я знаю, что есть Reset Controller, который управляет сбросами.Регистр, называемый Регистром состояния (RSTC_SR), хранит источник сброса.Нужно ли периодически читать этот регистр?

Мое решение состоит в том, чтобы сохранить количество сбросов в FRAM (или начать с установки его в 0), после сброса я сравниваю эту переменную со значением регистра в моей основной функции.Если значение регистра выше, то, очевидно, оно сбрасывается.Однако я уверен, что есть более оптимизированный способ (возможно, с использованием прерываний).Или так обычно делают?

Ответы [ 4 ]

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

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

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

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

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

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

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

Просто добавьте проверки в код запуска, то есть в начале main(), так какнеобходимо.Если вы хотите выяснить, например, как часто вы сбрасываете данные, то это сложнее, поскольку обычно (без опыта работы с SAMs, я парень типа STM32) встроенные таймеры и т. Д. Также сбрасываются.Лучше всего будет использовать какие-то часы, независимые от реального мира, например, RTC, который вы можете опрашивать и сохранять значение.Пожалуйста, подумайте, действительно ли вам это нужно.

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

Способ сделать это - запустить код в режиме отладки (если у вас есть отладчик для SAM).После сброса счетчик программ (ПК) указывает на адрес, с которого начинается ваш код.

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

Простое решение заключается в использовании структуры вашего кода.Многие базы кода для встраиваемых систем имеют следующую форму:

int main(void)
{
  // setup stuff here
  while (1)
  {
    // handle stuff here
  }
  return 0;
}

Вы можете использовать этот код выше while(1) при запуске только один раз.Вы можете увеличить счетчик и сохранить его в энергонезависимой памяти.Это скажет вам, сколько раз микроконтроллер сбросил.

Другой пример - на Arduino, где код структурирован так, что функция с именем setup() вызывается один раз, а функция с именем loop() вызываетсянепрерывно.С этой структурой вы можете увеличивать переменную в setup() -функции для достижения того же эффекта.

...