Intel watchdog timer driver что это

Обновлено: 04.07.2024

В предыдущей части урока мы познакомились со сторожевым таймером (Watchdog Timer или WDT), узнали, как он устроен в микроконтроллере AVR, создали и настроили проект урока.

Включим ножки PD3:PD7 на выход, а ножку PD2 на вход. Ножки PD0 и PD1 не трогаем. Ножка PD2 нужна для отслеживания внешних прерываний

На ножках PD3:PD7 сначала установим низкий уровень, а с ножки PD2 подтянем резистор к питанию

Также включим на выход ножки PB0:PB4, выставив на них также низкий уровень

Настроим таймер 1 приблизительно с периодом в 0,5 секунды

TCCR1B |= ( 1 << WGM12 ) ; //CTC (Clear Timer on Compare match) TIMSK1 |= ( 1 << OCIE1A ) ; //Output Compare A Match Interrupt Enable

Настроим внешние прерывания от ножки INT0 на срабатывания по спаду, так как при нажатии на кнопку у нас будет уровень ножки падать в ноль ибо она притянута вторым контактом к земле. Можно было сделать и по фронту, чтобы событие наступало при отжатии кнопки, только в таком случае событие наступит и в момент включения контроллера

Разрешим глобальные прерывания

Включим сторожевой таймер с интервалом 2 секунды

Вот так вот с помощью библиотечной функции очень быстро инициализируется Watchdog Timer.

Добавим глобальную переменную для сохранения счёта таймера

Также напишем макроподстановки для удобства управления светодиодами с ножек портов

Добавим обработчик прерываний от таймера, в котором будем попеременно при каждом вхождении зажигать очередной светодиод, а предыдущий тушить

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

Соберём код с помощью вот этой кнопки либо с помощью функциональной клавиши F11


Если всё правильно соберётся, то в окне Output запомним местонахождения файла с прошивкой


Запустим программу avrdude33 (я пока не нашел способов её подключения к среде) и сначала убедимся в видимости нашего контроллера, нажав Чтение


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


Возвращаемся на первую вкладку, выбираем файл с прошивкой и прошиваем её в контроллер


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


Почему так происходит? Потому что мы явно не проинициализировали переменную счёта таймера, а проинициализировали её при объявлении глобально, скорей всего процедура перезагрузки затирает не всё. Поэтому произведём инициализацию данной переменной в функции main() явно

Недорогие RTX 3060 - крипта растет, а видяхи дешевеют

Слив 3060 Gigabyte Gaming - на сегодня это за копейки

    N.B. Последнее время слово WatchDog стало довольно популярно. Под WD обычно понимают класс устройств или программм, в обязанности которым вменяется слежение за значениями какого-либо параметра (или сразу нескольких). При выходе значений параметра за допустимые пределы, устройство/программма должна произвести какие-либо действия: включение/отключение каких-либо дополнительных устройств, звуковой/световой/прочей сигнализации.
    N.B. Необходимо сразу сделать важное замечание: WDT функционирует независимо от центрального процессора. Поэтому WDT продолжает работать даже при зависании CPU !
  • В счетчик программым образом может быть записано некоторое число.
  • Сразу же содержимое счетчика начинает уменьшаться.
  • В момент, когда оно станет равным нулю, управляющее устройство производит некоторые действия, например, ресетит компьютер.

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



Назначение этих составных частей станет понятно из описания алгоритма функционирования WDT:
    - выдать сигнал через KRST
    - выдать сигнал через PWROK1/2
    Через конфигурационный регистр можно запретить или разрешить эти два варианта. Лучше не спрашивайте меня, что собственно они означают Главное, что выбор первого из них (KRST) позволяет ребутить компьютер.
    - изменить состояние регистра статуса
    -программа заносит в доп регистр какое-либо значение, отличное от 0;
    -когда пользователь нажимает на какую-либо клавишу клавиатуры;
    -когда пользователь двигает мышью (если в ОС установлен драйвер мыши);
    -когда происходит обмен данными через GamePort;
    -когда происходит обмен данными через инфракрасный порт (CIR)
    1) Замечено, что не всегда задаваемый временной интервал точно соответствует действительному. Например, если таймер настраивался на 60 секунд, то сработать он может только через 80 секунд. Т.е. имеет место некоторая погрешность. Эта погрешность линейно растет с увеличением временного интервала, так что при необходимости ее нетрудно учесть.
    2) В отличие от WDT других фирм, WDT в чипах SuperIO от ITE не отображают текущего значения счетчика. Поэтому существует лишь единственная возможность судить о его состоянии -- по регистру WDT Status Reg.
    3) При обращении софта к COM-портам компьютера таймер отключается. Причина: перевод микросхемы из расширенного режима в обычный. Как бороться ? Пока не знаю. Проще смириться с этим или отключить порты

цитата:
What is a watchdog timer?
A "watchdog" is a piece of hardware that counts down a timer.
If the timer reaches zero, it hard-resets the computer (like pushing
the reset button). So the software must reset this timer too avoid
rebooting.
The good thing is: If the computer hangs, the software
can't reset the timer and it (should) reboot automatically.


Текущая версия v.0.2: 8rdawdt-0.2.tar.bz2 (увы, только под юниксы )
---
Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.

Подпишитесь на наш канал в Яндекс.Дзен или telegram-канал @overclockers_news - это удобные способы следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.

Параметр - Watchdog Timer

Персональный компьютер или сервер имеют встроенный таймер операций – он называется WatchDog Timer или WDT (в русской компьютерной терминологии – контрольный таймер материнской платы). Необходим он потому как такая сложная техника, как компьютер имеет свойство сбоить и выходить из строя. Именно поэтому в неё зачастую встраивают различные независимые опции контроля и коррекции, в частности таймер операций, который ограничивают время, затрачиваемое системой ввода-вывода на одно действие(шаг).

В большинстве случаев контрольный таймер доступен прямо в BIOS-е. Впрочем, некоторые производители материнских плат страдают недоверием к пользователям и оснащают свои платы только самыми безопасными и «пользовательскими» функциями. Если вам так не повезло – увы, доступ к настройкам WDT вам закрыт. К счастью, таких производителей немного.

Как работает контрольный таймер

WDT запускается вместе со стартом системы и тут же начинает отслеживание её действий. Впрочем, некоторые модели плат имеют технологическую особенность: первый шаг WDT в них является холостым, а значит, по-настоящему работу таймер начнет только по прохождении 0,6 секунды. Стандартное значение WDT– 4h, что означает 4 шага. Если программа не успевает выполнить операцию за четыре шага (1,8 – 2,4 секунды) система принудительно останавливает её и производит корректировку программы. Ну или перезагружает/выключает компьютер, если эта программа системная. При этом вы получите BSoD (Blue Screenof Death) с описанием произошедшей ошибки, например DPC_WATCHDOG_VIOLATION.

Максимальное значение WDT– 3Fh, то есть 62 шага или 37,5 секунд, но устанавливать его не стоит: в случае какого-либо сбоя вы потеряете доступ к ПК не на жалкие две секунды, а почти на полминуты. К тому же любой современный ПК способен выполнить стандартную операцию меньше чем за секунду, а значит, даже двухсекундная задержка уже сбой.

Стоит ли включать эту опцию?

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

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

Во-первых, я считал, что основные виды периферии и прочих составляющих данного контроллера нами уже изучены.

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

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

Что же всё-таки сподвигло меня на данный шаг?

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

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

И вот одним из неизведанных ещё нами модулей оказался модуль Watchdog Timer (WDT), который, как оказалось, много где используется и выполняет очень важные роли в работе программ. Тем более, меня ранее многие просили сделать по нему урок, но я либо недопонимал ценность данной периферии, либо был увлечён чем-то другим.

Вот и настало время наконец-то восполнить данный пробел.

В каких конкретных случаях мы можем применить данный таймер?

Например, мы ждём ответа от какой-нибудь шины (например I2C или ещё какой-то) в виде отслеживания состояния определённого бита регистра. И вдруг произойдёт кратковременное отсоединение провода этой шины. После этого скорей всего произойдёт зависание программы, так как в шине будет сбой, и даже если что-то после и придёт от присоединённого узла, то мы вряд ли уже это отследим изменением состояния бита. Желательно, чтобы после какого-то таймаута система перезагрузилась. Тут-то и приходит нам на помощь WDT, который установлен на определённый интервал. Команду на перезагрузку сторожевого таймера мы расположим в нашем коде после того, как мы дождёмся отклика от шины. А если мы так его и не дождёмся, то мы не дойдём до команды перезагрузки WDT и через заветный интервал времени система будет перезагружена. После этого произойдёт заново инициализация шины и всё будет опять работать нормально.

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

