blackbit (20.07.2005 14:35, просмотров: 9180)
Методы помехоустойчивого программирования Краткий обзор методов помехоустойчивого программирования
для микроконтроллеров
(черновик)
1. Опрос цифровых входов с оценкой достоверности
Метод используется для повышения достоверности определения уровня на цифровом входе. Вход опрашивается несколько раз. Истинное значение на входе рассчитывается из считанных значений по тому или иному правилу (мажорирование, сложение по логическому "И" и т.д) . Существуют вариации этого метода.
Ограничения на применение:
Минимально требуемое общее временя отклика будет включать в себя время одного опроса входа, умноженное на число выполненных опросов, плюс время на обработку. Можно сказать, что скорость опроса приносится в жертву надежности.
2. Легализация входных данных
Устанавливается ограничение на диапазон разрешенных значений входных данных. В случае, если входные данные превышают установленные ограничения, то возможны следующие варианты:
- данные игнорируются;
- данные усредняются в потоке (пока имеет место выход за пределы диапазона)
Ограничения на применение:
Метод предназначен для использования в комплексе с другими методами обнаружения нарушений нормального процесса функционирования, т.к. сам не может установить корректность входных данных по контексту задачи.
3. Эстафетная передача
Метод позволяет динамично контролировать структуру вызовов подпрограмм и заключается в передаче специального байта-маркера между подпрограммами: основная программа передает маркер в первую вложенную (в цепочке вызовов) подпрограмму, та передает маркер следующей, вложенной подпрограмме второго уровня и т.д., пока маркер не достигнет конечной исполняемой подпрограммы, которая возвращает его обратно. Таким образом, маркер последовательно передается снизу вверх по цепочке и достигает основной программы, если все в порядке.
Маркер позволяет каждой подпрограмме проверить полномочия вышестоящий вызывающей подпрограммы на собственный вызов, а также факт корректной работы нижележащей цепочки вложенных вызовов нижестоящих подпрограмм.
В случае сбоя эстафеты происходит переход на обработку ошибок, перезагрузка и пр., в зависимости от требований задачи.
Ограничения на применение:
Большие накладные расходы на реализацию.
Избыточность данных и времени.
4. Маршрутизация исполняемого кода
Метод предназначен для защиты от несанкционированной передачи управления тем участкам кода, выполнение которых считается ответственным для данной задачи (запись во внешнюю/внутреннюю флэш-память или EEPROM, передача тревожных/критических сообщений по внешним каналам связи, включение цифровых выходов, управляющих силовым оборудованием и т.п.). Несанкционированная передача управления может произойти, например, в результате сбоев счетчика команд PC. Для реализации метода определяют защищаемые маршруты, включающие в себя участки кода, прохождение которых отмечается отдельными флагами в байте (слове) соответствия (установка контрольных точек). Каждый флаг соответствует завершению строго определенного участка кода. Выполнение участков кода какого-либо маршрута может быть распределено как во времени (включая прерывания), так и в пространстве - по всему объему программы.
Байт (слово) соответствия на момент проверки уже несет информацию о пройденном маршруте: совокупности частей кода, контроль исполнения которых обязателен. В начале входа в ответственный участок кода производится проверка байта соответствия (например, по маске). Если маршрут пройден корректно и полностью, т.е. требуемые флаги выставлены, то они сбрасываются и разрешается вхождение в ответственный участок кода. В случае ошибок в маршруте, вариант дальнейших действий зависит от требований задачи: управление отдается коду обработки ошибок, выполняется холодная/горячая перезагрузка или полная/ частичная реинициализация...
Ограничения на применение:
Код, обеспечивающий контроль маршрутов исполнения, желательно накладывать на уже готовую, отлаженную программу, после чего цикл тестирования программного обеспечения должен быть полностью повторен.
Метод не дает 100% гарантии, но позволят свести вероятность возникновения указанных ситуаций к очень малой величине, которая в целом будет определяться соотношением всего объема адресуемой памяти микроконтроллера к объему ответственного участка.
5. Блочная защита критических данных
Метод основан на использовании контрольной суммы. Критические данные помещают рядом, в одну область памяти (блок) и для нее вычисляют контрольную сумму, которую сохраняют в другом месте (можно в таблице контрольных сумм для разных блоков). Когда производится запись в эту область памяти, контрольная сумма заново пересчитывается и запоминается. Проверка с целью диагностики может быть выполнена в любой момент. Вместо контрольной суммы можно рекомендовать применение CRC.
Ограничения на применение:
Чем больше размер защищаемой памяти, тем дольше будет происходить ее проверка или расчет контрольной суммы при записи. При использовании CRC эта проблема усугубляется. После инициирования проверки до ее завершения запись в защищаемую память производится не должна. Если же это все-таки необходимо сделать, то защиту памяти - на период времени от последней проверки до текущего момента - можно считать отключенной, а пересчет контрольной суммы должен быть выполнен повторно. В случае, если в защищаемую память относительно большого размера запись производится часто и постоянно, то применение данного метода может потерять практический смысл.
6. Контроль аппаратного запрета записи.
Этот метод прост: микроконтроллер управляет аппаратным запретом/разрешением записи в память. Запрет на запись держится постоянно и снимается только на время записи данных в память.
Ограничения на применение:
Используемая память должна поддерживать аппаратный запрет записи, как правило, это внешняя память. Для внешней памяти требуются дополнительные аппаратные ресурсы микроконтроллера (например, цифровой выход).
7. Запись с откатом
Сбой может произойти во время самого процесса записи. Особенно уязвима внешняя память (EEPROM, flash и т.д.). Для защиты записи блока данных применяется механизмом транзакций, по аналогии с базами данных. В случае сбоя в процессе записи выполняется откат - использование последнего корректного значения, хранимого до сбоя.
Ограничения на применение:
Метод требует двойной ресурс по памяти для данных на реализацию отката.
Увеличенное время доступа к данным.
8. Заполнение неиспользуемой памяти
В случае сбоя счетчика команд, микроконтроллер может обратиться к неиспользуемому программой пространству памяти. Дальнейшие его действия зависят от содержимого этого участка [ов] памяти. Чтобы свести к минимуму негативные последствия от подобных ситуаций, неиспользуемая память заполняется определенным кодом, который зависит от архитектуры используемого микроконтроллера. Часто используется техника заполнения кодом холостой операции, а в конце участка - команда перехода на вектор сброса. Важно использовать только те команды, которые для данного микроконтроллера укладываются в минимально адресуемую единицу памяти. В противном случае, счетчик команд может попасть в середину или в конец команды, что может усугубить ситуацию, если в данной архитектуре не предусмотрено холостое выполнение по умолчанию подобных "кусков" команд.
В системе команд некоторых микроконтроллерах есть команды STOP (останов, с дальнейшим сбросом по WatchDog, если он задействован) или RESET (сброс). В зависимости от решаемой задачи их использование для заполнения может быть предпочтительнее.
Могут возникнуть трудности в тех архитектурах, которые используют страничное переключение памяти, хранящей код, причем за переключение страниц обычно отвечает отдельный регистр. В таких случаях память можно заполнять одной командой очистки этого регистра (что равноценно сбросу всех переключающих флагов этого регистра), а в конце ставится команда перехода на вектор сброса, который, в таком варианте, должен быть размещен в нулевой странице. Как правило, это не вызывает сложностей, поскольку системный вектор сброса именно в этой странице и находится. Правда, остается риск попадания счетчика команд непосредственно на адрес, содержащий команду перехода, с неизвестным значением регистра переключения страниц, но вероятность такого события намного меньше.
Ограничения на применение:
Реализация метода и, как следствие, его устойчивость зависят от архитектуры микроконтроллера.
9. Реинициализация
Этот метод касается, прежде всего, тех служебных регистров, состояния флагов которых (будучи один раз выставлены при включении во время инициализации) не должны изменяться в течение всего времени работы устройства. К таким регистрам можно отнести: регистры направлений и состояний цифровых портов ввода/вывода, регистры универсальных синхронных/асинхронных приемопередатчиков и цифровых интерфейсов, регистры различных задействованных в задаче периферийных устройств, замаскированные прерывания... Сама задача также может содержать собственные переменные, значение которых критично для нее и также должно оставаться неизменным. Произвольное изменение состояния критических регистров и ответственных ячеек памяти в результате сбоя (помехи) может привести к нарушению работы устройства. Суть данного метода заключается в регулярном выполнении реинициализации всех критических регистров и ячеек RAM. Реинициализация может иметь самый низкий приоритет выполнения (проводится в фоновом режиме), когда микроконтроллер свободен от выполнения главных задач.
Несколько особняком в этом методе стоит контроль неиспользуемых прерываний. В результате прохождения помехи может произойти несанкционированное демаскирование и установка флага-условия (IF) для любого неиспользуемого прерывания. Поскольку это прерывание никак не обрабатывается, то по выходу из процедуры обработки прерываний производится повторный ее вызов, что, по сути, приводит к зависанию микроконтроллера. Таким образом, эту часть кода реинициализации для неиспользуемых прерываний следует встраивать непосредственно в сам обработчик прерываний. Причем кроме повторного маскирования он должен выполнять и принудительный сброс флагов-условий.
Ограничения на применение:
Время между реинициализациями привязано к задаче, которая определяет максимально возможный промежуток времени, допускающий наличие испорченного значения в процессе выполнения.
Программные и временные накладные расходы, что может очень болезненно сказаться на обработчиках прерываний.
10. Иммунизация кода
Идея метода заключается непрерывной самопроверке кодом выполнения всех математических операций на том участке программы, который защищается (иммунизируется от внешних нежелательных нарушений выполнения). Как правило, на иммунизируемом участке кода разработчику приходится дополнительно решать задачу, обратную исходной задаче.
Простейший пример на языке С:
/* мат. операция:*/
a = b + c;
/* иммунизация: */
tmp=a-c;
if (tmp!=b) error(); //вызов функции контроля и обработки ошибок
Ограничения на применение:
Очень большие накладные расходы на память для кода самопроверки.
Расходы на временные переменные в RAM.
Большие временные затраты на выполнение кода самопроверки.
Повышенная сложность разработки.