А. Мозжевилов Аппаратно-программные методы повышения надежности работы МКВопрос: Что такое POR, BOD, WDT? Ответ: Эти понятия часто применяются для обеспечения над╦жной работы МК. Для начинающего разработчика не всегда понятны эти аббревиатуры, точное назначение и конечная реализация этих модулей, хотя в общем вроде бы ясно, для чего вс╦ это нужно. Итак: POR (Power-On Reset) - схема, обеспечивающая начальный сброс МК при включении питания. Эти схемы могут быть внешними относительно МК, а могут быть и его частью. Многие современные МК имеют эту схему "на борту". Основная е╦ задача - в любой ситуации при включении питания удерживать сигнал (не обязательно внешний) сброса в активном состоянии, пока не стабилизируется напряжение питания (Vdd) и кварцевый резонатор (или внешний генератор) не войд╦т в стабильный режим работы. В момент включения, в зависимости от применяемых источников питания, напряжение питания может либо появляться практически мгновенно, либо плавно нарастать до номинального значения. Схема POR должна отслеживать все эти состояния, чтобы "запустить" МК в момент, когда напряжение питания достигло минимально возможного значения. В качестве примера рассмотрим реализацию функции сброса при включении питания в МК PIC16. При превышении Vdd уровня 1,6√1,8 В срабатывает внутренняя схема POR. По сигналу от POR запускается так называемый Power-Up Timer (PWRT), отсчитывающий дополнительную задержку в 72 мс от включения питания. Этот таймер может быть включен или выключен при программировании МК. Если в системе предполагается медленное нарастание Vdd, то очевидно, лучше включить таймер, чтобы дать дополнительное время на стабилизацию этого напряжения. После окончания работы PWRT запускается Oscillator Start-Up Timer (OST), который отсчитывает 1024 периода частоты со входа OSC1 и тем самым да╦т задержку на запуск и стабилизацию кварцевого резонатора. После этого снимается внутренний сигнал RST и начинается выполнение программы МК. Для упрощения в этом примере не было рассмотрено влияние сигнала внешнего сброса МК MCLR. В качества примера внешней схемы, реализующей POR для 5-В систем, рассмотрим микросхему ADM698 фирмы ANALOG DEVICES. При напряжении питания ниже 4,65 В сигнал Reset удерживается в активном состоянии. При превышении порога Vdd = 4,65 В сигнал Reset продолжает удерживаться в активном состоянии ещ╦ около 0,2 с для стабилизации параметров системы. По истечении этого времени, сигнал переводится в состояние "неактивен". При снижении Vdd ниже порогового уровня 4,61 В сигнал Reset снова становится активным. Гистерезис компаратора 40 мВ предохраняет от формирования лишних импульсов сброса при переходе через порог срабатывания. BOD (Brown-Out Detector) - это схема, которая отслеживает напряжение питания в рабочем диапазоне. В случае выхода из этого диапазона, на МК пода╦тся сигнал сброса и удерживается до тех пор, пока питающее напряжение снова не войд╦т в рабочие рамки. Отслеживается, как правило, только провал напряжения, а не его превышение. Защита от превышения питающего напряжения должна решаться схемотехникой источника питания. В современных МК схема BOD часто является встроенной. В некоторых МК можно регулировать порог BOD, например, в AT90S4433 фирмы Atmel имеется возможность выбора порога схемы 2,7 или 4,0 В, что может быть использовано в системах и с 3-В и с 5-В Vdd. Микросхема ADM698, привед╦нная как пример внешней схемы POR, по сути дела является и схемой BOD, поскольку отслеживает ещ╦ и провалы Vdd. Многие МК, содержащие схему POR, не содержат схемы BOD. Обратной ситуации, как правило, не встречается. Для таких МК в качестве схемы BOD достаточно применение, например микросхемы MC34164 фирмы Motorola. Микросхемы выпускаются в корпусе ТО-92 для систем с 3- и 5-В питанием и являются детектором понижения напряжения. При входном напряжении ниже порогового выходной транзистор открыт. При превышении порога транзистор закрывается. Выход микросхемы может быть непосредственно соедин╦н с входом МК с низким активным уровнем Reset c подтяжкой резистором к напряжению питания. Российская промышленность тоже выпускает аналогичные устройства - серию К1171СПхх (аналог Mitsumi PST529) на различные пороговые напряжения. Эти микросхемы могут быть применены и в качестве схемы POR, но с достаточной осторожностью. Дело в том, что при быстром нарастании Vdd времени нахождения сигнала Reset в активном состоянии может оказаться недостаточно, чтобы МК начал корректно работать. WDT (Watch Dog Timer). Дословный перевод - "сторожевая собака", которая должна "гавкнуть", если на не╦ долго не обращают внимания. WDT предназначен для контроля работы программы микроконтроллера. МК должен периодически обращаться к WDT (иными словами, сбрасывать WDT), говоря тем самым: "я живой". Если обращения к WDT нет в течение некоторого времени (таймаута), то WDT генерирует сигнал сброса определ╦нной длительности, пытаясь таким образом восстановить работоспособность МК. WDT может быть внешним, а может быть реализован в самом МК. В случае внешнего WDT, для регенерации используется вывод МК, изменение сигнала на котором свидетельствует о нормальной работе и продлевает период переинициализации. Если WDT внутренний, то для его сброса могут быть использованы специальные команды MK или обращение к определ╦нным регистрам. К сожалению, WDT, реализованные в самих МК, обладают рядом недостатков. Как правило, внутренний WDT использует в качестве задающего генератора собственную RC-цепь. Некоторые МК используют для этого основной генератор (например, INTEL N80C51GB, на сегодняшний день уже снятый с производства), что не желательно, поскольку его остановка остановит и работу WDT (например, при случайном входе в режим "sleep", в котором генерация отключается). Кроме того, часто внутренние WDT делают включаемыми/выключаемыми программно каким-то набором магических последовательностей. Например, в МК AVR фирмы Atmel WDT включается одной командой, а для его выключения придумана определ╦нная последовательность из команд обращения к специальным регистрам. Но если есть принципиальная возможность выключения WDT, то теоретически оно может произойти и из-за какого-то сбоя в работе (питании). В Z8 WDT может быть включен только в первые 64 такта выполнения программы, а включенный WDT не может быть выключен. Наиболее удачно реализован WDT в микроконтроллерах PIC фирмы Microchip и SX фирмы Ubicom - в них необходимость включения WDT зада╦тся на этапе "зашивки" МК, и WDT не может быть выключен программно. Потребность во включении и выключении WDT на разных участках программы достаточно сомнительна, поскольку сама программа может "повиснуть" и на участке с отключенным сторожевым таймером. Функция включения и выключения WDT программой самого МК может иметь смысл, например, в случае принудительного его отключения перед входом в режим "Sleep", где каждый микроампер может быть дорог, а генератор WDT вс╦-таки потребляет ток. Выпускается достаточно большое количество отдельных микросхем с WDT и, как правило, функционально они содержат и POR и BOD. Например, ADM699 фирмы Analog Devices функционально повторяет ADM698 с дополнительной функцией WDT. Вопрос: Как правильно выбирать активные уровни сигналов. Ответ: МК в процессе работы управляет различными устройствами при помощи каких-либо драйверов. Необходимо таким образом выбирать (подключать) драйверы или схемы управления, чтобы при подаче на МК сигнала Reset схема входила в состояние, эквивалентное логическому "выключено". Пусть, например, МК управляет микросхемой ADM485 - драйвером интерфейса RS485. Все устройства включены в одну шину и являются ведомыми. Ведущее устройство последовательно опрашивает все ведомые и получает ответы. У одного МК произошло аварийное понижение напряжения питания, и активизировался сигнал Reset. МК перестал выполнять программу, и все порты переключились в состояние начальной инициализации. В этом случае схема подключения ADM485 к МК должна быть такой, чтобы драйвер ADM485 включился на при╦м, иначе неработающее устройство парализует работу всего канала связи. Если порт МК, управляющий сигналом драйвера DE при рестарте переводится в Hi-Z состояние, то лучше подтянуть его к общей шине резистором 10 кОм для над╦жного удержания в неактивном состоянии. Если используется порт МК, в который при активном сигнале "Сброс" выводится логическая "1" (многие МК с ядром MCS51 работают именно так), тогда необходимо предусмотреть инверсию этого сигнала между выводом порта и сигналом DE драйвера ADM485. Для этого можно использовать простейший ключ, например BS170. Вопрос: Как выбрать момент сброса WDT? Ответ: Обычно WDT требуют периода обращения к ним в течение 0,03√3 с. Прич╦м внешние WDT имеют период более одной секунды. Встроенные в МК WDT могут настраиваться на различные периоды при помощи внутренних регистров контроллера. В общем случае, период сброса WDT должен всегда быть меньше его таймаута на генерацию сигнала "Сброс". Программа обычно состоит из процедур обработки прерываний и фоновой программы. Сбрасывать WDT в процедуре прерывания крайне не рекомендуется, поскольку вполне может случиться так, что основная программа по каким-то причинам перестала выполняться, а процедура прерывания (например, от внутреннего таймера) продолжает работать. Сброс WDT в процедуре прерывания можно сделать лишь в том случае, если время выполнения этой процедуры может превысить таймаут самого WDT. В этом случае перед сбросом WDT неплохо проверить флаги, контролирующие работу фоновой программы. Например, можно ввести сч╦тчик, который будет уменьшаться в прерывании, и при достижении значения "0" WDT перестанет сбрасываться. Основная программа будет устанавливать этот сч╦тчик как признак е╦ работы. Но такая ситуация скорее исключение, чем правило. Обычно WDT сбрасывается в самом внешнем цикле программы (например, функция main(), если программа написана на языке Си). При необходимости перед сбросом WDT выполняется ряд контрольных проверок. Во многих системах в том или ином виде используется отсч╦т реального времени. Для этой цели обычно используется один из внутренних таймеров МК, переполнение которого вызывает прерывание. Для контроля работоспособности таймера реального времени в основной программе перед сбросом WDT выполняется проверка флага, установленного в прерывании от таймера: disable_interrupt(); Если в системе используются другие циклические прерывания, то в проверку перед сбросом WDT можно внести и их флаги. Вопрос: Как ещ╦ можно проверить правильное функционирование программы? Ответ: Метод, предложенный Дмитрием Кузнецовым. Если уровень вредных воздействий не превышает уровня применяемой защиты, то собранное из исправных компонентов устройство должно работать над╦жно. Однако, при попадании устройства в "экстремальные условия" ("случайное" увеличении уровня помех, деградация компонентов и проявление дефектов) над╦жность работы не может быть гарантирована. Особенно это касается "ответственных" систем. Можно серь╦зно увеличить вероятность выявления ненад╦жной работы с помощью введения в программу диагностического кода, работающего одновременно с основной задачей, который также подвержен вредным факторам. Основными критериями этой диагностики являются: максимальное приближение к условиям работы основной задачи и полная предсказуемость результатов исполнения диагностического кода.
Метод, предложенный Владимиром Василевским. Как правило, любое устройство имеет несколько состояний, или режимов работы. Например, SetUp, Test и нормальный рабочий режим. Под влиянием каких-то причин программа может выскочить из рабочего режима в SetUp или Test, да и остаться там навечно. Надо делать так, чтобы все вспомогательные состояния, кроме основного рабочего режима, имели выход, например, по таймауту. И если таймаут наступил, логично будет сделать системе сброс. Следует также проверять корректность аргументов на входе в функции, если некорректны - делать сброс. Полезно проверять указатель стека в различных местах программы. Если он не такой, как должен быть, делать сброс. Это говорит о том, что мы пришли в данную точку неизвестно каким пут╦м. Ещ╦ одна типичная ситуация: ожидание какого-нибудь бита готовности чего-то в цикле. Всегда надо иметь таймаут - защиту. Да и вообще писать следует так, чтобы ни в каких случаях и ни при каких параметрах невозможны были бесконечные циклы. Вопрос: Что делать с неиспользованным объ╦мом ПЗУ? Ответ: Как правило, программа не занимает всю область ПЗУ, вплоть до последнего байта. В этом случае вполне вероятен случайный переход на "пустую" область. Для защиты от этого можно неиспользуемую область заполнить кодом операции "NOP", а в самом конце поставить переход на инициализацию. В ряде случаев заполнение может и не потребоваться. Например, для МК с ядром MCS51 код 0xFF, практически всегда означающий "ст╦ртую" ячейку ПЗУ, представляет однобайтовую команду "MOV R7,A". В этом случае вполне достаточно поставить в конечном адресе ПЗУ переход на процедуру инициализации. Прич╦м иногда именно на процедуру, а не стартовый вектор, поскольку случайный переход на "пустую" область может произойти из процедуры прерывания. В этом случае внутренняя логика обработки прерываний МК может быть не закончена, и устройство не сможет продолжать работать корректно даже после формального перехода на стартовый вектор. Для MCS51 можно использовать следующую процедуру вынужденного рестарта: CLR A Команда RETI гарантированно завершит логику прерываний, если это потребуется. Иначе она будет эквивалентна команде RET. Для каждого семейства МК необходимо обратить внимание на особенности обработки прерываний. Не исключено, что для многих МК будет достаточно и простого перехода JMP 0x0000. Если в системе есть WDT, а время восстановления не критично, то вполне можно зациклить программу и ожидать сброса. Поскольку WDT аппаратно сбросит МК, то можно быть уверенным, что инициализация произойд╦т наиболее корректно. Wait_wdt_restart: JMP $ Вопрос: Что делать с неиспользуемыми векторами прерываний? Ответ: На неиспользуемые векторы прерываний нужно поставить ловушки. В нормально работающей системе не должно возникать неиспользуемых прерываний, поскольку они просто не разрешаются. Если вдруг произошло неиспользуемое прерывание, его можно считать сбоем МК, прич╦м нельзя уверенно сказать, что сбой повлиял на работу только таким образом, поэтому МК можно сбросить способами, описанным ранее. Или можно разрешить продолжить работу, просто запретив это прерывание. Разработчик сам должен решить, каким способом выйти из этой ситуации. Вопрос: Как обеспечить стабильную связь с "внешним миром"? Ответ: Устройства могут работать обособленно или иметь какую-то связь с другими устройствами, обычно по последовательному интерфейсу. На другом конце может стоять обычный терминал для ввода/вывода информации, или при╦мопередатчик данных, работающий по определ╦нному протоколу. Устройство поддерживает протокол обмена по этому последовательному каналу. Не исключена ситуация, когда "случайно" изменяются настройки интерфейсных схем или внутренней периферии самого МК, и при╦мопередатчик начинает работать неправильно. Например, может измениться скорость передачи, настройки паритетов и так далее. Например, внешний при╦мопередатчик может перестать работать из-за небольшой просадки по питанию, которую МК "не почувствовал". Для выхода из подобных ситуаций можно использовать периодическую инициализацию периферии при наступлении определ╦нного таймаута в обмене данными по последовательному каналу. В машине состояний обработчика протокола выделяется состояние, переход в которое характеризует канал связи как рабочий, и там устанавливается сч╦тчик таймаута. В фоновом цикле этот сч╦тчик уменьшается, и по достижении значения "0" производится повторная инициализация при╦мопередатчика. Вопрос: Какие особенности отладки существуют? Ответ: Можно выделить несколько фаз в разработке устройства: разработка схемотехники, написание и отладка программы и выпуск для конечного пользователя. Применение средств повышения над╦жности достаточно сильно отличается для отлаживаемых и выпускаемых устройств. Все рассматриваемые программные методы должны применяться скорее в выпускаемых устройствах. Дело в том, что применение большинства этих методов сразу при отладке может создать иллюзию работоспособности устройства, поскольку первопричиной срабатывания защиты может стать не какой-то случайный фактор, а банальная ошибка в программе или ошибочная разводка платы. При отладке все программные методы защиты должны быть несколько модифицированы, чтобы иметь возможность сообщить программисту о возникновении нештатной ситуации. Например, вызов неиспользуемого прерывания или "сл╦т" настроек при╦мопередатчика может произойти из-за неправильной инициализации нужных регистров или инициализации в ненужные моменты времени. В программе всегда (а во время е╦ написания и отладки, особенно) могут оказаться ошибки, результатом которых либо регулярно, либо при каком-то редком стечении обстоятельств будет неправильное обращение к периферии МК, запись в "неправильное" место ОЗУ данных либо неверных данных в правильное место. Конечное влияние ошибки в программе может проявиться в совершенно неожиданном месте и может быть скрыто от программиста уже примен╦нными методами защиты. Поэтому при отладке обо всех нештатных ситуациях нужно как-то сообщить - зажечь светодиод, вывести строчку с кодом ошибки в отладочный терминал или записать что-то в EEPROM для дальнейшего анализа. Если какая-либо ошибка периодически возникает "на столе", то есть фактически в стерильных условиях, стоит задуматься, а правильно ли устройство спроектировано и не содержит ли оно ошибки в программе или схемотехнике аппаратуры. |
Ваш комментарий к статье | ||||