УДК 537.622:519.245

Устюгов В. А., Епихин В. С.
Операционная система для микроконтроллеров с поддержкой операций реального времени и прав пользователей

Операционная система для микроконтроллеров с поддержкой операций реального времени и прав пользователей

The operating system for microcontrollers with support for real-time operations and user rights

В. А. Устюгов, В. С. Епихин

V. A. Ustyugov, V. S. Epikhin

Сыктывкарский государственный университет имени Питирима Сорокина, г. Сыктывкар

Syktyvkar State University named after Pitirim Sorokin, Syktyvkar

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

The article provides an overview of the structure and concepts used for the new operating system for low cost microcontrollers. A general feature of the reporting software is a user rights accounting in task scheduler and control modules. This allows you to conveniently develop secure firmware programs.

Ключевые слова: операционная система, микроконтроллеры, реальное время.

Keywords: operating system, microcontrollers, real time.

Введение

ОС для микроконтроллеров принципиально отличается от традиционных операционных систем в силу существенного различия архитектуры процессорного модуля, системы ввода-вывода, жёсткой ограниченности в ресурсах [1]. Вообще говоря, операционные системы для микроконтроллеров не являются операционными системами в общепринятом понимании, а представляют собой программные платформы для запуска независимых или взаимодействующих задач, выполняющихся квазипараллельно на микроконтроллере (современные одноядерные контроллеры принципиально не могут выполнять в настоящем смысле одновременно несколько задач, в отличие, например, от полноценных процессоров Intel).

Компоненты операционной системы

Основной целью написания программы для микроконтроллера является, как правило, организация управления некоторым технологическим процессом (технологическим в широком смысле, под этим подразумевается, как управление агрегатами на производстве, так и управление бытовыми процессами: сбор данных о климате, автоматическое включение освещения и т. д.). Поскольку память программ и данных микроконтроллера существенно ограничена, операционная система должна занимать как можно меньший объем памяти, чтобы было возможно разместить и запустить в её среде необходимые программные модули. С связи с этим предусматривается возможность исключения из прошивки при компиляции тех модулей и поддержки тех сущностей ОС, которые для работы данной программы не требуются. Поскольку код ОС разрабатывается на языке Си, естественным решением является использование условных директив препроцессора языка, позволяющих не включать в итоговый код программы фрагменты, находящиеся в контейнерах #ifdef и #ifndef в зависимости от истинности условий.

ОС имеет три слоя (уровня):

  • уровень пользователя, в пределах которого выполняются пользовательские процессы;
  • уровень системы, на котором функционируют основные модули управления ресурсами микроконтроллера (памятью, процессорным временем), а также модули для управления запуском и приостановкой процессов и их взаимодействия;
  • аппаратно-зависимый уровень – компактный слой, содержащий низкоуровневые процедуры, обрабатывающие прерывания таймеров, непосредственно совершающие переключение контекстов.

Каждый слой при такой организации может взаимодействовать только с соседними слоями. Подобное строение позволяет снизить риск негативных последствий ошибок программиста, а также ввести систему абстракций, упрощающих программирование за счёт сокрытия особенностей архитектуры конкретных контроллеров.

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

Процессы

Процессы в системе пользователь оформляет как отдельные функции. С помощью функций, входящих в интерфейс прикладного программирования ОС (API) процессу назначается базовый приоритет, выделяется при необходимости область оперативной памяти, создаются примитивы синхронизации. В силу того, что многие семейства 8-битных микроконтроллеров не имеют аппаратной поддержки защиты оперативной памяти, все обращения к памяти (чтение, запись, определение состояния) в рамках процесса необходимо производить через специальные функции, предусмотренные в API. Использование прямого чтения или записи может привести к непредсказуемой работе устройств из-за нарушения синхронности работы процессов.

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

Для эффективной реализации обмена данными между процессами, выполняющимися квазиодновременно на микроконтроллере необходимы средства синхронизации процессов, такие как мьютексы (т. е. возможность блокировки некоторого разделяемого ресурса), критические секции (в ходе выполнения которых невозможно переключение контекстов потоков), функции для приостановления потока до наступления некоторого события (по типу pthread_join() библиотеки pthreads).

Эти функции реализованы в составе модуля управления памятью. В оперативной памяти ОС содержит таблицу разделяемых адресов. Каждая запись таблицы содержит адрес слова, идентификатор процесса-владельца, права для других процессов, а также биты состояния (мьютекс может быть свободен для записи либо заблокирован). В силу ограниченности объёма оперативной памяти количество общих слов в оперативной памяти не может превышать 16.

Для работы с очередью реализованы функции помещения в очередь и извлечения из очереди (по аналогии с функциями работы со стеком push и pop). Количество элементов в очереди не может превышать 16.

Для расширения возможностей планировщика была введена концепция очков (points), начисляемых процессу при простое, по прерываниям от таймеров. Количество начисляемых очков зависит от приоритета процесса, приоритета пользователя в системе, количества системных тактов, прошедших с момента приостановления процесса. Таким образом реализуется состязательный доступ за право занять процессор: очередным активным процессом выбирается процесс, обладающий наибольшим количеством очков. Текущее значение очков хранится в оперативной памяти в таблице процессов. Также исходя из количества очков выбирается количество системных тактов, выдаваемых процессу для исполнения. Когда процесс переходит в активное состояние, счётчик очков процесса обнуляется.

Компоненты операционной системы

Для обеспечения контроля прав пользователя реализованы следующие модули:

  • модуль авторизации пользователя. Для авторизации пользователю требуется тем или иным способом передать идентификатор и ключ по протоколу UART, после чего производится проверка соответствия введённых данных, и начинает выполняться основная часть программы с учётом пользовательских привилегий;
  • модуль хранения и проверки идентификаторов и ключей пользователей. Идентификаторы и ключи могут храниться как на энергонезависимой памяти EEPROM, так и на flash-памяти контроллера;
  • для учёта пользователей ОС использует таблицу пользователей, размещённую в памяти программ (flash). В таблице указаны идентификатор пользователя, ключ доступа, приоритет, а также метод, с помощью которого производится авторизация (передача ключа с помощью клавиатуры, интерфейса UART или иного средства). После проведения процедуры авторизации использованные выводы микроконтроллера могут быть переведены в режим общего пользования. Процедура авторизации может быть проведена многократно как в начале работы управляющей программы, так в ходе её работы.

Непосредственно для авторизации используются предназначенные для этого функции API. После проведения процедуры авторизации планировщик начисляет процессам, владельцем которых является авторизованный пользователь, количество очков, пропорциональное приоритету пользователя в системе.

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

Выводы

Полученные результаты исследований и реализации проекта свидетельствуют о востребованности такой функции ОС для микроконтроллеров, как учёт прав пользователей.

В условиях ограниченности ресурсов микроконтроллеров реализация данной возможности должна быть введена в виде компактного модуля авторизации, а также диспетчера задач с расширенной системой приоритетов. Это позволит разрабатывать программы для микроконтроллеров, безопасные с точки зрения управления технологическим или иным процессом и сохранения авторских прав разработчиков.

Статья поступила в редакцию: 28.04.2016

Список литературы

1. Иртегов Д. В. Введение в операционные системы. 2-е изд. М. : БХВ-Петербург, 2012.

List of references

1. Irtegov, D. V. Introduction to operating systems, 2-e izd., Moscow: BKHV-Peterburg, 2012.

VN:F [1.9.17_1161]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.17_1161]
Rating: 0 (from 0 votes)
VN:F [1.9.17_1161]
Стиль изложения
Информативность
Сложность вопроса
Научная новизна
Коммерциализуемость
Rating: 0.0/5 (0 votes cast)