ОБНОВЛЕНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ В РАСПРЕДЕЛЕННЫХ УПРАВЛЯЮЩИХ СИСТЕМАХ
Е.В. Петров
Статья посвящена проблеме замены программного обеспечения элементов распределенных управляющих систем. В ней рассматриваются основные принципы построения загрузчиков таких систем, предлагается вариант их классификации по различным критериям. Рассматривается пример обновления программного обеспечения в системе управления городским освещением.
Задача обновления программного обеспечения возникает в любой системе, имеющей программную составляющую, независимо от того, является ли эта система распределенной, управляющей или встроенной, так как даже после сдачи готовой системы в эксплуатацию возникает необходимость замены программного обеспечения элементов системы. Это может происходить по нескольким причинам - исправление обнаруженных в программе ошибок, добавление новых функций в систему в связи с ее развитием и т. д.
Если элементов системы, нуждающихся в обновлении программного обеспечения (ПО), немного (несколько единиц), то замену ПО можно провести вручную. Данный способ требует наличия квалифицированных специалистов, способных выполнить действия по перепрограммированию контроллера узла системы и дополнительного оборудования: компьютера, источника питания и т.д., необходимого для этой операции. Если же система состоит из множества (десятков, сотен) элементов, появляется ряд дополнительных проблем: узлы системы могут находиться в различных районах города или даже за его пределами, а также доступ к узлам системы может быть затруднен. Поэтому применение ручного способа замены ПО становится неэффективным и потенциально ненадежным, в связи с увеличивающимся влиянием человеческого фактора, а также достаточно дорогостоящим и длительным, так как требует транспорта и времени для перемещения между узлами системы.
Следовательно, необходим более простой, надежный, дешевый, быстрый и максимально автоматизированный способ замены ПО элементов системы.
Обновление программного обеспечения в распределенных управляющих системах имеет свои особенности, отличающие ее от аналогичной задачи для систем на персональных компьютерах. При решении задачи обновления программного обеспечения распределенной системы следует учитывать следующие особенности.
• Большое количество элементов системы, требующих обновления программного обеспечения.
• Территориальная распределенность элементов системы (узлы системы могут находиться на большом расстоянии друг от друга).
• Разнородность элементов системы (узлы системы могут иметь различные наборы аппаратных средств и выполнять разные функции).
• Совместимость версий программного обеспечения элементов системы.
• Сохранение работоспособности элементов системы во время обновления программного обеспечения (элемент должен продолжать выполнение своих функций во время перепрограммирования).
• Надежность и безопасность процедуры замены программного обеспечения элементов системы.
Независимо от конкретного способа замены ПО в узлах системы ключевую роль в этом процессе играет так называемый загрузчик контроллера, и именно он во многом определяет набор возможных способов обновления ПО элементов системы. Загрузчик -это специальная программа, находящаяся в загрузочной области памяти контроллера и выполняющая следующие функции:
• запись данных в пользовательскую область памяти;
• передача управления целевой программе.
Персональный компьютер
Л
Контроллер
Память
Пользовательская часть
(целевая программа)
Адрес целевой программы
<
Инструментальная программа
Загрузочный
сектор * (загрузчик)
Стартовый адрес
V.
Рис. 1. Принцип работы загрузчика
На рис. 1 представлена типичная схема перепрограммирования контроллера. Программирование осуществляется с помощью персонального компьютера, подключенного к контроллеру через инструментальный канал. Инструментальным каналом может быть любой интерфейс, поддерживаемый и контроллером, и компьютером, например, RS-232, RS-485, USB, Ethernet и т.д., но наиболее часто в качестве инструментального канала используется последовательный канал (RS-232). После включения питания или перезапуска контроллера управление передается по стартовому адресу, по которому расположен загрузчик. Загрузчик, получив управление, пытается установить соединение с инструментальной программой, которая должна быть запущена на персональном компьютере. Назначение инструментальной программы - передача исполняемого кода через инструментальный канал в контроллер. Тип протокола взаимодействия инструментальной программы и загрузчика в каждом конкретном случае может быть разным (запрос-ответ, подтверждение в окне и т.д.). В том случае, если загрузчику удается установить соединение с персональным компьютером, начинается процесс записи программного кода в пользовательскую память контроллера, в противном случае работа загрузчика прекращается. После окончания работы загрузчик передает управление по адресу целевой программы и начинается ее исполнение.
Из рис. 1 видно, что память контроллера разделена на две части - загрузочный сектор и пользовательскую область. Большинство микроконтроллеров поддерживает такое разделение на аппаратном уровне. В зависимости от типа микроконтроллера загрузочный сектор может располагаться либо в начале адресного пространства (в младших адресах), либо в конце (в старших адресах). Загрузочный сектор, как правило, имеет дополнительную защиту от случайного стирания, и именно в нем обычно располагается загрузчик. Таким образом, достигается дополнительная защита контроллера от некорректных действий пользователя. Даже после записи в микроконтроллер некорректной программы, благодаря независимому расположению загрузчика, сохраняется возможность записи в контроллер корректной программы без привлечения специальных программаторов.
Загрузчики можно разделить на несколько групп.
По назначению:
• Стартовый загрузчик, который записывает программу в исполняемую память (например, в оперативную) и передает ей управление. Кроме того, он может выполнять ряд подготовительных действий, необходимых для работы целевой программы (распаковка, декодирование и т.д.).
• Загрузчик программных модулей, который записывает исполняемый модуль в память по стартовому адресу и передает ему управление.
• Программатор памяти, который обеспечивает запись/чтение в память массива данных по указанному адресу. т.е. является гибким инструментом для доступа к внутренней памяти микроконтроллера и других модулей с программируемой памятью (EEPROM, DataFlash, FRAM и т.д.). Является удобным средством на этапе написания и отладки целевой программы.
По источникам данных:
• Данные загружаются из одного фиксированного локального канала передачи данных, как правило, RS-232 или RS-485.
• Данные загружаются из нескольких локальных каналов передачи данных, таких как RS-232, RS-485, I2C, SPI и т.д. Загрузчик прослушивает все доступные ему каналы передачи данных и реагирует на тот, по которому поступает сигнал начала программирования.
• Данные загружаются из нескольких различных каналов передачи данных, в том числе беспроводных (RS-232, RS-485, Ethernet, CAN, ZigBee, GSM/GPRS и т.д.).
По функциональным возможностям:
• Программный код загружается по фиксированному стартовому адресу в памяти.
• Блоки данных загружаются в различные программируемые устройства по указанным адресам.
• Загрузка производится с помощью специального загрузочного модуля. содержащего программируемые данные, а также описание последовательности действий, которые необходимо с ними произвести (в виде особой программы).
Технические характеристики загрузчика конкретного контроллера в большой степени зависят от имеющихся в данном контроллере ресурсов. Так, например, если микроконтроллер обладает всего несколькими единицами килобайт памяти программ, то реализовать в нем загрузчик, способный исполнять программы, наверное, не удастся. Скорее всего, это и не нужно: как правило, сложность контроллера и загрузчика связаны - чем сложнее контроллер, тем более сложный загрузчик в нем используется.
При построении системы обновления ПО необходимо сначала определить требования, которым она должна соответствовать, т.е. определить набор поддерживаемых функций и каналов передачи данных, с которыми будет взаимодействовать загрузчик, а затем соотнести эти требования с имеющимися аппаратными ресурсами (память, каналы передачи данных) и при обнаружении несоответствий внести изменения либо в требования, либо в аппаратуру.
В качестве примера систем обновления программного обеспечения рассмотрим систему загрузки обновлений ПО в СУНО (Система управления наружным освещением), разработанной и выпускаемой ООО «ЛМТ». Общая структура СУНО представлена на рис. 2. Система состоит из центрального диспетчерского пункта, в котором находится сервер, и множества электроподстанций, оборудованных контроллерами управления освещением. Узлы системы освещения связаны в структуру типа «звезда», центром которой является сервер СУНО. Узлами системы являются контроллеры в функции, которых входит установка заданного режима освещения, сбор и передача в ЦДП (центральный диспетчерский пункт) диагностической информации о состоянии подстанции и другие. Как правило, электроподстанции сети освещения распределены по террито-
рии всего города и находятся на больших расстояниях друг от друга, поэтому ручной способ обновления ПО контроллеров в данной системе является крайне неудобным.
Контроллер ПВ n
MCU GSM/GPRS модем
Память
Эл. счетчик
Реле
Контроллер ПВ 1
MCU GSM/GPRS модем
Память
Эл. счетчик
Реле
онтроллер ПВ 2
MCU GSM/GPRS модем
Память
Эл. счетчик
Реле
Рис. 2. Структура СУНО (ЦДП - центральный диспетчерский пункт, АРМ - автоматизированное рабочее место, ПВ - пункт включения)
К системе загрузки ПО СУНО выдвигались следующие требования:
• программирование контроллеров через последовательный канал;
• удаленное программирование контроллеров через GSM/GPRS;
• произвольный доступ к различным видам памяти контроллера (FLASH, FRAM);
• надежная замена ПО контроллера.
Аппаратура контроллеров позволяет реализовать все перечисленные требования: контроллер имеет инструментальный последовательный канал, GSM-модем, достаточные ресурсы памяти.
Система загрузки программного обеспечения СУНО состоит из двух больших частей - загрузчика контроллера пункта включения и серверной части. Загрузчик контроллера включает в себя все драйверы программируемых устройств, поддерживает обмен данными через последовательный канал и канал GSM, а также обеспечивает интерпретацию загрузочного модуля. Загрузочный модуль - это файл, состоящий из нескольких секций: сигнатуры, блока управления и блока данных. Сигнатура используется для идентификации загрузочного модуля в контроллере. Блок управления содержит программу, предписывающую, какие действия нужно выполнить с данными расположенными в блоке данных. Фрагмент такой программы на языке Forth приведен на рис. 3. Организация загрузчика как программируемой машины обусловлена тем, что такой способ обеспечивает максимальную гибкость и универсальность доступа к любым программируемым частям удаленного контроллера.
Набор команд загрузчика контроллера включает в себя около десяти инструкций, таких как ERASE - стереть указанный сектор памяти, COPY - скопировать из памяти-источника в память-приемник указанное количество байт, CHK - проверка корректности блока данных и др. Данная программа выполняет стирание семи секторов памяти программ, копирование из промежуточной памяти в основную память целевой программы, а также верификацию записанных данных.
REG STRGT TRGT FLASH P LD
REG DTRGT TRGT FLASH P LD
0x100 VERSION _CON
CHK
SECTORO ERASE
SECTOR1 ERASE
SECTOR2 ERASE
SECTOR3 ERASE
SECTOR4 ERASE
SECTOR5 ERASE
SECTOR6 ERASE
0x20000000 spcm3 offset @ + SECTORO spcm3 len @ COPY
0x20000000 spcm3 offset @ + SECTORO spcm3 len @ COMPARE
Рис. 3. Пример программы для загрузчика контроллера ПВ
В функции серверной части входит подготовка загрузочного модуля и передача его в контроллер пункта включения. В понятие подготовки загрузочного модуля входит: трансляция программы с языка Forth в машинный код, понятный загрузчику; объединение всех программируемых данных в единый блок данных; объединение программы и блока данных в загрузочный модуль. Кроме того, для каждой секции загрузочного модуля подсчитывается и записывается CRC, что обеспечивает защиту контроллера от записи искаженных во время передачи данных. После того как загрузочный модуль подготовлен, он может быть передан в пункты включения. Так как все элементы системы, требующие замены ПО, имеют непосредственное соединение с сервером, это избавляет от необходимости использовать алгоритмы распространения ПО между пунктами включения. С другой стороны, это означает, что сервер должен следить за тем, чтобы все пункты включения получили новое ПО.
ЦДП СУНО
Контроллер ПВ
L GSM/GPRS [ модем
aF
Dat д lash /
MCU (FLASH)
Память (FRAM)
Электросчетчик
Рис. 4. Система обновления программного обеспечения СУНО
Схема обновления ПО на примере одного пункта включения показана на рис. 4. Замена ПО производится в три этапа:
• доставка загрузочного модуля в пункт включения;
• перезапуск пункта включения;
• исполнение загрузочного модуля контроллером пункта включения.
Прием загрузочного модуля на стороне пункта включения производится в специальную промежуточную память (DataFlash), поэтому, даже если по каким-либо причинам процесс доставки прервется, ПО пункта включения не будет повреждено. После того как загрузочный модуль был полностью принят и сохранен в DataFlash, производится перезапуск пункта включения.
Третий этап начинается с того, что загрузчик контроллера проверяет корректность сигнатуры и CRC секций загрузочного модуля. Если на каком-либо шаге проверки обнаруживается ошибка, исполнение загрузочного модуля прекращается, и управление передается целевой программе. Таким образом, обеспечивается высокая надежность и безопасность замены ПО контроллера. Если же ошибок не обнаружено, начинается исполнение программы, а после этого управление передается обновленной целевой программе.
Описанная выше система обновления программного обеспечения используется в нескольких городах России и позволяет экономить массу времени и средств при возникновении необходимости перепрограммирования удаленных контроллеров. Данная система загрузки может использоваться и как средство доставки данных в узлы системы. Для этого требуется только составить соответствующую программу для загрузчика, скомпилировать загрузочный модуль и передать его в соответствующий узел системы.
Перспективным развитием системы загрузки программного обеспечения систем подобных СУНО является включение в их функции возможностей по замене ПО не только самого контроллера, но и других устройств, подключенных к нему, например, модема, электросчетчика, сервисных процессоров и других.
Литература
1. Обновление системного программного обеспечения распределенных встроенных систем / Постников Н.П.
2. Network Reprogramming / Jaein Jeong, Sukun Kim and Alan Broad // University of California, Berkeley. Aug 12, 2003
3. Downloadable Firmware in a Flash / Bill Gatliff // <URL: http://www.embedded.com>, Oct. 31, 2002