Watch dog function bios что это
Персональный компьютер или сервер имеют встроенный таймер операций – он называется 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 стоит сделать побольше или же вообще выключить, если другие варианты не работают. Только помните, что в этом случае ваш компьютер может начать чаще зависать и тратить процессорное время на выполнение некорректно совершенных запросов.
Функция HPET Mode предназначена для установки режима работы аппаратного таймера HPET. Функция имеет всего два варианта значений – 32 bit и 64 bit.
Принцип работы
До появления HPET в персональных компьютерах использовались аппаратные таймеры RTC (Часы реального времени) и Intel 8254. Однако эти таймеры во многом не соответствуют современным требованиям. В частности, их тактовая частота не превышает нескольких десятков килогерц, а из-за невысокой скорости работы они зачастую генерируют множество неиспользуемых прерываний. Кроме того, они обладают невысокой точностью определения временных интервалов.
Эта ситуация не устраивала как производителей программного обеспечения, так и производителей аппаратного обеспечения. В результате две ведущие компании в обеих областях, Microsoft и Intel, объединили свои усилия, и в 2005 г. появилась их совместная разработка, таймер событий высокой точности (High Precision Event Timer, HPET).
Данный таймер разрабатывался преимущественно для улучшения работы мультимедийных приложений и поэтому поначалу получил название мультимедийного таймера (Multimedia Timer). Однако впоследствии оказалось, что мультимедийными таймерами назывались программные таймеры, использовавшиеся в графических операционных оболочках семейства Windows 3.x, поэтому название таймера было заменено на HPET.
Применение таймера событий высокой точности позволило улучшить работу многих прикладных программ, а также игр, использующих мультимедийный контент, и повысить плавность его воспроизведения.
Для работы таймера HPET требуется его поддержка со стороны операционной системы. Большинство современных операционных систем, начиная с Windows Vista, поддерживают его. Хотя в Windows XP, начиная с SP2, также присутствует драйвер HPET, однако фактически эта операционная система не использует данный таймер. Кроме того, таймер поддерживается современными версиями Mac OS X, Linux, Solaris и FreeBSD.
На аппаратном уровне в большинстве чипсетов таймер HPET расположен в южном мосте материнской платы. Он работает на частоте в 10 МГц и имеет 64-разрядный главный счетчик. Кроме того, timer обладает большим набором (от 3 до 256) специальных вспомогательных счетчиков-компараторов, которые способны генерировать прерывания и могут управляться как операционной системой, так и прикладными программами. Компараторы поддерживают как 32-разрядный, так и 64-разрядный режимы работы.
Таймер событий высокой точности изначально разрабатывался для 64-разрядных операционных систем. Однако он может работать и в 32-разрядных системах. Для переключения режима работы компараторов с 32-разрядного режима на 64-разрядный и предназначена опция HPET Mode.
Функция может быть доступна лишь после включения общего режима поддержки технологии High Precision Event Timer в BIOS при помощи функций HPET или HPET Support.
Какое значение опции выбрать?
Если у вас на компьютере установлена 32-разрядная ОС, поддерживающая HPET, то вы должны выбрать значение опции 32 bit. В случае же использования поддерживающей HPET 64-разрядной операционной системы лучше всего выбрать значение 64 bit.
Установка в 64-разрядной системе 32-разрядного режима опции серьезно не отразится на работоспособности системы, за исключением того, что прикладные программы не смогут получить доступ к расширенным возможностям таймера. Тем не менее, выбор 64-разрядного режима позволит Windows в полной мере использовать преимущества технологии High Precision Event Timer.
В том случае, если у вас на компьютере установлены как 32-разрядная, так и 64-разрядная операционные системы, поддерживающие HPET, то рекомендуется выбрать 32-разрядный режим опции. Если у вас есть операционная система, не поддерживающая HPET и 64-разрядная ОС, поддерживающая HPET, то можно смело установить режим 64 bit.
В одной компании было много терминалов, и одна из неблагодарных задач для техподдержки — ездить по точкам и перезапускать операционную систему внутри терминалов. Было решено бросить вызов этой проблеме в виде разработки аппаратного сторожевого таймера.
В итоге мы получили устройство, которое подключается к расширительному спаренному USB-разъему на материнской плате.
Данное устройство имеет следующие возможности:
- Имитация нажатия кнопок POWER и RESET;
- Управление питанием USB-устройством (при условии, что у него нет отдельного источника);
- Управление гальванически развязанной контактной группой (реле). Можно поставить в разрез цепи питания;
- Индикаторные светодиоды (одним можно управлять, второй показывает режимы работы).
Алгоритм работы прост: внутри находятся два настраиваемых таймера, которые постоянно отсчитывают заданное время, по истечению которого имитируется нажатие соответствующих кнопок (POWER и RESET). Чтобы предотвратить случайную перезагрузку, необходимо периодически послать команду сброса таймера.
Лучше, чтобы за процедуру сброса таймеров отвечало целевое приложение, а не стороннее или системное (Cron, служба расписаний) по причине того, что вероятность сбоя в системе меньше, чем в приложении (хотя, у кого как).
Обмен информацией аналогичен консольному.
команда | Описание | Пример |
---|---|---|
help | Краткая справка по командам | help |
LED1 | Управление светодиодом, по умолчанию выключен | LED1 ON LED1 OFF |
RELAY | Управление реле, по умолчанию включено | RELAY ON RELAY OFF |
KEY1 | Имитация нажатия кнопки 1, по умолчанию не нажата | KEY1 ON KEY1 OFF |
KEY2 | Имитация нажатия кнопки 2, по умолчанию не нажата | KEY2 ON KEY2 OFF |
C1 | Управление таймером 1, связанным с кнопкой 1. Установка времени в секундах, максимальное значение 32767. Для отключения функции таймера, необходимо задать время равное 0. | C1 RES C1 SET 60 C1 SET 0 |
C2 | Управление таймером 2, связанным с кнопкой 2. Установка времени в секундах, максимальное значение 32767. Для отключения функции таймера, необходимо задать время равное 0. | C2 RES C2 SET 60 C2 SET 0 |
USB | Управление питанием USB, по умолчанию включено | USB ON USB OFF |
В случае удачного выполнения команды возвращает «OK».
В случае некорректных данных возвращает «ERROR».
Признаком конца строки служит символ возврата каретки «\r». Также поддерживается режим «\r\n».
Устройство выполнено на базе контроллера STM32F103CA с аппаратной поддержкой USB. Библиотека работы с USB версии V4.0.0. Напряжение работы 3.3В получаем с помощью линейного стабилизатора из 5В на USB. Во всех управляющих цепях используются транзисторы в ключевом режиме. Также не забываем про защитный диод от токов самоиндукции в катушки реле (в моем случае он оказался встроенным).
Речь пойдет о том, как держать Arduino всегда в работоспособном состоянии. Механизм watchdog встроен в контроллеры Atmega, но, к сожалению, не всякий загрузчик (bootloader) Arduino правильно обрабатывает эту функцию. Попробуем разобраться с этой проблемой.
Итак, что такое watchdog? Простыми словами — это встроенный таймер на определенное время (до 8 сек в зависимости от чипа), который можно запустить программно. Как только таймер «дотикает» до нуля, контроллер подает правильный сигнал сброса (RESET) и всё устройство уходит в hard перезагрузку. Самое главное, что этот таймер можно сбрасывать в начальное состояние также программным способом.
- Правильный сигнал сброса — достаточный по длительности для того, чтобы контроллер начал перегружаться. Иногда есть соблазн подключить к RST входу какой-либо цифровой выход Arduino и устанавливать его в 0 когда надо перегрузиться. Это плохой подход к решению проблемы, т.к. такого сигнала может быть недостаточно по времени, хотя и не исключено, что в некоторых случаях это тоже будет работать..
- hard перезагрузка это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Дело в том, что есть еще понятие soft перезагрузки — это программный переход на 0-вой адрес. В принципе, это тоже полезная вещь, но с помощью нее невозможно перегрузить зависший контроллер Ethernet или взглюкнувший LCD.
Функции Watchdog
Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку:
Теперь нам доступны следующие три функции:
1. Запуск таймера watchdog:
Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.
2. Сброс таймера watchdog:
Думаю, понятно для чего нужна эта функция — пока вы вызываете ее, контроллер не сбросится. Как только система зависнет и эта функция вызываться перестанет, то по истечении заданного периода произойдет перезагрузка.
3. Отключение watchdog:
Отключение таймера watchdog.
Собственно, на этом можно было бы и закончить наше повествование о watchdog… но дело в том, что все это работает только в Arduino Uno, а на Arduino Mega, Mini и Nano все это работает ровно наоборот, т.е. не работает совсем :)
Почему watchdog не работает на большинстве современных плат Arduino
Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период, т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) — сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.
Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший).
Пути решения проблемы
Если посмотреть на исходники стандартного загрузчика (они есть в поставке платформы), то код отключения watchdog есть (!), но этот код вынесен под условную компиляцию и, по всей видимости, стандартный загрузчик скомпилирован без поддержки watchdog. По крайней мере в пакете платформы версии 1.5.2 (последней на момент написание статьи) дело обстоит именно так.
Для решения проблемы я даже прочитал man-ы самой платформы (:) и вроде бы там описана эта проблема и даже приведен код, который должен сделать всех счастливыми:
Здесь описывается функция get_mcusr(), которая должна вызываться сразу после сброса. Это достигается макросом "__attribute__((section(".init3")))". Я пробовал прописывать эту функцию во все секции, которые только возможно — да, она действительно запускается до функции setup() из скетча, но, к сожалению, гораздо позже 15ms (минимальная константа watchdog) после сброса…
Короче говоря, как я ни рыл интернет в поисках легкого решения проблемы, так ничего найдено не было. Я нашел только один способ заставить watchdog работать — перепрошить загрузчик… чем мы сейчас и займемся.
Проверка работоспособности watchdog
Прежде чем что-то прошивать, нужно проверить — вдруг ваша Arduino поддерживает watchdog. Для этого я написал небольшой скетч для теста. Просто залейте его, откройте монитор порта и смотрите, что будет происходить.
После перезагрузки (или подключения монитора к порту) встроенный светодиод мигнет, сигнализируя о том, что запустился загрузчик. Далее в секции setup происходит включение watchdog с таймером на 8 сек. После этого светодиод отсчитает нам это время и должна произойти перезагрузка.
Далее начинается самое интересное — если перезагрузка произошла и все повторяется в такой же последовательности, то вы имеете на руках Arduino, в которой загрузчик правильно обрабатывает watchdog. Если же после перезагрузки светодиод на 13-м пине начинает бесконечно мигать, то значит загрузчик не поддерживает watchdog. Здесь даже кнопка сброса не поможет. Для последующей прошивки нужно плату отключать от питания и после включения успеть прошить до первой перезагрузки.
Я протестировал 4 вида плат и только загрузчик в Arduino Uno сработал так как надо:
Watchdog не поддерживается загрузчиком: | Watchdog поддерживается загрузчиком: |
Как легче всего прошить новый загрузчик?
Прошивать загрузчик в Arduino можно с помощью отдельных программаторов, а можно собрать свой программатор с помощью той же самой Arduino. Т.е. любую плату Arduino можно превратить в программатор, залив туда специальный скетч.
Я не буду в этой статье описывать все премудрости создания программатора на основе Arduino, т.к. эта тема довольно подробно описана в интернете. В качестве программатора я использовал Arduino Uno. Как известно, прошивка производится через отдельный разъем ICSP, который есть почти на всех платах. В случае прошивки Arduino Pro Mini, у которого нет IСSP, подключение производится непосредственно к выводам.
Где взять загрузчик, который поддерживает watchdog?
Эта глава напоминает танцы с бубном и скорее всего можно сделать все как-то проще, но, увы, у меня по-другому не получилось.
Рекомендуется использовать загрузчики из пакета optiboot. В принципе, эти загрузчики идут в инсталляции самой платформы Arduino, но лучше скачать и установить последнюю версию optiboot отсюда. Установка заключается в двух шагах (возможно, это можно сделать как-то по-другому):
- Папка bootloaders\optiboot перезаписывается в C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot
- Файл boards.txt дописывается к файлу C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Далее перегружается среда разработки и в меню Сервис/Плата можно наблюдать новые платы с пометкой [optiboot]. К сожалению, при выборе этих плат происходят какие-то непонятные ошибки компиляции и появляются всякие другие странности… поэтому делаем еще проще. Открываем в любом текстовом редакторе файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt и меняем следующие строчки:
Для Arduino Nano:
menu.cpu.nano.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
Для Arduino Mini:
menu.cpu.mini.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
Следующая проблема в том, что загрузчика optiboot для платы Arduino Mega не существует в природе, т.к. в Mega больше памяти и используется другой протокол. Поэтому мы используем стандартный, но модифицированный загрузчик, который качаем отсюда. Файл переименовываем в stk500boot_v2_mega2560_2.hex и записываем в папку C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2.
Далее меняем в уже знакомом файле boards.txt следующую строчку:
mega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560_2.hex
Не пугайтесь, что файл модифицированной прошивки для Mega в 2 раза меньше стандартного — так вроде бы должно быть.
Процесс прошивки
После всех изменений можно прошивать загрузчики, выбирая в меню плат обычные платы (не [optiboot]!). В этом случае прошиваться будут именно те файлы hex, которые мы указали в файле board.txt.
Процесс прошивки может не стартовать и выдаваться ошибка:
Для решения этой проблемы откройте скетч программатора и в секции setup выберите другую скорость последовательного порта.
Во время заливки в Arduino Mega может появляться ошибка, которую следует игнорировать:
Заключительные манипуляции
Загрузчики optiboot имеют еще одну особенность — они увеличивают скорость загрузки скетчей, поэтому при использовании плат с optiboot нужно внести соответствующие изменения в boards.txt:
Для Arduino Nano:
menu.cpu.nano.atmega328.upload.speed=115200
Для Arduino Mini:
menu.cpu.mini.atmega328.upload.speed=115200
Предыдущую скорость порта лучше тоже запомнить, т.к. ее нужно будет использовать на платах со стандартными загрузчиками. Если такие изменения не сделать, то процессе заливки скетчей будет выдаваться ошибка, типа такой:
Назначение этих составных частей станет понятно из описания алгоритма функционирования 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 - это удобные способы следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Читайте также: