Почему программы останавливают сторожевой таймер на MSP430?

11

Многие примеры программ для MSP430 имеют первую строку:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Почему они это делают?

некромант
источник

Ответы:

15

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

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

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

Самуил
источник
+1 спасибо, хотя я и другие читатели можем посмотреть его, было бы неплохо узнать очень краткое обоснование того, почему WDT сбрасывает чип. (не беспокойтесь о его добавлении, ваш ответ достаточно хорош, чтобы принять его таким, какой он есть (после ожидания еще нескольких часов для других возможных ответов))
некромант
Я думаю, я должен был упомянуть в вопросе, что я абсолютный новичок, который также не имеет ни малейшего представления о том, что такое сторожевой таймер :)
некромант
2
@ necromancer Ах, не беспокойтесь, я добавил соответствующую информацию.
Самуил
2
Самуил - почти во всех случаях вы НЕ должны использовать ISR для сброса WDT. Это почти всегда неправильно. Прерывания могут весело продолжаться, пока другие части программы отключены в а-ля стране. Иногда это возможно / необходимо (при связи между ISR и другими частями прошивки, которая эффективно устанавливает второй уровень WDT), но не следует предлагать новичку в качестве первого подхода.
Спехро Пефхани
9

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

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

  • Инициализация может занять больше времени, чем один тик WDT, но требует, чтобы прерывания были отключены. Это означает, что если вы полагаетесь, скажем, на таймер ISR для сброса таймера, вы можете попасть в бесконечный цикл загрузки.
  • Вы не обязательно знаете состояние регистра таймера на всех MCU (т. Е. Следующий тик может быть гораздо раньше, чем ожидалось, поскольку регистр может не начинаться с 0).

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

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

SAPI
источник
+1 спасибо за добавление в ответ. я обнаружил, что вы можете отключить его перед инициализацией, используя int _system_pre_init(void)функцию, которая выполняется раньшеmain
necromancer