Универсальный внешний накопитель для всех iOS-устройств, совместим с PC/Mac, Android
Header Banner
8 800 100 5771 | +7 495 540 4266
c 9:00 до 24:00 пн-пт | c 10:00 до 18:00 сб
0 Comments

Содержание

Сторожевой таймер в микроконтроллерах PIC

Описание watchdog – таймера в микроконтроллерах PIC. Принцип работы. Сторожевой таймер представляет собой комбинацию встроенного RC‑генератора и счетчика, при переполнении которого формируется сброс процессора. Встроенный генератор не требует внешних цепей и работает даже когда тактовый генератор процессора остановлен в режиме Sleep. Между генератором и счетчиком может быть включен предделитель, параметры которого задаются битами регистра OPTION_REG.

Время выдержки сторожевого таймера зависит от температуры, напряжения питания и коэффициента деления предделителя. С подключенным предделителем и максимальным коэффициентом делении 1:128 выдержка может достигнуть 2,5 сек. Номинальная выдержка без предделителя составляет около 18 мc.

Когда срабатывает сторожевой таймер, он не переводит вывод МCLR в низкий уровень. Сброс осуществляется только по внутренним цепям микроконтроллера.

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

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

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

Команды CLRWDT и SЕЕЕР обнуляют счетчик сторожевого таймера и счетчик предделителя, если он подключен к сторожевому таймеру.

Таким образом предотвращается сброс процессора и начинается формирование нового временного интервала.

Сторожевой таймер также может вывести процессор из режима SLEEP. При этом произойдет не сброс, а продолжение нормального исполнения программы.

Работа сторожевого таймера может быть разрешена или запрещена только при помощи программатора, установкой или сбросом бита конфигурации WDTE.

Портирование приложений с PIC18 на PIC24F. 1. 9. Сторожевой таймер

1.9. Сторожевой таймер (WDT)

Реализация сторожевого таймера в PIC24F очень похожа на реализацию WDT в семействе PIC18. И в PIC18 и в PIC24F работа сторожевого таймера и его период задаются в слове конфигурации; реализуется выход из энергосберегающих режимов по переполнению сторожевого таймера; период и разрешение работы могут конфигурироваться программно.

Однако сторожевой таймер PIC24F имеет дополнительные функции, такие как конфигурируемый предделитель и оконный режим сброса. Отличия реализации сторожевого таймера в семействах PIC18 и PIC24F приведены в табл. 17.

Таблица 17. Основные отличия реализации сторожевого таймера в семействах PIC18 и PIC24

Функция

PIC18

PIC24F

Конфигурируемый период

да

да

Программное разрешение работы

да

да

Выход из энергосберегающих режимов по переполнению WDT

да

да

Диапазон длительностей периода

1 мс – 131 сек

1 мс – 131 сек

Предделитель

нет

да

Функция оконного сброса

нет

да

1.

9.1. Общие особенности для PIC18 и PIC24F

Работа сторожевого таймера в семействах PIС18 и PIC24F может быть разрешена в слове конфигурации прибора. Для PIC24F сторожевой таймер включается / выключается битом FWDTEN (CW1<7>). Период сторожевого таймера устанавливается битами WDTPS<3:0> (CW1<4:0>) и может варьироваться от 1 мс до 131 сек. Дискретность установки периода одинакова для PIC18 и PIC24, а точность периода зависит от точности внутреннего низкочастотного RC генератора (32 кГц). При разрешении работы WDT внутренний низкочастотный RC генератор включается автоматически.

Выход из энергосберегающих режимов SLEEP и IDLE может осуществляться при переполнении сторожевого таймера. Если переполнение WDT произошло в одном из этих режимов, выполнение продолжается с инструкции, следующей за инструкцией перехода в энергосберегающий режим. Работа сторожевого таймера может быть разрешена программно установкой бита SWDTEN (RCON<5>), если она запрещена в слове конфигурации.

В обоих семействах сторожевой таймер сбрасывается при выполнении микроконтроллером следующих инструкций:

· CLRWDT

· переход в энергосберегающий режим

· изменение частоты внутреннего RC генератора

1.9.2. Новые особенности сторожевого таймера семейства PIC24F

Сторожевой таймер семейства PIC24F имеет предделитель, коэффициент которого (1:128 или 1:32) устанавливается битом в слове конфигурации FWPSA (CW1<4>). Для того чтобы диапазон периодов WDT соответствовал реализации сторожевого таймера в PIC18 необходимо установить бит FWPSA, выбрав коэффициент предделителя 1:128.

Функция оконного сброса (windowed WDT) разрешается битом WINDIS в конфигурационном слове. Если функция разрешена, сброс сторожевого таймера можно проводить только в последнюю четверть его периода. Сброс с любой другой момент времени вызовет сброс микроконтроллера.

1.9.3. Портирование типового приложения

Работа WDT в семействе PIC24F разрешается установкой бита FWDTEN в конфигурационном слове, либо программно установкой бита SWDTEN в регистре RCON. Период таймера выбирается записью необходимого значения в биты конфигурации WDTPS<3:0>. Коэффициент предделителя необходимо установить равным 1:128, записью ‘1’ в бит конфигурации FWPSA. Сторожевой таймер в архитектуре PIC24F может использоваться таким же образом, как и в PIC18 – для выхода из энергосберегающих режимов, отслеживания недопустимого изменения счетчика команд или случайного зацикливания программы.

1.9.4. Рекомендации по портированию приложения

Сторожевой таймер PIC24F будет сброшен при любом изменении источника тактирования, например при срабатывании функции отслеживания сбоя источника тактирования (Fail-Safe Clock Monitor) или при программном изменении тактового генератора. В семействе PIC18 сброс сторожевого таймера происходит при изменении частоты внутреннего RC генератора (см. п. 1.9.1 «Общие особенности PIC18 и PIC24F»).

При переполнении сторожевого таймера в семействе PIC18 сбрасывается бит /TO (RCON<3>) а в семействе PIC24F устанавливается бит WDTO (RCON<4>). При сбросе по включению напряжения питания (POR) и снижению напряжения питания (BOR) состояние этих битов не определено. Они должны быть корректно инициализированы для дальнейшего определения таймаута по переполнению WDT.

Сторожевой таймер для отказоустойчивых систем

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


Потребность в отказоустойчивых системах

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

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

Причины системных сбоев

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

С увеличением системной тактовой частоты, применением все более высокоскоростных последовательных интерфейсов и уменьшением шага выводов корпусов микросхем влияние ЭМП становится все более заметным. Космическое излучение может вызывать случайные переключения состояния ячеек памяти, а ЭМП и помехи ИП могут приводить к считыванию и записи в память или регистры неправильных данных.
Когда происходит такая потеря данных, выполнение программы нарушается, т.к. состояние, например, программного счетчика может быть изменено. Модификация памяти программ или чтение некорректных данных из их памяти может привести к выполнению совершенно непредсказуемых команд. Подобный сбой может быть также результатом разработки некорректной программы.
Вместе с проведением повторных измерений для восстановления потерянных данных в системе необходимо применять системный монитор, который может детектировать сбои и предпринимать необходимые действия для перевода в безопасное/известное состояние с минимальной задержкой. Монитор должен быть устойчив к программным сбоям.

Системный монитор — сторожевой таймер

В настоящее время роль системного монитора во встраиваемых системах выполняет специальная логическая схема, называемая сторожевой схемой или сторожевым таймером. Таймер регулярно принимает некоторый системный сигнал «все хорошо». Этот сигнал выполняет функцию восстановления (сброса) сторожевого таймера и может быть реализован в разных формах: например, в виде записи центральным процессором (ЦП) определенного кода в регистр сторожевого таймера или в виде выполнения ЦП специальной команды. Если по истечении определенного времени такой сигнал не поступал, сторожевой таймер генерирует сигнал системного сброса. Минимальная частота, с которой происходит восстановление сторожевого таймера, определяется установленной величиной интервала ожидания. На рисунке 1 представлена базовая концепция сторожевого таймера.

Рис. 1. Концепция сторожевого таймера

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

Проектирование отказоустойчивого сторожевого таймера

При разработке надежной схемы сторожевого таймера следует учитывать следующие рекомендации.
– Разрядность сторожевого таймера должна обеспечивать полный диапазон интервалов ожидания для всех источников тактового сигнала в системе.
– Сторожевой таймер должен работать от отдельного источника тактовой частоты. Желательно, чтобы был использован специальный источник тактовой частоты для сторожевого таймера, например RC-генератор. Это означает, что если даже по каким-либо причинам источник системной тактовой частоты выйдет из строя и система зависнет, сторожевой таймер сможет продолжить работу и выполнить сброс.
– Метод, используемый для формирования сигнала о сбое системы, должен быть отказоустойчивым.
– Критически важные биты регистров управления и конфигурации сторожевого таймера должны быть защищены от случайной перезаписи.
– Метод восстановления сторожевого таймера должен быть таким, чтобы вероятность случайного восстановления при сбое программы была минимальной.
– Реакция сторожевого таймера на обнаружение сбоя программы должна быть быстрой. Если сторожевой таймер потратит слишком много времени на восстановление системы, то возможны серьезные последствия, особенно в критичных с точки зрения безопасности приложениях.
– Работоспособность сторожевого таймера должна быть доступна для проверки, а тестирование не должно занимать много времени.
– Сторожевой таймер должен облегчать диагностику программного сбоя.
На основе указанных выше принципов была спроектирована схема сторожевого таймера повышенной надежности (СТПН), которая отличается от существующих схем следующими усовершенствованиями:
– улучшенный механизм восстановления;
– синхронизированный по времени доступ к регистрам управления и конфигурации с помощью паролей;
– обнаружение «следов» сбоя программы до запуска интервала ожидания;
– более быстрая и в то же время надежная реакция таймера;
– быстрая проверка сторожевого таймера.

Разрядность сторожевого таймера

При проектировании схемы сторожевого таймера необходимо корректно выбрать его разрядность.
Например, для формирования интервалов задержки в диапазоне 1 мс…1 с необходимо учитывать то обстоятельство, что частота источника тактового сигнала для сторожевого таймера может изменяться в широком диапазоне от нескольких кГц (например, RTC-генератор) до сотен МГц (системная тактовая частота). На рисунке 2 показаны значения времени ожидания для 8-, 16-, 24- и 32-разрядных таймеров при различных тактовых частотах. Вертикальная зеленая полоса отмечает диапазон времени ожидания 1 мс…1 с. Как видно из рисунка, для того, чтобы охватить все значения тактовой частоты и расчетный диапазон времени ожидания сторожевого таймера, необходимо использовать 32-разрядный счетчик.

Рис. 2. Возможные значения времени ожидания таймера (логарифмическая шкала)

Независимый источник тактовой частоты

В СТПН имеются два входа тактового сигнала, один из которых подключен к специальному источнику тактовой частоты, например, к встроенному в микросхему RC-генератору. Другим источником тактового сигнала может быть системная тактовая частота. Для приложений, некритичных с точки зрения безопасности, разработчик системы может вместо специального источника тактового сигнала использовать системную тактовую частоту.

Защита от случайной записи

В общем случае в сторожевом таймере предусмотрено несколько битов в регистре управления и конфигурирования, которые используются для настройки, например для разрешения его работы. Так как эти биты непосредственно управляют работой сторожевого таймера, очень важно быть уверенным, что они не будут изменены. Для этого применяют специальную схему защиты от случайной записи. Одним из лучших способов защиты является использование паролей при записи управляющих битов. При этом пароль представляет собой последовательность двух специальных кодов. Обычно между записью двух кодов допускается любой промежуток времени, что означает высокую вероятность повтора пароля в случае сбоя программы.
В схеме СТПН предусмотрено ограничение по интервалу времени между операциями записи двух кодов, что при сбое программы уменьшает вероятность модификации содержимого регистров и отключения сторожевого таймера. Когда время записи ограничено (оно равно времени вызова и выполнения цент­ральным процессором команды записи второго кода пароля), пользователь должен размещать команды записи двух кодов пароля сразу одну за другой. В этом случае при сбое программы после записи первого кода пароля не останется времени для повтора команды записи. Это позволяет выполнить запись второго кода пароля и минимизирует вероятность того, что в результате сбоя последовательность двух кодов будет повторена.
Если интервал между двумя словами пароля превышает несколько циклов тактовой частоты системной шины, сторожевой таймер решает, что произошел сбой и выполняет сброс системы. Время нахождения регистров в разблокированном состоянии также ограничено и приблизительно равно времени однократного конфигурирования регистров, после чего они блокируются снова.

Уникальная схема восстановления

Существуют различные типы механизмов восстановления — простая запись определенного кода (скажем, 0x35), выполнение специальной команды восстановления из набора команд процессора или запись последовательности двух кодов в определенном порядке (например, 0xAA после 0x55). Схема восстановления, использованная для СТПН, представляет собой последовательность двух кодов, но в отличие от существующих схем, в ней установлено предельное время между записью двух чисел. Если записано первое число последовательности и за ним в течение определенного количества циклов системной тактовой частоты не следует записи второго числа, то сторожевой таймер делает заключение о наличии сбоя и производит сброс системы.
Такой подход аналогичен тому, который применяется для описанной выше схемы защиты от случайной записи с помощью паролей. Ограничение интервала времени между записью двух кодов позволяет предотвратить ситуацию, при которой происходит сбой программы и случайное восстановление сторожевого таймера, что затрудняет сброс системы. Кроме того, специальные меры были предприняты для исключения вероятности выбора в качестве кодов последовательности чисел 0x55 и 0xAA, которые обычно используются в тестах записи-чтения памяти. Такие тесты иногда являются частью загрузочного кода, что означает многократное повторение этих чисел в программе.

Оконный режим восстановления

Схема СТПН имеет режим оконного восстановления, что является стандартным для большинства существующих систем. Принцип оконного восстановления заключается в том, что сторожевой таймер может быть восстановлен только в определенном интервале (или окне) времени. В схеме СТПН это временное окно совпадает с интервалом времени ожидания таймера. Если восстановление происходит вне этого окна, это говорит о том, что код программы выполняется быстрее, чем ожидается, и, значит, программа работает в нештатном режиме. Рисунок 3 иллюстрирует концепцию оконного восстановления.

Рис. 3. Оконный режим восстановления

Быстрая реакция на программный сбой

Как уже было сказано выше, необходимо, чтобы реакция сторожевого таймера на сбой программы была быстрой. Программный сбой — это состояние, когда действия системы не детерминированы, поэтому из него необходимо выйти как можно быстрее. В схеме СТПН для уменьшения времени реакции сторожевого таймера применен упреждающий метод.
Если сбой программы в обычных системах произошел в начале периода ожидания сторожевого таймера, то до того, как будут предприняты соответствующие действия по сбросу системы, может пройти слишком много времени. В некоторых приложениях задержка может составлять до 1 с. СТПН заранее распознает признаки сбоя кода и производит сброс системы немедленно. Признаками сбоя кода могут быть следующие факторы.
– Наличие неизвестных кодов в регистрах сторожевого таймера. Программный код пользователя содержит только команды записи определенных чисел в эти регистры, поэтому наличие других кодов в регистрах говорит о возможном сбое.
– Сбой команды записи в регистр конфигурации в короткий фиксированный промежуток времени после разблокирования регистра.
– Сбой команды записи, по крайней мере, в один регистр конфигурации в короткий фиксированный промежуток времени после восстановления системы. После системного сброса пользователь должен как можно скорее сконфигурировать регистры сторожевого таймера.
Во время ожидания сторожевого таймера логика, формирующая сигнал системного сброса, синхронизируется от быстрого системного тактового сигнала (частотой от десятков до сотен МГц), а не от медленного тактового сигнала сторожевого таймера (частотой от нескольких кГц до нескольких МГц). Если сигнал сброса начнет формироваться от медленного тактового сигнала, например частотой 1 кГц, то для восстановления системы уже после периода ожидания потребуется почти 1 мс. За такой длительный промежуток времени программный сбой может вызвать хаос в системе. Опасность генерирования сигнала сброса от системного тактового сигнала заключается в том, что в случае отказа источника системной частоты время ожидания сторожевого таймера будет неопределенным. Чтобы исключить такую ситуацию, в СТПН предусмотрена резервная цепь, которая после дополнительного второго периода ожидания сторожевого таймера передает сигнал системного сброса, как показано на рисунке 4.

Рис. 4. Логика формирования сигнала сброса

Быстрая проверка сторожевого таймера

Стандарты по безопасности, такие как IEC 60730, требуют, чтобы все системы, управляющие функциями, связанными с обеспечением безопасности, были протестированы, причем эти тесты должны быть устойчивы к отказам. Для большинства существующих сторожевых таймеров проводится простой тест на переполнение. Для 32-разрядного таймера, работающего на частоте 1 кГц, тест на переполнение занимает примерно 4 · 106 с, что недопустимо много. При тестировании СТПН производится его разделение на звенья длиной один байт, проверка которых осуществляется независимо друг от друга. На рисунке 5 показана блок-схема, поясняющая концепцию «разделения». На этом рисунке изображен процесс тестирования 3-го звена (байта) таймера.

Рис. 5. Блок-схема тестирования сторожевого таймера с разделением на звенья

Каждое звено таймера представляет собой 8-разрядный синхронный счетчик и комбинационную логику, которая формирует сигнал переполнения. Сигнал переполнения действует как сигнал разрешения для N + 1-го звена. В тестовом режиме выбирается отдельный байт, например байт N, затем в байты с 0-го по N – 1-й загружается число 0xFF. Звено N – 1 сразу же формирует сигнал переполнения, который разрешает работу звена N. В процессе работы звена N происходит сравнение с байтом N регистра значения времени ожидания. Таким путем тестируется звено N, а также все связи между звеньями таймера. При тестировании байта N все другие звенья — N – 2, N – 3, N + 1 и N + 2 — заблокированы. Эти заблокированные звенья (за исключением самого старшего звена счетчика) загружены кодом 0xFF. При тактовой частоте 1 кГц последовательное тестирование каждого звена заняло бы 4 × 256 мс (~103 мс) для 32-разрядного значения интервала ожидания, установленного на 1 с, т.е. 0xFFFFFFFF. Фактическое время тестирования будет зависеть от установленного значения времени ожидания.

Подсчет числа сбросов сторожевого таймера

СТПН хранит также количество сгенерированных системных сбросов. Это число доступно программе из специального регистра, который сбрасывается только при включении питания. Когда это число достигает определенного порогового значения, система выполняет некоторые действия помимо обычной реакции на сброс сторожевого таймера.

Заключение

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

Литература

1. Need a watchdog for improved system fault tolerance?//commsdesign.com/showArticle.jhtml?articleID=211600055&pgno=1

Vanyamba uses Linux – Watchdog Timer Arduino. Прерывание и сброс

Сброс по Watchdog и загрузчик Arduino

Для использования режима сброса системы важно, чтобы было обеспечено следующее условие. Сразу после перезагрузки, прошивка должна проверить и сбросить бит WDRF в регистре MCUCSR.

Дело в том, что этот бит определяет состояние бита WDE, и сразу после сброса системы по срабатыванию сторожевого таймера, бит WDRF будет установлен. Если его не сбросить, то сторожевой таймер сработает ещё раз. И будет срабатывать в бесконечном цикле, пока не будет отключено питание.

Но если при программировании сторожевого таймера мы можем установить тайм-аут, который нам требуется, то сразу после сброса регистр WDTCSR будет обнулён, и предделитель таймера примет минимальное значение — 16 мс.

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

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

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

Иначе говоря прежде, чем использовать сторожевой таймер, потребуется проверить, как именно запрограммирован FUSE-бит WDTON, а также нужно будет скомпилировать и перепрошить загрузчик, с использованием ключа -DWATCHDOG_MODS. который прописывается в Makefile.

Сторожевой таймер

Когда мы говорили о таймерах, то упоминали так называемый «сторожевой» таймер (англ. watchdog). Для чего он нужен? Допустим, вы попытались обратиться в запрещённую или не существующую область памяти (при условии что MemManage_Fault() вы сами не разрешали) — сработает внутреннее прерывание и начнётся выполнение функции HardFault_Handler(), в которой по-умолчанию — вечный цикл. Другими словами устройство превратиться в кирпич и перестанет реагировать. Вы наверняка встречались с такой проблемой ранее, скажем, в телефоне. К тому же, вы сами могли допустить ошибку и попасть в вечный цикл случайно.

Единственный способ вывести устройство из такого состояния — отключить питание и включить его снова.

Have you tried turning it off and on again? // The IT Crowd

Для решения подобных ситуаций служит сторожевой таймер. Причём он может быть двух видов.

  • Independent watchdog (IWDG) — независимый сторожевой таймер. Программист устанавливает значение с которого таймер начинает считать вниз. Если счётчик доходит до нуля — он отправляет сигнал сброса. Для того что бы этого не происходило необходимо постоянно восстанавливать регистр со временем отсчёта. Таким образом, если наша программа зависла – устройство не превратиться в кирпич.
  • Windowed Watchdog (WWDG) — оконный сторожевой таймер. Работает аналогичным образом что и IWDG, однако кроме верхней границы (нуля), есть и нижняя. Если мы знаем минимальное время выполнения какой-то операции, то можем добавить условие — если счётчик восстановлен раньше срока, то вероятно что-то пошло не так и нужно послать сигнал сброса.

Если устройство было перезагружено из-за сторожевого таймера (например, из-за IWDG), то в специальном регистре RCC появится флаг.

Таймер IWDG тактируется от собственного источника — низкоскоростной RC-цепочки (LSI). Потому-то он и называется независимым — его работа никак не зависит от основной программы (тактирующего сигнала ядра). Однако, данный источник очень не стабилен по частоте (может плавать в пределах ±9% в зависимости от температуры), да и к тому же при заявленной частоте 40 кГц может иметь реальную в переделах от 30 до 60 кГц. Таймер WWDG берёт тактовый сигнал от шины APB1 с некоторым делителем. Мы рассмотрим работу только с независимым сторожевым таймером, применяя стандартную библиотеку периферии.

Таймер IWDG имеет 12 разрядов, т.е. максимальное значение счётчика — 212 - 1 = 0xFFF. Так же мы можем выставить предделитель для LSI от 4 до 256. Допустим что нам требуется перезагрузить устройство, если в течении 1,5 секунды оно не сбросила счётчик к первоначальному значению. Возьмём за частоту LSI — 40 кГц. Тогда при предделителе равном 256 частота работы таймера будет примерно 156 Гц. Значит, что бы подождать 1.5 секунды нужно 156 * 1,5 = 234 такта. Настроим IWDG.

Пример использования

Код можно найти на GitHub: CMSIS, SPL.


Назад | Оглавление | Дальше

Em1: Тайм-Аут Сторожевого Таймера - Сброс

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

Проблема:

У меня около 8 серверов, все работает freebsd 8.3 p3/p4. Этот файловый сервер работает со скоростью 300-400 мб/с.

Это уже второй раз. Кажется, что сетевая карта умирает. У меня есть две сетевые карты, и я могу добраться до сервера через частную сеть, и все работает нормально, только общая сеть полностью отключена. Я попытался перезапустить сетевые интерфейсы: /etc/rc. d/netif restart && service routing restart | ifconfig em1 down && ifconfig em1 вверх, но без успеха.

Я могу только вернуть соединение, если я перезагружу сервер.

Ниже представлен вывод dmesg.boot, в котором отображается информация о драйверах сетевых карт.

em0: <Intel(R) PRO/1000 Network Connection 7.3.2> port 0xf020-0xf03f mem 0xf7b00000-0xf7b1ffff,0xf7b25000-0xf7b25fff irq 20 at device 25.0 on pci0
em0: Using an MSI interrupt
em0: [FILTER]
em0: Ethernet address: 00:25:90:7a:8e:9f
ehci0: <EHCI (generic) USB 2.0 controller> mem 0xf7b24000-0xf7b243ff irq 16 at device 26.0 on pci0
em1: <Intel(R) PRO/1000 Network Connection 7.3.2> port 0xd000-0xd01f mem 0xf7900000-0xf791ffff,0xf7920000-0xf7923fff irq 16 at device 0.0 on pci3
em1: Using MSIX interrupts with 3 vectors
em1: [ITHREAD]
em1: [ITHREAD]
em1: [ITHREAD]
em1: Ethernet address: 00:25:90:7a:8e:9e

----------------------------

pciconf -lv
em1@pci0:3:0:0: class=0x020000 card=0x000015d9 chip=0x10d38086 rev=0x00 hdr=0x00
vendor = 'Intel Corporation'
device = 'Intel 82574L Gigabit Ethernet Controller (82574L)'
class = network
subclass = ethernet
em0@pci0:0:25:0: class=0x020000 card=0x150215d9 chip=0x15028086 rev=0x05 hdr=0x00
vendor = 'Intel Corporation'
class = network
subclass = ethernet

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

ADM6316BX30ARJZ-R7, Супервизор со сторожевым таймером, ручным сбросом и двухтактным выходом, Active Low Reset [SOT-23-5]

EU RoHS Compliant
ECCN (US) EAR99
Part Status Active
HTS 8542.39.00.01
Lead Shape Gull-wing
Package Width 1.6
Package Length 2.9
PCB changed 5
Package Height 1.15
Mounting Surface Mount
Number of Supervisors 1
Maximum Reset Active Time (ms) 40
Output Driver Active Low/Push-Pull
Minimum Reset Threshold Voltage (V) 2. 955
Typical Reset Threshold Voltage (V) 3
Maximum Reset Threshold Voltage (V) 3.045
Monitored Voltage (V) 1 to 5.5
Minimum Operating Supply Voltage (V) 1
Maximum Operating Supply Voltage (V) 5.5
Maximum Supply Current (uA) 20
Power Fail Detection No
Watchdog Timer Yes
Manual Reset Yes
Chip Enable Signals No
Battery Backup Switching No
Minimum Operating Temperature (°C) -40
Maximum Operating Temperature (°C) 85
Supplier Temperature Grade Industrial
Packaging Tape and Reel
Type Supply Voltage Supervisor
Pin Count 5
Supplier Package SOT-23
Standard Package Name SOT
Вес, г 0. 01

Watchdog Timer: что это такое?

В мире микроконтроллеров (MCU) иногда что-то идет не так. Если программа выходит из строя или заходит в бесконечный цикл, ей нужен способ проверить, все ли еще выполняется. В «старые времена» операционная система Windows иногда вылетала (возникала фатальная ошибка) и показывала так называемый «синий экран смерти» (BSoD), после которого она перезагружалась, чтобы предотвратить повреждение компьютера, например, запись поверх жизненно важных данных. загрузочный код или аналогичные опасные события.( BSoD в наши дни встречается гораздо реже.) Встроенные системы отличаются от настольных компьютеров тем, что редко бывает человек, который знает, как перезагрузить неисправное устройство.

Сторожевые таймеры (WDT) или сторожевые устройства - это схемы, внешние по отношению к процессору, которые могут обнаруживать и запускать сброс процессора (и / или другое событие), если это необходимо. MCU проверяет сторожевой таймер через заданный интервал, чтобы показать, что он все еще выполняет задание. Как бомба, сторожевой таймер настроен на обратный отсчет, и если он истечет, он сбрасывает MCU, сбрасывает программы и перезагружает MCU и, возможно, другие области в системе, которые работают в тандеме с MCU.Но пока MCU работает, он будет продолжать пинговать сторожевой таймер для сброса таймера. Лучше всего держать сторожевого пса внешним и недоступным для кода MCU. Сторожевой таймер может быть внешним компонентом в отдельном корпусе от интегральной схемы (ИС), в которой находится микроконтроллер (лучше всего), или сторожевой таймер может быть найден внутри ИС, но на другой схеме, чем микроконтроллер, однако WDT, который зависит от те же ресурсы, что и MCU, могут быть не очень хорошей идеей по очевидным причинам.

Рисунок 1: Этот компьютер WDT имеет 3 этапа последовательных WDT.Немного необычно для встроенных WDT, этот вложенный WDT дает системе до трех шансов сбросить WDT перед перезагрузкой компьютера. Первый WDT, если не сбросить его, может вызвать последствия, похожие на мягкую, а не на жесткую загрузку. (Источник: CC BY-SA 3.0,) Смартфоны

можно перезагружать с выключением и включением питания (обычно, когда вам нужно сделать срочный вызов), но как выключить MCU, который запускает круиз-контроль в вашем машина? Выключение автомобиля определенно приведет к перезагрузке контура круиз-контроля, но этот вариант, очевидно, небезопасен при высокой скорости.Что делать, если программа круиз-контроля зависает в режиме разгона? MCU, на котором запущена программа круиз-контроля, может потребоваться сторожевой таймер, который является своего рода внешней проверкой. Вы не можете ожидать, что что-то рискует потерять рассудок и думать о собственной безопасности. MCU не обязательно так часто теряют рассудок, по крайней мере, они не должны этого делать, но в критических системах нельзя быть уверенным, что что-то не произойдет. Возможно, что один космический луч может стереть один регистр во флэш-памяти, что вызовет переполнение стека и бесконечные циклы.Как только MCU сошёл с рельсов, проверки программного обеспечения, вероятно, будут проигнорированы, пропущены, перезаписаны или просто забыты, поскольку мошенническое событие может нанести огромный ущерб.

«Сторожевой пес» может показаться странным выбором слов, но в нем есть метафора. (Возможно, «бомба замедленного действия» было бы более точным описанием, но было бы не совсем правильно говорить о бомбах в вашей системе.) Акт сброса WDT был назван «пинком собаки». По словам Найла Мерфи (через Джека Гэнссла): «Если человек перестанет пинать собаку, собака воспользуется этим колебанием и укусит человека.Если вы слишком долго пинаете собаку, собака кусает вас, перезагружая MCU. Тем не менее, сторожевой таймер существует уже несколько десятилетий и по-прежнему является надежным методом обеспечения отказоустойчивости электроники. Однако WDT не обязательно являются последней линией защиты. Если сторожевой таймер откажет вместе с MCU (возможно, сгорит вся печатная плата), механические аппаратные сейфы отказа могут стать следующим шагом для обеспечения безопасности.

Использование безопасного сторожевого таймера микроконтроллера

Аннотация: Семейство защищенных микроконтроллеров (DS5000FP, DS5001FP, DS5002FP и связанные модули) объединяет внутренний сторожевой таймер для предотвращения ошибок выполнения кода. Сторожевой таймер использует кварцевый генератор высокой точности, который также используется микроконтроллером. Это устраняет необходимость в RC-генераторе, обеспечивая большую точность.

Обзор

Микроконтроллеры часто используются в суровых условиях, когда в сети много переходных процессов, электромагнитных помех (EMI) и электростатических разрядов (ESD). Повреждение программы, вызванное повреждением шины и электромагнитными разрядами, может привести к выполнению микропроцессором ошибочных инструкций.В таких средах сторожевой таймер является полезным периферийным устройством, которое может помочь обнаружить и сбросить микроконтроллер, который «вышел из-под контроля».

Сторожевой таймер - это простой таймер обратного отсчета, который используется для сброса микропроцессора через определенный интервал времени. В правильно работающей системе программное обеспечение периодически "ласкает" или перезапускает сторожевой таймер. После перезапуска сторожевой таймер начнет отсчитывать другой заранее заданный интервал. Если программное обеспечение или устройство работают некорректно, программное обеспечение не перезапустит сторожевой таймер до истечения времени ожидания.Когда таймер сторожевого таймера истечет, это вызовет сброс микроконтроллера. Если системное программное обеспечение было разработано правильно и не было аппаратного сбоя, сброс заставит систему снова работать правильно. Состояние сброса должно быть «безопасным». Например, было бы неразумно иметь состояние сброса считывателя карт с магнитной полосой, позволяющее записывать головку.

Многие системы были разработаны с использованием внешнего сторожевого таймера. Семейство Secure Microcontroller устраняет необходимость во внешних компонентах за счет включения внутреннего сторожевого таймера.Перемещая сторожевой таймер внутри микроконтроллера, количество устройств в системе уменьшается, повышая общую надежность системы. Сторожевой таймер может использовать преимущества высокоточного кварцевого генератора, используемого микроконтроллером, а не неточного RC-генератора, используемого большинством независимых сторожевых таймеров. Работа сторожевого таймера не зависит от микроконтроллера, если специально не адресована процедура доступа по времени. Вероятность того, что неконтролируемый микроконтроллер случайно отключит сторожевой таймер, составляет менее 1 из 7.2 × 10 16 . В этой заметке по применению описаны функции и использование сторожевого таймера Secure Microcontroller.

Общее использование сторожевого таймера

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

Независимо от того, насколько способным может быть сторожевой таймер, существуют определенные сбои, которые нельзя исправить с помощью сброса. Например, сторожевой таймер не может предотвратить или обнаружить повреждение памяти данных. Если повреждение данных не повлияет на выполнение программы или не будут приняты дополнительные меры, повреждение данных не вызовет тайм-аут сторожевого таймера. Конечно, программное обеспечение самодиагностики может быть написано таким образом, чтобы перезапуск сторожевого таймера зависел от проверки памяти данных. Хотя многие приложения реализуют такую ​​схему проверки данных, это выходит за рамки этого документа.

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

Размещение инструкций по перезапуску

В семействе защищенных микроконтроллеров сторожевой таймер управляется основными системными часами.Интервал тайм-аута установлен на уровне 122 800 машинных циклов (1 473 600 циклов внешней синхронизации). Когда истечет время ожидания, произойдет сброс. В таблице 1 показаны интервалы времени сброса, связанные с различными частотами кристалла.

Таблица 1. Интервалы тайм-аута сторожевого таймера

Тактовая частота Интервал ожидания
16,0000 МГц 92 мс
14,7456 МГц 100 мс
11.0592 МГц 133 мс
7,73280 МГц 191 мс
5.52960 МГц 266 мс
1,84320 МГц 800 мс

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

Часто системе необходимо знать, произошел ли сброс сторожевого таймера. Бит WTR (PCON.4) будет устанавливаться всякий раз, когда это происходит, и программное обеспечение может проверить это на раннем этапе последовательности сброса, если произошла системная ошибка. Если это так, система может решить перейти в «безопасный» режим и предупредить пользователя об ошибке.

Пример сброса сторожевого таймера

Ниже показана короткая программа, иллюстрирующая инициализацию и основные функции сторожевого таймера. Он иллюстрирует функцию временного доступа, которая предотвращает случайную модификацию битов управления сторожевым таймером. Операция доступа по времени - это последовательность шагов, которые должны выполняться вместе, последовательно; в противном случае доступ не удастся. В примере программы показан доступ по времени, используемый для перезапуска сторожевого таймера и включения его сброса. Дополнительные сведения о работе с синхронным доступом можно найти в Руководстве пользователя защищенного микроконтроллера.Биты сторожевого таймера, которые защищены процедурой синхронизированного доступа, - это биты включения сброса сторожевого таймера (EWT; PCON.2) и перезапуска сторожевого таймера (RWT; IP.7).
; Программа WD_RST.ASM
;
; Эта программа демонстрирует использование сторожевого таймера.
; При запуске программа считает, что порт 1 указывает на то, что устройство
; работает и периодически сбрасывает сторожевой таймер. После подсчета
; до 16, он перестает сбрасывать сторожевой таймер, имитируя системный сбой.;
; Программа начинает с проверки, установлен ли бит WTR. Если так, то
; сброс был вызван сторожевым таймером, и программа выполнит
; подпрограмму FAULT. Для порта 1 установлено значение F0h, чтобы указать на это состояние.
; Если бит WTR не установлен, сброс был вызван другим источником и
; выполнение должно продолжаться в обычном режиме. 
; ************************************
RWT EQU 0BFh; Сбросить бит сторожевого таймера
TA EQU 0C7h; Регистр временного доступа
PCON EQU 87h; Регистр управления питанием
ACC EQU 0E0h; Аккумулятор
P1 EQU 090h; Порт 1

       ORG 00h; сбросить вектор
       SJMP START

; ************************************
       ORG 080h; В этом примере программа начинается в 80h.START: MOV A, PCON; Если сброс был вызван тайм-аутом сторожевого таймера,
       JB ACC.4, НЕИСПРАВНОСТЬ; (Бит WTR = 1) выполнить подпрограмму отказа.

; *********************************
; Произошел нормальный сброс при включении питания. Начать последовательность инициализации.
       MOV P1, # 00h; Очистить P1, чтобы сигнализировать о начале программы.

; Последовательность инициализации сторожевого таймера
       MOV TA, # 0AAh; Сначала перезапустите сторожевой таймер
       МОВ ТА, # 055h; с использованием таймера
       SETB RWT; доступ.MOV TA, # 0AAh; Затем включите сброс сторожевого таймера
       МОВ ТА, # 055h; функция с использованием таймера
       ОРЛ ПКОН, # 04h; доступ. 

; *********************************
; Основной цикл программы. Это имитирует программу, которая работает
; правильно, а затем идет наперекосяк. После того, как программа досчитает до 16
; на Порте 1 будет пропущена функция сброса сторожевого таймера. Этот
; будет имитировать сбой и разрешить сброс сторожевого таймера.; *********************************
MAIN: MOV R1, # 0FFh; Создать цикл задержки. Это имитирует
LOOP1: MOV R2, # 0FFh; устройство на самом деле «что-то делает».

LOOP2: JB P1.4, SKIP_WD_RST; Мы прошли цикл 16 раз?

       MOV TA, # 0AAh; Сброс сторожевого таймера. В пользовательском приложении это
       МОВ ТА, # 055h; должны быть размещены в стратегических местах
       SETB RWT; где он будет выполняться периодически.SKIP_WD_RST:
       DJNZ R2, LOOP2
       JNZ R1, LOOP1

       INC P1; счетчик увеличения.
       SJMP MAIN; вернуться в основной цикл программы.
; ************************************
; Ошибка тайм-аута сторожевого таймера. Эта подпрограмма обычно имеет специальные
; процедуры, выполняемые в случае системной ошибки.  В этом примере
; он отключает сброс сторожевого таймера и устанавливает для порта 1 значение F0h для индикации неисправности.
; В реальном приложении эта процедура может либо устранить ошибку, либо
; перезапустите программное обеспечение или сообщите об ошибке и прекратите дальнейшую работу.; ************************************
НЕИСПРАВНОСТЬ: MOV P1, # 0F0h; сигнализировать об ошибке
       MOV TA, # 0AAh; Отключить сброс сторожевого таймера
       МОВ ТА, №55h; с использованием таймера
       ANL PCON, # 0FBh; доступ.
       SJMP $; Остановить дальнейшую работу.
 

Сводка

При разработке любого проекта, использующего сторожевой таймер в качестве монитора, необходимо учитывать ряд соображений. После определения периода тайм-аута необходимо проанализировать системное программное обеспечение, чтобы определить, где найти инструкции по перезапуску сторожевого таймера.Для эффективного проектирования количество перезапусков сторожевого таймера должно быть сведено к минимуму, и следует принять во внимание вероятность неправильного выполнения перезапуска. Как упоминалось ранее, некоторое системное программное обеспечение слишком запутанно или зависит от данных, чтобы гарантировать, что все пути потока программного обеспечения будут покрыты перезапуском сторожевого таймера. Это может диктовать необходимость использования программного обеспечения самодиагностики. Если существует ожидаемый механизм отказа, такой как периодический выброс электромагнитных помех или сбой источника питания, тайм-аут сторожевого таймера должен учитывать этот период.
©, Maxim Integrated Products, Inc.
Содержимое этой веб-страницы защищено законами об авторском праве США и других стран. Для запросов на копирование этого контента свяжитесь с нами.
ПРИЛОЖЕНИЕ 101:
ПРИМЕЧАНИЕ ПО ПРИМЕНЕНИЮ 101, AN101, AN 101, APP101, Appnote101, Appnote 101

maxim_web: en / products / microcontrollers, maxim_web: en / products / microcontrollers / secure, maxim_web: en / products / power / supervisors-Voltage-monitors-sequencers

maxim_web: en / products / microcontrollers, maxim_web: en / products / microcontrollers / secure, maxim_web: en / products / power / supervisors-Voltage-monitors-sequencers

Сторожевые таймеры в микроконтроллерах - Технические статьи

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

В этой статье описаны сторожевые таймеры, обычно обозначаемые сокращенно WDT и также называемые таймерами правильной работы компьютера или COP. Есть внешние сторожевые устройства и внутренние сторожевые устройства.В этой статье описаны только внутренние сторожевые псы.

Что такое сторожевой таймер? (Нетрадиционная аналогия)

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

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

Lost был чрезвычайно популярным сериалом о группе выживших, оставшихся на загадочном острове после авиакатастрофы. Один из подзаговоров включает персонажей, которые считают, что они должны ввести короткую серию чисел, прежде чем счетчик на экране станет равным 0, иначе мир закончится.

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

Сторожевой таймер работает как компьютерная система в Lost . Остальная часть микроконтроллера - это измученные персонажи, которые могут делать что угодно, но должны периодически обслуживать счетчик, иначе произойдет сброс микроконтроллера (также известный как конец света). Правильно работающее программное обеспечение и оборудование будут обслуживать сторожевой таймер в течение фиксированного периода времени, а неисправное программное или аппаратное обеспечение - нет.

Типы внутренних сторожевых таймеров

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

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

Временная последовательность сторожевого таймера

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

  • A - Вскоре после загрузки программа инициализирует сторожевой таймер с верхним пределом счетчика и включает счет. Для сторожевого таймера с окнами также устанавливается нижний предел.
  • B и C - Программа успешно обслуживает счетчик до того, как он достигнет верхнего предела, а для сторожевого таймера с оконным режимом - после нижнего предела.После обслуживания счетчик сбрасывается на 0 и снова начинает отсчет. Все в порядке.
  • D - Программа не обслуживает счетчик, и счет достигает верхнего предела. Сторожевой таймер сбрасывает микроконтроллер.
  • D - E - микроконтроллер загружается, инициализируется и включает сторожевой таймер.
  • E - Сторожевой таймер начинает отсчет.
  • F - Программа обслуживает счетчик до того, как он достигнет верхнего предела, а для оконного сторожевого таймера - после нижнего предела.Счетчик сбрасывается на 0 и снова начинает отсчет. Все в порядке.
  • G - Программа обслуживает счетчик до того, как счет достигнет нижнего предела для оконного сторожевого таймера. Для сторожевого таймера без окон и без нижнего предела сброса не происходит, счетчик переходит в 0 и снова начинает отсчет. Для оконного сторожевого таймера микроконтроллер сбрасывается.

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

Инициализация сторожевого таймера

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

Если вы не используете сторожевой таймер, вы должны включить код при загрузке, чтобы отключить его. Так обстоит дело со сторожевым псом, который я сейчас использую. Я должен отключить сторожевой таймер или изменить настройки окна, если моя программа должна работать дольше одной секунды!

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

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

Настройка окна

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

Нижний предел сторожевого таймера, который я сейчас использую, установлен на уровне 75% от верхнего предела.Другой сторожевой таймер может выбрать 75%, 50%, 37,5% или 25% от верхнего предела. Еще один сторожевой таймер устанавливает верхний и нижний пределы независимо. Существует также много различий в том, как выбирается верхний предел.

Сервисное обслуживание AKA Сброс сторожевого таймера

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

Сторожевой таймер, который я сейчас использую, требует двух записей в «служебный регистр» со значением 0x55, за которым следует 0xAA. Если любое значение, отличное от 0x55 или 0xAA, записывается в служебный регистр в любой момент времени , микроконтроллер немедленно сбрасывается.

Другой сторожевой таймер требует однократной записи в служебный регистр со значением 0xAAAA. Кажется, что есть очарование числами 0xA и 0x5 и их чередующимися битовыми комбинациями 1010 и 0101. Один таймер идет вразрез с этой тенденцией, используя одну запись с магическим числом 0x5743.

Спящий режим

Спящий режим и другие режимы с низким энергопотреблением усложняют ситуацию. Что делать сторожевому таймеру, если процессор переходит в спящий режим и прекращает выполнение? Должно ли время сторожевого пса стоять на месте?

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

Прогрессивный ответ

Полный сброс микроконтроллера может быть слишком резким.У некоторых сторожевых псов есть функции, обеспечивающие постепенный ответ.

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

Стратегия WDT

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

В стратегию сторожевого пса можно учесть множество соображений:

  • Использует ли система предсказуемый основной цикл или сложную многозадачную структуру, основанную на операционной системе реального времени?
  • Должен ли сброс сторожевого таймера запускать последовательность автоматических проверок системы?
  • Сторожевой таймер - это последний этап в серии попыток диагностировать и устранить проблему?
  • Вы хотите протестировать сторожевой таймер вместе с другими проверками при запуске системы?

Стратегия сторожевого таймера - сложная тема и очень зависит от приложения.

Перед сбросом микроконтроллера сторожевой таймер устанавливает бит в регистре состояния, который сохраняется после сброса. Часто этот бит сохраняется вместе с другим статусом сброса, таким как бит сброса с пониженным энергопотреблением. Проверка бита сброса сторожевого таймера должна быть частью стратегии.

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

Дополнительная тема: Dead Man Timer vs.Сторожевой таймер

Таймер мертвого человека (DMT) - это вариант концепции сторожевого пса. Название происходит от выключателя «мертвого человека», который останавливает машину, если оператор отпускает механический выключатель. Вместо того, чтобы использовать время в качестве переменной темпа, таймер мертвого человека подсчитывает выборки инструкций ЦП из памяти программ. Сброс микроконтроллера происходит, если счетчик DMT не обслуживается до выполнения определенного количества инструкций.

Ключевое различие между сторожевым таймером и DMT состоит в том, что DMT может оставаться активным во время сна и в других режимах энергосбережения, которые используют время, но не изменяют количество выполняемых инструкций ЦП.

Заключение

Эта статья является последней в серии. Есть и другие интересные таймеры, такие как таймеры с низким энергопотреблением, таймеры с тройной ШИМ для управления трехцветными светодиодами и то, что я называю гибридными таймерами, которые объединяют аппаратные таймеры с тесно связанным программным обеспечением. Оставьте комментарий, если хотите узнать больше о таймерах микроконтроллера.

Мониторы питания со сторожевыми таймерами

0,79 0,79 5.5 5.5, сторожевой таймер 9065C A1 ) 90AR ) -RL7) 902KS R7)5 5,5085 55µ0 ADM8699ARNZ) 911 911 900 (ADM690AARMZ) 9179 долл. США.65 (LTC694CN8-3.3 # PBF)
1 LTC2963 4 1.2 В, 1,5 В, 1,8 В, 1 В, 2,5 В, 3,3 В, 5 В, Adj, -Adj Adj, -Adj ADJ Кнопка, супервизор, сторожевой таймер 00014"> 140µ 2,25 5,5 2,23 долл. США (LTC2963CUDC-1 # PBF)
2 ADM8615 1 Adj - 1600, 25600 Супервизор, сторожевой таймер 20 долл. США 2 5,5 -R7)
3 ADM8614 1 Adj - 100000, 1600 Супервизор, сторожевой таймер 92n 2.375 3,6 0,59 долл. США (ADM8614Y263ACBZ-R7)
4 ADM8613 1 Adj - 1600, 25600 Супервизор, сторожевой таймер 00014">030303 900 0,59 долл. США (ADM8613Y232ACBZ-R7)
5 ADM8324 1 Adj - 1,5 до 1240 Супервизор, сторожевой таймер 92n 0.9 5,5 0,79 долл. США (ADM8324WAh39ARJZR7)
6 ADM8323 1 Adj 1,5 до 1240 Супервизор, сторожевой таймер 00001"> (ADM8323WCC29ARJZR7)
7 ADM8322 1 Adj - 102, 1600, 25600, 6.3 Супервизор, сторожевой таймер 10µ 0.9 5,5 0,69 долл. США (ADM8322WB26ARJZRL7)
8 ADM8321 1 Adj - 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 69"> 0,69 доллара (ADM8321WAX30ARJZR7)
9 ADM8320 1 Adj - 102, 1600, 25600, 6.3 Супервизор, сторожевой таймер 10µ409 5,5 0,69 доллара (ADM8320WBX3NARJZR7)
10 ADM8319 1 Adj - 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 0,69 доллара (ADM8319WB31ARJZR7)
11 ADM8318 1 Adj - 3"> 102, 1600, 25600, 6.3 Супервизор, сторожевой таймер 10µ9 5,5 0,69 долл. США (ADM8318WCY46ARJZR7)
12 ADM8316 1 Adj 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 5.5 0,69 долл. США (ADM8316WAY27ARJZR7)
13 LTC2939 6 3,3 В, 5 В 5V, 3.3V"> 1,2 В, 1,5 В, 1,8 В, 2,5 В, 3,3 В ADJ Контроллер таймера 80µ - 6 $ 2.70 (LTC2939CMS # PBF)
14 LTC2938 4 3,3 В, 5 В 1,2 В, 1,5 В, 1,8 В, 2,5 В, 3,3 В ADJ Супервизор, сторожевой таймер 80µ - 6 2,15 долл. США (LTC2938CDE # PBF)
15 AD5100 4 Adj Adj ADJ Супервизор, сторожевой таймер 633 30 мин. 3 доллара.05 (AD5100YRQZ-1RL7)
16 LTC2918 1 Adj ADJ Супервизор, сторожевой таймер 30µ 6,2
17 LTC2917 1 Adj - ADJ Супервизор, сторожевой таймер 30µ - 6,2 $ 1.30 (LTC2917CDDB-A1 # TRPBF)
18 ADM13305 2 Adj Adj 1600 Supervisor, Watchdog Timer 40µ 2,7 5,5
19 LTC2952 1 Adj, -Adj - ADJ Контроллер диодного ИЛИ, кнопка, супервизор, сторожевой таймер 25µ 2.7 28 2,95 доллара США (LTC2952CF # PBF)
20 ADM8617 1 Adj - 102, 1600, 6.3 Супервизор, сторожевой таймер 92 1n 900 5.5 $ 1.05 (ADM8617RCYAKSZ-RL7)
21 ADM8616 1 Adj - 102, 1600, 6.3 Супервизор, сторожевой таймер 20µ 55 1,05 долл. США (ADM8616LCYAKSZ-RL7)
22 ADM6823 1 Adj - 1600 Супервизор, сторожевой таймер 1,95 м 1,95 м
23 ADM824 1 Adj - 1600 Супервизор, сторожевой таймер 24µ 1 5.5 0,53 долл. США (ADM824LYRJZ-REEL7)
24 ADM823 1 Adj - 1600 Супервизор, сторожевой таймер 24µ 1
25 ADM6321 1 Adj - 102, 1600, 25600, 6.3 Супервизор, сторожевой таймер 20µ 1 5.5 0,62 долл. США (ADM6321AY30ARJZ-R7)
26 ADM6320 1 Adj - 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 1 20µ 0,53 долл. США (ADM6320BX33ARJZ-R7)
27 ADM6318 1 Adj - 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 9 20µ 0,52 долл. США (ADM6318BX49ARJZ-R7)
28 ADM6316 1 Adj - 102, 1600, 25600, 6,3 Супервизор, сторожевой таймер 1 20µ 0,53 долл. США (ADM6316AY27ARJZ-R7)
29 LTC2901 4 3,3 В, 5 В 2,5 В, 3,3 В, 3 В ADJ Супервизор, сторожевой таймер311 Supervisor, сторожевой таймер3 7 2 доллара.35 (LTC2901-1CGN # PBF)
30 LTC1726-5 3 5 В 3,3 В ADJ Супервизор, сторожевой таймер $ 20µ - 7 1,40040 LTC1726ES8-5 # PBF)
31 LTC1726-2.5 3 3,3 В 2,5 В ADJ Супервизор, сторожевой таймер 20µ - 7 $.75 (LTC1726ES8-2.5 # PBF)
32 ADM9690 1 4,31 В - 0,75, 1,5, 12,5, 25 Супервизор, сторожевой таймер 100µ 4,3 $ 1,67 (ADM9690ARNZ)
33 ADM1232 1 4,37 В, 4,62 В - 1120, 150, 600 Супервизор, сторожевой таймер 4 50µ5 5,5 1,05 долл. США (ADM1232ANZ)
34 ADM8699 1 4,65 В - 1600 Супервизор, сторожевой таймер 55µ 3 3
35 ADM8697 1 Adj - 100, 1600, ADJ Супервизор, сторожевой таймер 100µ 3 5.5 3,18 долл. США (ADM8697ARWZ)
36 ADM8696 1 1,3 В - 100, 1600, ADJ Супервизор, сторожевой таймер 200µ 3 200µ 3 900 (ADM8696ARWZ)
37 ADM8695 1 4.65V - 100, 1600, ADJ Супервизор, сторожевой таймер 200µ 4.75 5,5 2,56 долл. США (ADM8695ARWZ)
38 ADM8691 1 4,65 В - 100, 1600, ADJ Супервизор, сторожевой таймер7 200µ 200µ 3,53 долл. США (ADM8691ARWZ)
39 ADM8690 1 4,65 В - 1600 Супервизор, сторожевой таймер 200µ 4.75 5,5 2,95 долл. США (ADM8690ARNZ)
40 ADM805 1 4,4 В, 4,65 В - 1600 Супервизор, сторожевой таймер7 60µ40 60µ $ 2,45 (ADM805LANZ)
41 ADM802 1 4,4 В, 4,65 В - 1600 Супервизор, сторожевой таймер 60µ 4.5 5,5 2,23 долл. США (ADM802LARNZ)
42 ADM800 1 4,4 В, 4,65 В - 1600 Супервизор, сторожевой таймер7 100µ 100µ $ 2,33 (ADM800MARNZ)
43 ADM693A 1 4,4 В - 1600 Супервизор, сторожевой таймер 1,95 м 4.5 5,5 1,85 долл. США (ADM693AANZ)
44 ​​ ADM692A 1 4,4 В - 1600 Супервизор, сторожевой таймер 4,51,95 м 4,5 (ADM692AANZ)
45 ADM691A 1 4,65 В - 1600 Супервизор, сторожевой таймер 1,95 м 4.75 5,5 1,73 долл. США (ADM691AARUZ)
46 ADM690A 1 4,65 В - 1600 Супервайзер, сторожевой таймер7 1,95 м 1,95 м
47 ADM706 1 4,4 В - 1600 Супервизор, сторожевой таймер 250µ 4.75 5,5 1,70 долл. США (ADM706ANZ)
48 ADM705 1 4,65 В - 1600 Супервизор, сторожевой таймер 250µ 4,75 250µ 4,75 900 ADM705ANZ)
49 LTC693 1 5V 100, 1600 Супервизор, сторожевой таймер 600µ 6 $ 3.70 (LTC693CN # PBF)
50 LTC692 1 5V 100, 1600 Супервизор, сторожевой таймер 600µ 6 0 $ 3,4 )
51 ADM699 1 4,65 В - 1600 Супервизор, сторожевой таймер 250µ 3 5,5 $ 1,93 (ADM69943ANZ) 900 9150 $ 1,93 (ADM69943ANZ) 900 ADM697 1 Adj - 100, 1600 Супервизор, сторожевой таймер 1.95 м 3 5,5 3,02 доллара (ADM697ANZ)
53 ADM696 1 Adj - 100, 1600 Супервизор, сторожевой таймер327 3,95 м 5.5 3,31 доллара США (ADM696ARZ)
54 ADM695 1 Adj - 100, 1600 Supervisor, Watchdog Timer 1,95 м 4.75 5,5 3,14 долл. США (ADM695ANZ)
55 ADM694 1 4,65 В - 100, 1600 Супервизор, сторожевой таймер7 1,95 м 1,95 м 900 $ 2,91 (ADM694ANZ)
56 ADM693 1 4,4 В - 100, 1600 Супервизор, сторожевой таймер 100µ 4.5 5,5 3,14 долл. США (ADM693ANZ)
57 ADM692 1 4,4 В - 100, 1600 Супервизор, сторожевой таймер 100µ 7,5 2,78 долл. США (ADM692ANZ)
58 ADM691 1 4,65 В - 100, 1600 Супервизор, сторожевой таймер 100µ 4.75 5,5 3,14 долл. США (ADM691ANZ)
59 ADM690 1 4,65 В - 100, 1600 Супервизор, сторожевой таймер 100µ7 100µ 4,7 3,06 долл. США (ADM690ANZ)
60 LTC694-3.3 1 2,90 В 100, 1600 Супервизор, сторожевой таймер 600µ 6
61 LTC695-3.3 1 2,90 В - 100, 1600 Супервизор, сторожевой таймер 600µ - 6 4,00 долл. США (LTC695CN-3.3 # PBF)
62 LTC699 1 5 В 100, 1600 Супервизор, сторожевой таймер 600 долл.45 (LTC699CN8 # PBF)
63 LTC1232 1 5V 100, 1600 Супервизор, сторожевой таймер 500µ 5.5 $ )
64 LTC695 1 5V - 100, 1600 Супервизор, сторожевой таймер 600µ - 6 $ 3.70 (LTC695CN # PBF)
65 LTC694 1 5V 100, 1600 Супервизор, сторожевой таймер 600µ 6 0 $ 3,4 )
66 LTC691 1 5V - 100, 1600 Супервизор, сторожевой таймер 600µ - 6 3,70 долл. 67 LTC690 1 5V 100, 1600 Супервизор, сторожевой таймер 600µ 6 $ 3.40 (LTC690CN8 # PBF)

Использование сторожевого таймера в MT3620 RTApp - Azure Sphere

  • 2 минуты на чтение

В этой статье

MT3620 поддерживает сторожевой таймер для каждого ядра реального времени. Эти сторожевые таймеры доступны для приложений с поддержкой реального времени (RTApps).

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

  • Специальная поддержка ОС Azure Sphere или SDK для основных сторожевых таймеров реального времени отсутствует.

  • Сторожевые таймеры можно программировать напрямую через регистры, управляющие их работой, или с помощью драйверов MediaTek. См. Пример приложения сторожевого таймера.

Базовые адреса регистров, номера прерываний, тактовую частоту, частоту дискретизации и другие сведения о MT3620 см. В таблице данных MT3620 и руководстве пользователя MT3620 M4; если остались вопросы, вы можете запросить подробную информацию в Avnet, написав по адресу [email protected].

Эффекты сброса сторожевого таймера

Когда сторожевой таймер вызывает событие сброса, ядро ​​реального времени направляется в точку входа в приложение.RTApp отвечает за повторную инициализацию памяти, стека и любых периферийных устройств, необходимых для правильного возобновления работы. ОС Azure Sphere не влияет на содержимое памяти и не выполняет повторную инициализацию периферийных устройств на ядре реального времени во время операции сброса.

Сброс сторожевого таймера не вызывает никаких уведомлений, событий или предупреждений для других ядер реального времени, для ОС Azure Sphere или для любых приложений высокого уровня, которые в настоящее время работают. Эффект сброса сторожевого таймера строго локален для сбрасываемого базового процессора реального времени.

Пример приложения сторожевого таймера

MediaTek предоставляет драйверы и образцы кода для приложений реального времени MT3620 на GitHub.

Locoduino / KeepMeAlive: KeepMeAlive - это библиотека Arduino для использования сторожевого таймера и генерации сброса и / или прерывания

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

История изменений

  • 1.0 - начальная версия, поддержка только ATMega 328 (Arduino Uno, Arduino Nano и Arduino Pro Mini).

Обоснование

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

Если плата расположена в труднодоступном месте, ручной перезапуск раздражает.

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

Документация

Включив библиотеку в ваш эскиз:

  #include 
  

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

setDelay (

задержка )

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

  • AVR ATMega 328 (Arduino Uno, Nano, Pro Mini): минимальное значение составляет 16 мс, а максимальное значение 8000 мс. Возможные значения:
    • 16 мс
    • 32 мс
    • 64 мс
    • 128 мс
    • 256 мс
    • 512 мс
    • 1024 мс
    • 2048 мс
    • 4096 мс
    • 8192 мс

Если задержка не соответствует доступному значению, setDelay выбирает следующее более высокое значение.Например, на AVR ATMega 328 задержка , равная 1500 мс, округляется до 2000 мс. Если задержка больше максимального значения, используется максимальное значение.

setDelay не включает сторожевой таймер.

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

Значение задержки по умолчанию, то есть задержка, которая используется, если вызывается enable () , тогда как setDelay ранее не вызывалась, составляет 10000 мс.

doResetCPU (

doReset )

При вызове doResetCPU сторожевой таймер сбросит CPU, если doReset равен true , и не будет сбрасывать CPU, если doReset is false .

attachInterrupt (

interruptRoutine )

attachInterrupt прикрепляет программу обработки прерывания к сторожевому таймеру. если добавлена ​​подпрограмма прерывания, она вызывается при вызове сторожевого таймера перед сбросом CPU.

detachInterrupt ()

detachInterrupt удаляет программу обработки прерывания из сторожевого таймера.

включить ()

, если был вызван doResetCPU или attachInterrupt , enable включает сторожевой таймер и запускает сторожевой таймер, чтобы по его истечении вызывалась присоединенная подпрограмма прерывания и / или выполнялся сброс. Если ни один из этих двух методов не был вызван, enable ничего не делает. Вызов enable , когда сторожевой таймер уже включен, не имеет никакого эффекта.

отключить ()

disable отключает сторожевой таймер и останавливает сторожевой таймер. Вызов отключить , когда сторожевой таймер не включен, не имеет никакого эффекта.

сброс ()

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

Расширенное использование: программные модули

Это реализация метода, описанного Филипом Купманом.Цель состоит в том, чтобы сбросить сторожевой таймер только в том случае, если каждый программный модуль был посещен в цикле. Это также может включать процедуры обслуживания прерываний, если таковые имеются.

Каждый модуль имеет уникальный номер. Числа могут быть объявлены как константы с помощью перечисления. Можно определить до 32 модулей.

 const uint8_t kModuleCount = 4;
перечислить {CAN_ISR_MODULE, SERVO_MODULE, LED_MODULE, DETECTION_MODULE}; 

setModuleCount (

счетчик )

Установите количество используемых модулей.По умолчанию установлено 0 модулей. count должен иметь значение от 1 до 32. Если задано значение вне этого интервала, setModuleCount не действует.

живая (

модуль )

активен сообщает, что модуль активен. модуль должен иметь значение от 0 до количества модулей минус один. Если задано значение вне этого интервала, активен не действует. Когда все модули сообщили, что они живы, сторожевой таймер сбрасывается, и отчет модуля очищается.

Примечание о поведении сторожевого таймера на ATMega 328.

Когда разрешены как сброс CPU, так и прерывание, прерывание имеет приоритет и по истечении задержки будет выполнено без сброса. После выполнения прерывания ЦП возвращается к выполнению основной программы, и задержка сторожевого таймера истекает во второй раз, чтобы привести к сбросу.

Предупреждение

Будьте осторожны, не устанавливайте слишком короткую задержку. Действительно, если загрузчик OptiBoot отключает сторожевой таймер, это не относится ко всем загрузчикам.Поэтому необходимо иметь достаточно времени, чтобы загрузчик заработал. 2 секунды - подходящее значение. При слишком короткой задержке сторожевой таймер вызовет сброс перед выполнением setup () и перепрограммированием сторожевого таймера.

Что такое сторожевой пес и как им пользоваться

Сегодня я хочу поговорить о конкретной собаке.

Не обычная собака, а особенная, которой не нужен поводок. Эта собака наблюдает за вами ... и называется сторожевым псом 😀

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

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

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

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

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

Если использовать аккумулятор, можно сэкономить много энергии!

Например:

Если мы хотим мигать светодиодом, мы обычно делаем это:

 void loop () {
 digitalWrite (13, ВЫСОКИЙ); // включаем светодиод (HIGH - уровень напряжения)
 задержка (1000); // ждем секунду
 digitalWrite (13, LOW); // выключаем светодиод, понижая напряжение
 задержка (1000); // ждем секунду
}
 

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

Это потому, что светодиод не горит, а микроконтроллер ничего не делает, он только ждет и тратит энергию.

Посмотрите техническое описание Attiny84

Что видят мои глаза ???

Когда микроконтроллер в активном режиме - пока ждем и светодиод не горит - потребляет 300 мкА.

В противном случае, если мы переведем микроконтроллер в спящий режим - особенно в режиме пониженного энергопотребления - он потребляет всего 0,1 мкА.

Реально 0,1 мкА !!!!

Итак, вместо того, чтобы ничего не делать и держать микроконтроллер в активном режиме, мы можем перевести его в спящий режим и сэкономить много энергии!

Ну а теперь вопрос:

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

№Мы можем использовать прерывание сторожевого таймера, чтобы разбудить микроконтроллер через определенное время!

Вот код с режимом сна:

 #include 
#include 
#include 
#include 

// функция настройки запускается один раз, когда вы нажимаете кнопку сброса или включаете плату
void setup () {
 pinMode (7, ВЫХОД);
}

// функция цикла выполняется снова и снова навсегда
void loop () {
 digitalWrite (7, ВЫСОКИЙ); // включаем светодиод (HIGH - уровень напряжения)
 задержка (1000); // ждем секунду
 digitalWrite (7, LOW); // выключаем светодиод, понижая напряжение
 waitSleep (1); // засыпаем на 1 секунду
}

void waitSleep (int миллисекунды) {
 while (миллисекунды) {
 иди спать();
 миллисек -;
 }
}

void goSleep () {
 watchdogSetup (); // включаем watchDog
 power_timer0_disable (); // отключаем таймер 0
 power_timer1_disable (); // отключаем Таймер 1
 set_sleep_mode (SLEEP_MODE_PWR_DOWN);
 спящий режим();
 // отключаем сторожевой таймер после сна
 wdt_disable ();
 power_timer0_enable (); // включаем таймер 0
 power_timer1_enable (); // включаем Таймер 1
}

void watchdogSetup () {

 // WDP3 - WDP2 - WPD1 - WDP0 - время
 // 0 0 0 0 16 мс
 // 0 0 0 1 32 мс
 // 0 0 1 0 64 мс
 // 0 0 1 1 0.125 с
 // 0 1 0 0 0,25 с
 // 0 1 0 1 0,5 с
 // 0 1 1 0 1.0 с
 // 0 1 1 1 2,0 с
 // 1 0 0 0 4,0 с
 // 1 0 0 1 8.0 с


 // Сбрасываем флаг сброса сторожевого таймера
 bitClear (MCUSR, WDRF);
 

 // Следующий бит должен быть установлен одновременно, иначе система не установит правильное значение

 / * Начать синхронизацию * /
 // Смена сторожевого таймера Включите, чтобы очистить WD (установив бит WDCE) и включив WD (установив бит WDE)
 WDTCSR | = (1 << WDCE) | (1 << WDE);
 
 // Устанавливаем новое значение тайм-аута сторожевого таймера на 1 секунду (WDP2 и WDP1 на 1) и разрешаем прерывания вместо сброса (WDIE на 1)
 WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1);
}
ISR (WDT_vect) {
// Здесь ничего не делаем, но мы должны включить это
// блок кода, иначе прерывание вызовет
// неинициализированный обработчик прерывания.}
 

Итак, мы создали функцию waitSleep () , где мы можем указать, сколько секунд мы хотим спать. Мы используем эту функцию вместо функции delay ().

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

Итак, каждую секунду функция waitSleep () вызывает функцию goSleep () , которая устанавливает сторожевой таймер, отключает все ненужные периферийные устройства и переводит в спящий режим ().

Когда прерывание сторожевого таймера пробуждает микроконтроллер, код продолжается после функции sleep_mode (), отключает сторожевой таймер и повторно включает все периферийные устройства.

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

Хорошо, но как мы устанавливаем сторожевой таймер и, что более важно, как мы устанавливаем его значение таймера?

Нам нужно прочитать техническое описание.

Прошу прощения, но другого пути нет! 🙂

Итак, взгляните на таблицу Attiny84.

Чтобы включить сторожевой таймер, нам нужно установить два регистра:

Регистр состояния MCU - он же MCUSR - и регистр управления и состояния сторожевого таймера - он же WDTCSR .

Во-первых, в регистре MCUSR нам нужно сбросить бит WDRF , который является флагом прерывания сторожевого таймера. Каждый раз, когда у нас есть сторожевое прерывание, этот бит устанавливается микроконтроллером в 1. Поэтому нам нужно очистить его, чтобы прерывание снова заработало.

После этого в регистре WDTCSR мы устанавливаем бит WDCE , который является активатором смены сторожевого таймера , чтобы очистить таймер WD, а также позволяет изменить значение предварительного делителя. Затем мы устанавливаем бит WDE , чтобы включить WD. Эти две настройки должны выполняться одновременно.

Теперь мы можем установить значение предделителя WD в соответствии с его таблицей. В нашем случае мы установили предварительный делитель на 1 секунду, установив биты WPD2 и WPD1 .Наконец, мы устанавливаем бит WDIE , который разрешает прерывание сторожевого таймера вместо сброса микроконтроллера. Эти две настройки должны выполняться одновременно.

Не забудьте добавить в свой скетч функцию ISR (WDT_vect) . Это потому, что микроконтроллер хочет, чтобы он использовал прерывание WD.

Что ж, мы можем использовать WD для экономии энергии.

Я использовал этот хак в KeyChainino. Я сделал простую рождественскую лампу KeyChainino, чтобы повесить ее на вашу елку.

В этом конкретном случае KeyChainino просыпается каждые 4 секунды и отображает магические звезды 🙂

Проверьте код здесь 🙂