При работе с таймером в нашем коде мы не будем напрямую работать с его регистрами, так как там ещё надо проделывать очень много различных подготовительных мероприятий. Для этого существует отличная библиотека wdt.h, которая находится в стандартном комплекте для AVR и не требует дополнительного подключения откуда-то. Но тем не менее о том, как именно устроен сторожевой таймер в контроллере ATMega328, которым мы и будем сегодня пользоваться, мы всё же поговорим.

Таймер питается от отдельного генератора, который вместе с ним входит в логику перезагрузки контроллера


А вот это диаграмма сброса контроллера по истечении интервала времени


Кроме того, что мы можем сбросить сторожевой таймер где-то в коде, мы можем также и отследить окончание интервала времени по прерыванию, которое надо включить отдельно.

WDT, как и было указано выше, работает от отдельного генератора.

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

Давайте посмотрим блок-схему WDT


На рисунке мы видим, что после генератора на 128 килогерц, сигнал проходит на предделитель, который содержит 10 различных выходов с различным коэффициентом деления. Предделитель настраивается с помощью битов WDP3:WDP0 регистра WDTCSR. Таким образом, интервал времени работы WDT лежит в диапазоне от 15 милисекунд до 8 секунд.

Также мы видим, что с помощью бита WDIE мы можем разрешить прерывания от сторожевого таймера и затем попасть в обработчик, отслеживая состояние бита WDIF. Включается таймер с помощью бита WDE.


Хоть мы уже и говорили о битах данного регистра выше, но всё же давайте все их рассмотрим подробно, их не так и много, так как у таймера всего один регистр

WDIF (Watchdog Interrupt Flag): флаг прерывания. Устанавливается в 1 в случае истечения интервала времени таймера. Сбрасывается аппаратно.

Существует таблица зависимости от состояния бетов WDE, WDIE, а также фьюза WDTON


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

WDP2:WDP0 (Watchdog Timer Prescaler): биты, устанавливающие коэффициент деления предделителя сторожевого таймера.

Вот таблица возможных комбинаций данных битов


Здесь также даны сами интервалы в единицах времени.

WDCE (Watchdog Change Enable): бит изменения, который должен быть предварительно включен перед тем, как мы соберёмся внести изменения в предделитель с целью изменения коэффициента деления либо для отключения таймера путём занесения в бит WDE значения 0. Сбрасывается аппаратно после четырех тактов.

WDE (Watchdog System Reset Enable): бит включения таймера, а вернее бит включения режима перезагрузки системы по истечению интервала времени таймера WDT.

Ну вот, я думаю и всё насчёт теории по сторожевому таймеру. Если что-то пропустил, то исправим это в процессе сочинения кода.

Код наш выполнять будет следующие задачи.

У нас, помимо WDT, будет также работать ещё таймер TIM1, данный таймер будет работать по совпадению, следовательно в обработчик прерываний от него мы будем попадать через определённое время периодично. В обработчике таймера мы будем периодично включать 10 ножек различных портов, а состояние их на какой-то момент мы будем определять по светодиодам, которые мы к ним подключим. Вернее, мы подключим светодиодную планку с 10-ю светодиодами, не забывая конечно о токоограничивающих резисторах, которые я на всякий случай подключил на 680 Ом, при этом светодиоды светятся вполне ярко. В начале программы мы запустим наш сторожевой таймер WDT и зададим ему определённый интервал времени срабатывания. В процедуре обработки прерываний от таймера 1 мы будем своевременно сбрасывать сторожевой таймер, поэтому, если всё у нас будет нормально с ходом программы, то система у нас будет работать и не перезагрузится.

В качестве контроллера для урока мы возьмём контролер ATMega328P, расположенный на плате Arduino Nano, к которой подключим обычный USB-программатор через разъём ISP. Вставим нашу плату в макетную плату, подведём к ножке PD2 (INT0) кнопку, а также от ножек D3-D12 (ножки портов PD3:PD7, PB0:PB4) подключим аноды светодиодов планки, а катоды через токоограничивающие резисторы подключим к общему проводу


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

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

Запустим среду программирования MPLAB X и запустим создание проекта с помощью следующей кнопки



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


На следующем шаге в качестве программатора выберем Simulator и идём далее


На следующем шаге выберем компилятор и идём дальше



В дереве проекта в ветке Source Files добавим новый файл main.c с помощью контекстного меню на данной ветке



Файл main.c создан, чуть позже мы его исправим немного.


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


Оставим уровень оптимизации 0 и установим чекбокс на пункте Debug

Читайте также: