Чому програми зупиняють сторожовий таймер на MSP430?


11

Багато зразкових програм для MSP430 мають свій перший рядок:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Чому вони роблять це?

Відповіді:


15

За замовчуванням увімкнено таймер сторожового собаки (WDT), це корисна річ у складніших програмах, але запускає багато нових людей. Вони часто не будуть обслуговувати WDT у своєму коді або включати процедуру переривання обслуговування (ISR) для обробки події WDT, тому, коли їх чіп продовжує скидатись, вони сильно засмучуються. Крім того, зразкові програми здебільшого не намагаються продемонструвати WDT, тому вони вимкнено.

Редагувати: сторожовий таймер міг би бути названий "вимикачем мертвих людей". Його поведінка за замовчуванням - це скидання мікроконтролера, якщо прошивка періодично не дає йому знати, що все працює нормально. Це відомо як "годування собаки" або "удари собакою". Таким чином, якщо ваша прошивка застрягне в циклі або іншим чином перестане працювати, як очікувалося, сторожовий пес не буде подаватися і скине чіп (сподіваємось до свіжого, робочого стану).

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


+1 спасибі, хоча я і інші читачі можуть це шукати, було б непогано знати дуже коротке обґрунтування того, чому WDT скидає чіп. (не хвилюйтеся, якщо ви додасте його, ваша відповідь достатньо хороша, щоб прийняти таку, яка є (зачекавши ще кілька годин на інші можливі відповіді))
necromancer

я думаю, я повинен був сказати у питанні, що я абсолютно новачок, який також не має поняття, що таке таймер сторожового собаки :)
necromancer

2
@necromancer Ну, не хвилюйтесь, я додав відповідну інформацію.
Самуїл

2
Самуель - майже у всіх випадках НЕ слід використовувати ISR для скидання WDT. Майже завжди це неправильно робити. Перерви можуть весело тривати, поки інші частини програми вимикаються на землі. Іноді це можливо / необхідно (при спілкуванні між ISR та іншими частинами мікропрограмного забезпечення, яке ефективно встановлює другий рівень WDT), але не слід пропонувати новачку як перший підхід.
Spehro Pefhany

9

Окрім думки Самуеля про людей, які випадково вимикають WDT, є ще одна важлива причина, чому її слід спочатку відключити.

Навіть якщо ваша програма, як правило, здатна правильно скинути таймер, вона може не зробити цього під час коду ініціалізації з двох причин:

  • Ініціалізація може зайняти більше часу, ніж одна галочка WDT, але вимагати відключення переривання. Це означає, що якщо ви покладаєтесь, скажімо, на ISR таймера для скидання таймера, ви можете потрапити в нескінченний цикл завантаження.
  • Ви не обов'язково знаєте стан реєстру таймерів на всіх MCU (тобто наступна галочка може бути набагато швидше, ніж очікувалося, оскільки реєстр може не починатися з 0).

Як результат, є доброю практикою відключити WDT як перше, що ви робите, навіть якщо ви ніколи цього не вмикали .

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


+1 дякую за додавання до відповіді. я виявив, що ви можете вимкнути його до ініціалізації за допомогою int _system_pre_init(void)функції, яка виконується ранішеmain
necromancer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.