Путешествие на Contiki

29 ноябрь, 2006 - 16:37Андрій Кухар

В последние несколько лет наблюдается рост популярности решений на основе беспроводных сенсорных сетей (Wireless Sensor Networks, WSN). И это неудивительно, так как достижения в сфере коммуникаций, электроники и программного обеспечения открыли дорогу их применению в различных областях человеческой деятельности.

WSN

Беспроводные сенсорные сети используются в таких приложениях, где невозможно, трудно или дорого эксплуатировать проводные датчики. Это военные, научно-исследовательские и медицинские проекты, зоны бедствий, системы управления трафиком, «умные дома» и пр. WSN составляют небольшие независимые устройства, обладающие способностью измерения каких-либо показателей, как то: температуры, звука, вибрации, давления, движения, загрязнения. Такие приборы называются сенсорными узлами (sensor nodes, далее будем называть их просто узлами); каждый из них, кроме, собственно, одного или более сенсоров (датчиков), оборудуется микроконтроллером, радио-приемопередатчиком или другим средством беспроводной связи, а также автономным источником питания. Размеры узлов варьируются от аппаратов с обувную коробку до таблеточных. Цены также разнятся – от нескольких центов до сотен долларов. На размер и цену узла влияют его энергопотребление, объем памяти, вычислительные способности и полоса пропускания. Энергия – это самый дефицитный ресурс, определяющий продолжительность работы. Из-за того что WSN могут развертываться в отдаленных и подчас враждебных средах, алгоритмика и реализация ПО и протоколов имеют первостепенное значение, они должны обеспечивать максимальное время функционирования узлов, надежность и отказоустойчивость, автоматическое (ре)конфигурирование. Об одной из платформ, успешно справляющейся с этими задачами, мы и поговорим.

Программный «плот» Адама Данкелса

Путешествие на Contiki
Тот самый «Кон-Тики» с интернациональной командой

В 1947 г. для доказательства теории, что предки полинезийцев приплыли на острова восточной части Тихого океана из Южной Америки, норвежец Тур Хейердал (Thor Heyerdahl) и пять его товарищей осуществили путешествие из порта Кальяо побережья Перу до островов Рароиа архипелага Туамоту. Водную пустыню протяженностью 4300 миль за сто один день исследователи преодолели на бальзовом плоту – точной копии древних перуанских и эквадорских приспособлений V в. н. э. Плот назывался «Кон-Тики» в честь бога Солнце-Тики, по преданиям и легендам племен именно он привел предков полинезийцев на острова.

А в 2003 г. появилась встраиваемая операционная система Contiki, которая исполняется на множестве различных аппаратных платформ, включая небольшие «древние» компьютеры. Ее разработал Адам Данкелс (Adam Dunkels) совместно с другими сотрудниками группы сетевых встраиваемых систем Шведского института компьютерных наук (Swedish Institute of Computer Science, SICS), что в г. Киста. ОС полностью написана на языке C и благодаря тому, что SICS является независимой неприбыльной исследовательской организацией, в которой либерально относятся к программным решениям, распространяется на условиях лицензии BSD, допускающей использование в коммерческих продуктах. Рассмотрим, как реализована эта система.

Путешествие на Contiki
ESB (Embedded Sensor Board) производства Scatterweb, оснащенная микроконтроллером TI MSP430 с 2 KB оперативной памяти и 60 KB постоянной флэш-памяти, датчиками измерения вибрации, температуры, инфракрасного излучения, звука, углов наклона и движения – популярная платформа для Contiki

Ядро Contiki событийно-управляемое (event-driven, ED), небольшое как в отношении объема исходного кода, так и утилизации памяти. Оно отвечает исключительно за выполнение задачи защиты ресурсов, а абстрагирования не реализует – абстракции предоставляются надстроенными над ядром библиотеками. То есть концептуально ядро ОС вполне можно отнести к экзоядрам (об этой архитектуре мы уже некогда рассказывали) с некоторой оговоркой – оно осуществляет распределение процессорного времени, но не памяти, поскольку проектировалось для аппаратуры без блока управления памятью (MMU). Последнее обстоятельство ведет к тому, что все процессы исполняются в одном адресном пространстве.

В ядро ОС входит легковесный диспетчер (scheduler), отправляющий события запущенным процессам. События бывают двух видов: асинхронные и синхронные. Первые подобны отсроченным процедурным вызовам – они ставятся ядром в очередь и передаются процессам некоторое время спустя. Вторые возбуждают немедленное планирование процессов. Управление возвращается обратно процессу-инициатору, после того как целевой завершает обработку события. Кроме диспетчера, ядро имеет механизм опроса (polling), представляющий собой событие высокого приоритета, инициируемое в промежутках между асинхронными событиями. Он, как правило, используется процессами, которые оперируют оборудованием, например для проверки обновлений статуса устройств. Когда опрос запланирован, в приоритетном порядке вызываются все процессы, где он применяется.

Contiki обладает вытесняющей многозадачностью. Эта характеристика ОС реализована как библиотека и может при необходимости компоноваться с приложениями, которые требуют такой модели функционирования.

Путешествие на Contiki
Порт Commodore 64 с запущенным Web-браузером

Принципы ED-программирования популярны при написании программ для встраиваемых систем и узлов WSN. В отличие от многопотоковых систем в ED нет необходимости выделять память под стеки потоков, благодаря чему можно существенно экономить память, которой в рассматриваемом оборудовании мизер (по меркам современных ПК). Однако эта модель обязывает разработчика прибегать к стилю конечных автоматов (заключающемся в широком употреблении конструкций switch/case), когда программы сравнительно сложно создавать, поддерживать и отлаживать. Поэтому специалисты из SICS предложили новаторскую абстракцию программирования под названием протопотоки (protothreads) реализующую компромиссный вариант, – позволяя писать ED-программы в потоковом стиле. По сути, протопотоки представляют собой те же потоки, только работающие с одним общим стеком. Они запускаются из C-функций. Переключение контекста осуществляется посредством перемотки стека (stack rewind). Протопоток требует для хранения состояний только два байта памяти, а издержки по времени исполнения – порядка нескольких циклов процессора. Кроме того, они реализованы на «чистом» С без использования машинно-ориентированного ассемблерного кода. Данная концепция дает возможность существенно снизить сложность программ, разработанных с применением парадигмы конечных автоматов, радикально уменьшить количество состояний и переходов, сократить объем кода.

ПО, записанное на узлах, нередко требует обновления либо для добавления в систему новой функциональности, либо для исправления ошибок в ней. Поэтому динамическая перепрошивка WSN считается довольно важной проблемой. Но ограничения полосы пропускания канала связи, энергии и памяти (обычно ее всего несколько килобайт) узлов, малая вычислительная мощность и отсутствие технологий защиты памяти делают эту задачу крайне непростой. Для ее решения существует несколько механизмов: полная замена образа ОС, основанные на бинарных различиях методы, виртуальные машины, загружаемые модули нативного кода. Однако все они в той или иной мере неэффективны в плане энергопотребления из-за необходимости в нестандартных форматах файлов или средств. Опять же, разработчики нашли компромиссный вариант. Они реализовали динамический компоновщик времени исполнения, связывающий, переносящий и загружающий приложения и сервисы в виде объектных файлов формата ELF, который является стандартным для многих ОС для персональных компьютеров и рабочих станций и пригоден даже для узлов WSN. Этот механизм фактически платформонезависим – портирование с узла одной платформы на другую потребовало у программистов из SICS внесения лишь небольших модификаций в специфичный для архитектуры модуль кода.

Путешествие на Contiki
GTK-порт Contiki в среде FreeBSD

ОС имеет набор CTK (Contiki Tool-Kit), обеспечивающий примитивы графического пользовательского интерфейса, такие как обычные и диалоговые окна, меню и виджеты (разделители, метки, кнопки, гиперссылки, текстовые поля и пиктограммы). CTK разработан высокомодульным, дабы позволить одной и той же программе функционировать на широком ассортименте мониторов, начиная от графических терминалов, виртуальных дисплеев вроде VNC и заканчивая текстовыми (в окне терминала из Telnet). Графический набор Contiki разделен на три модуля: внутренний (ctk), который отвечает за взаимодействие пользователя с приложениями, внешний (ctk-draw), прорисовывающий окна на экране, и интерфейсный (ctk-arch), перехватывающий нажатия клавиш и перемещения мыши.

Для связи с Интернетом применяется предназначенная для стесненных в ресурсах систем реализация TCP/IP-стека uIP. Она поддерживает следующие протоколы: TCP, IP, ARP, SLIP, ICMP (ping) и Unicast UDP. Количество TCP-подключений неограничено. uIP крохотен, его код занимает всего несколько килобайт в постоянной памяти и несколько сотен байт – в оперативной. В пакет стека входят также Web-сервер и клиент, SMTP-клиент, Telnet- и DNS-серверы. Сейчас ведутся работы над поддержкой PPP. Стоит отметить тот немаловажный факт, что uIP отлично документирован, а исходный код закомментирован (почти каждая строка).

Путешествие на Contiki
VNC-сервер, запущенный на микроконтроллере Atmel AVR

Наконец, заслуживает внимания Contiki VNC-сервер, обеспечивающий удаленный доступ к рабочему столу системы практически из любой ОС через Интернет. Он является портом uVNC и подключается к CTK как драйвер. На данный момент uVNC имеет статус экспериментального ПО и представляет собой минимизированную версию VNC для встраиваемых систем, в особенности недорогих микроконтроллеров без средств отображения графической информации. Весь экранный вывод передается через сеть, а события клавиатуры и мыши от удаленного хоста посылаются обратно к CTK.

Утоление ностальгии

Но кроме роли программной начинки узлов сенсорных беспроводных сетей, у Contiki есть и другое, неординарное применение. С момента своего появления данная ОС была успешно перенесена более чем на два десятка платформ. Среди них старенькие домашние компьютеры производства Commodore и Atari, игровые приставки вроде Game Boy и Nintendo Entertainment System, с которых можно получать доступ в Интернет и заниматься Web-серфингом! Скажем, тот же чрезвычайно популярный в свое время (он был выпущен в 1982 г.) на западе микрокомпьютер Commodore 64, обладающий 8-битовым процессором 1 MHz, 64 KB оперативной памяти, 20 KB постоянной памяти, 16-цветной графикой и 40-строчным экраном, оказывается вполне применимым для этого, поскольку для своей базовой функциональности Contiki требует 20 KB RAM, а для полной, включающей ярлыки Рабочего стола, Web-браузер и сервер, – 50 KB. Остается только обзавестись картой RS-232 или Ethernet-адаптером. К сожалению, ОС, по словам автора, все-таки вряд ли подойдет для устройств вроде КПК и мобильных телефонов, потому что Contiki не обеспечивает всех возможностей современной среды серфинга – она не поддерживает отображение изображений, Java, Flash.

Заинтересовавшиеся Contiki владельцы x86-систем могут «попробовать» ее в средах UNIX-подобных ОС, а пользователи Windows – посредством Cygwin. Присутствует также возможность запуска данной системы из MS-DOS (www.mbernstein.de/contiki/).