Посібник для розробника за сторожовими таймерами
Вбудовані сторожові таймери
Сторожові таймери можна розділити на дві основні групи: вбудовані в процесор і зовнішні, додані розробником апаратної частини. У більшості мікроконтролерів є вбудовані сторожові таймери, але їхня ефективність варіюється в широких межах.
Як приклад можна навести мікроконтролери компанії Maxim (раніше Dallas) DS80C320/DS80C323 – варіанти мікроконтролера 8031, що існує вже досить давно. Сторожовий таймер цих мікроконтролерів має дві особливості. По-перше, його можна запрограмувати таким чином, щоб він генерував переривання, але через 512 циклів скидав мікроконтролер. Ця можливість дуже полегшує збереження налагоджувальної інформації. По-друге, можна обмежити доступ до регістрів сторожового таймера, для чого достатньо виконати дві специфічні парні інструкції переміщення, після чого відкривається вікно в три цикли, коли доступ до сторожового таймера стає можливим. Завдяки цьому суттєво знижується ризик випадкового відключення захисного механізму. Однак виникає питання, що станеться, якщо між цими інструкціями станеться переривання. Очевидно, доступ до регістрів сторожового таймера залишиться закритим, і його включення стане неможливим. Очевидно, що програміст повинен забороняти переривання на час виконання інструкцій, які дозволяють доступ до сторожового таймера.
32-розрядні мікроконтролери Freescale серії MCF520x суттєво відрізняються від DS80C320/DS80C323. Для звернення до сторожового таймера потрібно виконати два записи до його службового регістру, але у проміжку між зверненнями до регістру може виконатисябудь-яку кількість інструкцій. Це може стати причиною непрацездатності захисного механізму, якщо процесор працює неправильно та виконує випадковий код. З іншого боку, регістр стану скидання вказує, звідки надійшов сигнал скидання: ззовні або сторожового таймера, а це хороший спосіб реєстрації помилок після перезавантаження. Можна запрограмувати сторожовий таймер формування або тільки сигналу скидання, або переривання, але останній варіант дуже поганий. Якщо покажчик стека стане непарним, – у зв'язку зі збоєм або виконанням випадкового коду, – система увійде до стану Double-Bus Fault. Тоді переривання від сторожового таймера стане марним, і для відновлення роботи буде потрібно апаратне скидання.
Нова серія мікроконтролерів STMicroelectronics STM32F4 з ядром ARM Cortex-M4 має два незалежні сторожові таймери. Один працює від власного вбудованого RC генератора, і, отже, ніяк не залежить від того, що відбувається в процесорі. Існує також «віконний» сторожовий таймер (window watchdog – WWDT), до якого можна звертатися програмно, але не дуже часто. Це дуже ефективний спосіб застрахуватися від аварійного коду, за допомогою якого може виконуватися випадковий запис у механізм захисту та зупинення таймера сторожового, так як WWDT може генерувати переривання незадовго до сигналу скидання.
Цікаво, що деякі мікроконтролери мають свого роду аналоговий сторожовий таймер, який спрацьовує при перевищенні запрограмованого порогу на вході АЦП. Завдяки такій функції можна контролювати напругу живлення та короткочасні провали напруги. Для систем, що управляють небезпечними механізмами, це особливо важливо, і такий сторожовий таймер може використовуватися для переведення пристрою в безпечнестан перед тим, як харчування вийде за встановлені межі.
Багато мікроконтролерів Microchip серії PIC24F, а також мікроконтролерів LPC18XX та LPC43XX компанії NXP мають віконні сторожові таймери. Вони можуть бути налаштовані так, що одноразово включені, надалі не зможуть бути вимкнені програмним способом, що забезпечує більш надійний захист від виконання випадкового коду.
Однак жоден з представлених мікроконтролерів не повідомляє зовнішньому світу про перезавантаження. Розробнику, ймовірно, доведеться закріпити біт паралельного порту вводу/виводу для скидання зовнішніх пристроїв, якщо програмне забезпечення не може гарантувати належну повторну ініціалізацію.
Зовнішні сторожові таймери
На відміну від мікроконтролерів, лише кілька мікропроцесорів мають вбудовані сторожові таймери, які, до того ж, часто не забезпечують достатньої надійності, необхідної для конкретного додатка. У цих випадках проект має бути доповнений зовнішнім сторожовим таймером, який контролює роботу системи та, при необхідності, генерує сигнал скидання.
У системі, яка використовує більше одного процесора, доцільно, щоб кожен процесор контролював роботу інших.
На ринку представлено багато мікросхем сторожових таймерів. Загалом їхня робота програмним забезпеченням не контролюється, тому збій мікропроцесора вплинути на роботу зовнішнього сторожового таймера ніяк не може. Зазвичай, ці мікросхеми мають додаткову функцію скидання при подачі живлення, що дозволяє скоротити кількість зовнішніх компонентів.
Один із таких пристроїв випускається компанією Maxim (Малюнок 1). Часи тайм-ауту віконного таймера сторожового MAX6751 задаються за допомогою двох конденсаторів.
![]() | |
| Малюнок 1. | Час тайм-ауту віконного сторожового таймера MAX6751 встановлюється двома конденсаторами. |
Мікросхема TPS3126 компанії Texas Instruments, якщо не брати до уваги незначні відмінності, нагадує віконний сторожовий таймер. Недорогий прилад в корпусі SOT-23 пропонується у багатьох варіантах, що відрізняються діапазонами напруг і часу затримки (Малюнок 2).
![]() | |
| Малюнок 2. | Мікросхема Texas Instruments TPS3126 одночасно виконує функції монітора напруги живлення та сторожового таймера. |
Крім того, Texas Instruments має цілу родину пристроїв, включаючи TPS386000, які можуть контролювати чотири шини живлення і містять сторожовий таймер з фіксованою затримкою. Причому один із каналів мікросхеми розрахований на негативну вхідну напругу. Якщо на вході будь-якого каналу фіксується неприпустиме напруження, активується індивідуальний сигнал скидання. Дуже зручно, що виходи скидання мають відкритий стік та допускають з'єднання один з одним. Ці виходи також можна підключити до входів мікропроцесора, що дозволить визначити, у якому з джерел виникли неполадки та вжити відповідних заходів.
Функції сторожового таймера та контролю напруги одного джерела живлення виконує проста мікросхема ADM699 виробництва компанії Analog Devices (Малюнок 3).
![]() | |
| Малюнок 3. | Мікросхема Analog Devices ADM699 має дуже просту та зрозумілу архітектуру. |
Входи скидання деяких сучасних мікропроцесорів не допускають подачі сигналів з фронтами, що повільно наростають. Відкритий стік транзистора відповідає цим вимогам лише ву разі використання підтягуючого резистора з малим опором, що значно збільшує енергоспоживання. Для таких випадків Analog Devices випускає кілька пристроїв, зокрема мікросхему ADM6316 (Малюнок 4), що мають двотактний вихід.
![]() | |
| Малюнок 4. | Мікросхема сторожового таймера Analog Devices ADM6316 має двотактний вихід. |
Рекомендації з розробки програм
Навіть найкраща схема сторожового таймера буде поганим механізмом безпеки, якщо програмний код програми побудований некоректно. На жаль, при створенні багатьох систем розробники контролюють роботу сторожового таймера чи не в кожному рядку програмного коду, але не продумують весь проект загалом.
Найважливіше – гарантувати, що правильно працює весь код, а не лише його частина. Тому ніколи не поміщайте процедуру звернення до сторожового таймера в обробник переривання, і ніколи не довіряйте керування сторожовим таймером операційної системи реального часу (RTOS). Якщо програмний код викличе збій переривань, або навіть планувальника RTOS, може вийти так, що їх виконання продовжиться, і лічильник вартового таймера постійно скидатиметься.
В однопотокових додатках необхідно використовувати архітектуру подібну до кінцевого автомата. Приклади коду наведено у Лістингу 1.
Лістинг 1.Код звернення до сторожового таймера в однопотоковому додатку.
На початку основного циклу програми змінної state присвоюється значення0x5555. Потім викликається функціяwdt_a(), в якій перевіряється, чи це значення є правильним. Якщо ні, то відбувається зупинка та сторожовий таймер скидає систему. В іншому випадку значення змінноїstate змінюється шляхом додавання усунення. Зазначимо, що у цьому випадку звернення до сторожового таймера немає.
Наприкінці основного циклу (виконаний весь програмний код) змінної state надається нове значення, і викликається функціяwdt_b(). Тепер, якщо значення змінної відповідає очікуваному (а це означає, що не весь основний цикл був пройдений), виконання коду зупиняється і відбувається скидання мікропроцесора. Якщо ж основний цикл був пройдений повністю, і значення state коректно, сторожовий таймер скидається і змінної state присвоюється значення 0. Зауважте, що якщо відбудеться програмний збій і виклик функціїwdt_b(), значення змінної state буде неправильним, і станеться скидання.
У багатозадачних додатках кожне завдання при кожному запуску інкрементує значення асоційованої з нею змінної структури даних. Низькопріоритетні завдання періодично перевіряють ці змінні, щоб переконатися, що дані є коректними. Значення змінних, пов'язаних з завданнями, що часто виконуються, будуть великими, а у найнеактивніших завдань, навпаки, малими. Якщо виконання коду проходить успішно, завдання скидає вартовий таймер, обнуляє значення і повертається. В іншому випадку виконання завдання зупиняється і відбувається скидання сигналу сторожового таймера.
Якщо можливі виняткові ситуації, у яких неможливо відновлення чи продовження виконання коду, що може статися внаслідок розподілу на нуль чи помилки функції malloc(), необхідно написати обробник, який заборонятиме переривання та зупинки. Сторожовий таймер у такому разі зможе повернути систему до життя.
Висновки
Сторожовий таймер є останньою лінією оборони від програмних збоїв, і тому має бутирозроблений та реалізований дуже ретельно. Багато сучасних мікроконтролерів мають вбудовані сторожові таймери, які дуже складні та стійкі до програмних збоїв. Альтернативно можливе використання зовнішніх вартових таймерів, і, ймовірно, найкращим вибором буде таймер, що підтримує «віконний» режим. Також слід приділити пильну увагу структурі програми, щоб код, що неправильно виконується, не впливав на звернення до сторожового таймера, і не перешкоджав виконанню його основної функції – скидання процесора.
Переклад: Vadim на замовлення РадіоЛоцман



