ВСТРОЕННЫЕ СИСТЕМЫ УПРАВЛЕНИЯ Лекция 9 ПРОГРАММНОИНСТРУМЕНТАЛЬНАЯ ПЛАТФОРМА QNX6 А. Астапкович Государственный университет аэрокосмического приборостроения, СПб, 2012 Встроенные системы управления ПЛАТФОРМА QNX История QNX Операционная система QNX имеет многолетнюю историю . Изначально это многозадачная , многопользовательская, многоконсольная ОСРВ с микроядерной структурой. В настоящее время на практике используются две версии программно-инструментальных платформ: QNX4 для систем управления с централизованной структурой (ОСРВ QNX4.X) QNX6 для систем управления с распределенной структурой (ОСРВ Neutrino) . Концепция NEUTRINO Глобальной целью проекта Neutrino было создание универсальной, развиваемой, масштабируемой и ОСРВ. Эта операционная система должна была быть пригодной для построения систем реального времени на самом широком спектре реализаций аппаратной компоненты, начиная с одноядерных автономных устройств и до сетевых систем управления на базе многоядерных процессоров, как уже выпускаемых, так и новых модификаций. Платформа QNX6 включает в себя: • операционную систему реального времени QNX Neutrino; • программно-инструментальную среду QNX Momentics, реализованную на базе IDE Eclipse; • пакеты программного обеспечения промежуточного слоя QNX Aviage. Базовые стандарты Реализация базовых компонент микроядра Neutrino соответствует стандартам : POSIX 1003.1, 1003.1a 1003.1b Realtime 1003.1c Threads 1003.1d Realtime Extensions 1003.13 Realtime Profile Support Стандарты семейства POSIX 1003.1 используют модель операционной системы с возможностью выполнения многих процессов в квазипараллельном режиме. При этом предполагается, что каждый процесс имеет свою, защищенную память, недоступную для компонентов другого потока (стандарт ARINC-653). Thread (нить) Определение “ Нить это компонент в процессе исполнения” наиболее адекватно смыслу, но слово процесс уже занято ! A –адресное пространство Компонент (подпрограмма, функция) OC T – временные слоты Нить (thread) является синонимом потока В литературе ( переводной) используют оба термина Потоки (нити) Алгоритм функционирования многоканальной системы реального времени представляет собой некоторое множество взаимодействующих нитей (потоков) и процессов. Реализация компонентов осуществляется под управлением базовой сущности называемой нитью (thread). Понятие нить введено в стандарте POSIX, и оно представляет собой компонент в стадии реализации. . A-адресное пространство OC Нити (прикладные задачи) Tc T-время При диспетчеризации FIFO потоку предоставляется процессор на столько, сколько ему необходимо Совокупность нитей образует процесс, который должен иметь хотя бы одну нить. Процессы Совокупность нитей образует процесс, который должен иметь хотя бы одну нить. Количество нитей в процессе может варьироваться. Процесс обладает собственным защищенным адресным пространством A-адресное пространство OC Нити Процесс 1 Нити Процесс 2 T-время Процессы могут реализовываться, как на одном аппаратном модуле, так и на системе модулей, объединенных в сеть Концепция декомпозиции Наличие механизма процессов с технологической точки зрения разработки ПО обеспечивает : Возможность единообразного способа декомпозиции задачи на модули Параллельную разработку (отладку ) модулей с минимизацией проблем при интеграции системы Увеличение качества конечного продукта за счет увеличения количества ошибок и облегчения организации сопровождения Встроенные системы управления Состав платформы QNX6 Интегрированные программно-инструментальные среды (IDE) Описание алгоритма Трансляция или cредствами IDE : компиляция кода, объекты ОСРВ, сборка кода компоненты Корректировка описания алгоритма, Отладка с использованием симулятора Прошивка кода в макет устройства или в опытный образец модификация алгоритма Отладка с использованием внутрисхемного эмулятора Integrated Development Environment (IDE) – специализированный аппаратно-программный комплекс для разработки систем управления встраиваемого класса. Совокупность возможных реализаций IDE образует платформу поддержки разработки. Структура платформы QNX6 ИНСТРУМЕНТАЛЬНЫЙ КОМПЬЮТЕР С OC: WINDOWS, SOLARIS, QNX NEUTRINO Инструментарий для разработки кода приложения на языках C/C++, JAVA Монитор целевых систем Символьный РАБОЧЕЕ отладчик ПРОСТРАНСТВO IDE Профайлер (на базе ECLIPSE) приложений Построитель Системный приложений профайлер PHOTON Последовательный коммуникационный канал ETHERNET АППАРАТНАЯ СОСТАВЛЯЮЩАЯ РАЗРАБАТЫВАЕМОЙ СИСТЕМЫ Аппаратная компонента Платформа обеспечивает возможность разработки программного обеспечения для систем управления, реализуемых на базе микропроцессоров: •Intel x8, AMD - CISC архитектура фирмы INTEL; •MIPS - RISC архитектура фирмы MIPS Technologies; •ARM, StrongARM- RISC архитектура фирмы Advance Risc Machine; •SH-4 - RISC архитектура фирмы Renesas; •PowerPC - RISC архитектура фирмы IBM. При этом обеспечивается поддержка наиболее распространенных шин: ISA, PCI, VME,STD, STD 32 и PC/104. Встроенные системы управления Концепция ОСРВ Neutrino Рекомендуемая литература: Роберт Кртен. Введение в QNX Neutrino 2-е изд., 2011 Микроядерная архитектура • • • • Концепция построения ОСРВ Neutrino : использование микроядерной архитектуры; модульная организация системы; информационный обмен между процессами посредством сообщений; поддержка платформенного подхода. Менеджер процессов Выделяет и поддерживает адресные пространства процессов. При запуске процесса осуществляет выделение ему памяти и активирует его потоки (нити). При необходимости использовать другой поток в другом процессе менеджер процессов переключает адресное пространство. Запуск процессов осуществляется разными способами, которые реализуются системными компонентами Neutrino. Менеджер процессов обеспечивает не только управление процессами, но и операции работы с памятью и файловой системой. Защита памяти Для защиты памяти Neutrino имеет в своем составе опционально подключаемый компонент управления памятью (Memory Management Unit – MMU). Этот компонент обеспечивает работу с таблицами описания распределения памяти между процессами. Эти таблицы используются аппаратным модулем микропроцессора, для анализа корректности выполняемых действий. Обычно MMU делит память на страницы по 4 кБайта. Программный сторожевой таймер Защита памяти реализуется аппаратными средствами и блокирует возможность несанкционированного доступа к памяти. Как правило, такие ситуации возникают из-за ошибок в разрабатываемом программном обеспечении. Процесс, компонент которого попытался изменить память другого процесса, блокируется и возникшая ситуация протоколируется, что обеспечивает разработчикам возможность анализа возникшей ситуации. Реализация этой возможности, получившей название программный сторожевой таймер, обеспечивает ряд возможностей, существенно облегчающих отладку. Следует подчеркнуть, что эта возможность существенно облегчает анализ сбойных ситуаций при опытной и штатной эксплуатации системы, когда на передний план выходят перемежающиеся отказы для плохо детерминированных условий эксплуатации. Встроенные системы управления МИКРОЯДРО NEUTRINO Объекты микроядра Описание алгоритма управления представляет собой программу на языке высокого уровня (C,JAVA) написанную в соответствии с набором правил QNX6. Программа пишется с использованием пользовательских функций, учитывающих специфику реализуемого алгоритма управления, и системных функций из библиотек QNX6. Системные функции обеспечивают работу с базовыми объектами микроядра Системные Микроядро Объекты микроядра вызовы Объекты микроядра Neutrino . Идентификация потоков Как правило нити (потоки) конкретного приложения информационного обмена между собой требуют Способ обмена определяет конечные результаты обработки информации (реализацию предписанного алгоритма управления), так как это влияет напрямую на временную структуру реализуемого алгоритма. Соответственно, помимо нитей в набор объектов микроядра входят компоненты, обеспечивающих информационное взаимодействие нитей между собой в процессе выполнения: connection, channel, pulse. С одной стороны потоки используют общее адресное пространство своего процесса, а с другой, имеют собственные данные, которые обеспечивают идентификацию потоков при информационных обменах. Эти данные называются атрибутами потока. Атрибуты потока Количество потоков внутри процесса может динамически меняться в процессе исполнения. Создание потока осуществляется посредством вызова функции pthread create() , которая выделяет и инициализирует все необходимые потоку ресурсы внутри адресного пространства процесса. tid register set stack signal mask thread local storage cancellation handlers Атрибуты потока Neutrino порядковый номер внутри своего процесса собственный указатель на команду (IP) и указатель на стэк (SP) стэк потока, сохраняемый внутри адресного пространства процесса маска сигналов память для хранения локальных данных нити (Thread Local Storage -TLS) , таких как: tid,pid, stack, stack base, errno. Функции формирования данных при уничтожении нити После успешного завершения этих операций производится постановка потока в очередь на выполнение. Состояния потока READY – поток ожидает ресурса для выполнения пока процессор исполняет другу нить с большим или равным приоритетом RUNNING- компонент выполняется процессором SIGSUSPEND – выполнение приостановлено до получения сигнала INTERRUPT– поток блокирован и ожидает сигнала прерывания DEAD – выполнение завершено и поток ожидает присоединения к другому потоку Диспетчеризация потоков Диспетчеризация потоков осуществляется автономно, без учета состояния своего и других процессов. Потоки, готовые к исполнению образуют очереди, упорядоченные в соответствии с приоритетами. Список дисциплин традиционен для QNX : FIFO, RR и адаптивная. С этой точки зрения, поток может находится в трех состояниях : выполнения, быть вытесненным другим потоком с большим приоритетом или быть заблокированным. В работающей системе приоритет потока может изменяться либо путем прямой манипуляции, либо средствами микроядра при получении им сообщения от потока с большим приоритетом. Информационное взаимодействие процесов в Neutrino Информационное взаимодействие Поддержка модели потоков подразумевает возможность использования общих данных для реализации своих компонент. Иерархия способов обмена двухуровневая. Она включает в себя обмены внутри процесса и обмены информацией нитями из разных процессов. Ключевая особенность Neutrino - обмен посредством сообщениями между процессами (Inter Process Communication, IPC). Обмен сообщениями по сути дела является тем клеем, который связывает модули Neutrino и прикладные компоненты в единое целое и призван обеспечить универсальность этой операционной системы. Типы коммуникаций Сообщение представляет собой пакет байтов, пересылаемых одним процессом другому. На структуру и содержание сообщения не накладывается никаких ограничений. Разновидности типов коммуникаций Neutrino Тип Передача сообщений (message-passing) Уровень реализации Микроядро Сигналы (signals) Микроядро POSIX очереди (POSIX message queues) Разделяемая память (shared memory) Внешний процесс Трубы (pipes) Внешний процесс FIFO Внешний процесс Менеджер процессов Так как речь идет о системах управления реального времени, требуется обеспечить синхронизацию информационно-взаимодействующих процессов . Механизм реализации IPC Передаваемые сообщения адресуются не посредством указания адреса нити получателя и адреса нити отправителя, а путем предварительного создания описания каналов и соединений. ПРОЦЕСС CLIENT ПРОЦЕСС SERVER_1 Cоединение ПОТОК_ 1 (Connection) ПОТОК_ 1 ConnectAttach() ПОТОК_ 2 ПОТОК_ 2 Канал (Channel) ПОТОК_ M ПОТОК_ K ChannelCreate() Поток, который ожидает сообщения, должна создать канал для его передачи. Поток, которому требуется послать сообщение должна сначала установить соединение путем подключения к каналу. Эти операции выполняются путем вызова соответствующих системных функций ChannelCreate() и ConnectAttach(). У этих функций есть антиподы ChannelDestroy() и ConnectDetach(). После установления соединения процесс клиент может посылать сообщения, пользуясь системной функцией MsgSend(). Синхронизация обменов В общих чертах это осуществляется следующим образом: текущее состояние процесса описывается соответствующей переменной; посылка сообщения, ожидание и прием сообщения соответствующим образом меняют текущее состояние процесса; поток, вызвавший вызов системной функции MsgSend()для отправки сообщения другому потоку, который может находится внутри другого процесса, будет блокирован до тех пор, пока поток адресант сообщения не выполнит вызова системной функции MsgReceive(), обработает полученное сообщение и не выполнит вызова системной функции MsgReply(). ОБРАБОТКА ПРЕРЫВАНИЙ Механизм обработки прерываний В Neutrino при появлении сигнала прерывания от аппаратного модуля, управление передается на уровень микроядра, которое осуществляет подготовительные работы по запуску обработчика прерываний, реализуемых пользовательским компонентом. В одноканальном приближении ключевым параметром является время реакции на событие (interrupt latency) представляющее временной интервал между появлением сигнала прерывания и началом выполнения первой команды соответствующего обработчика прерываний. Это время относительно невелико. Однако, оно может существенно возрасти, если система прерываний будет заблокирована, например, каким-либо системным процессом. Задержка диспетчеризации Обработка прерываний осуществляется запуском диспетчером потока (нити) обработчика соответствующего прерываний, обладающим высоким приоритетом. Таким образом, содержательная реакция на сигнал прерывания последует лишь после начала выполнения этой нити. Для определения задержки при таком варианте обработки прерываний введена характеристика, называемая задержка диспетчеризации (scheduling latency). Задержка диспетчеризации определяется, как временной интервал между моментом исполнения последней инструкции обработчика прерываний, фиксирующего появление аппаратного прерывания, и началом выполнения первой команды нити драйвера, обрабатывающей это прерывание. Системный таймер Системные функции clock(), timer(), synch() используются для отслеживания времени суток и измерения длительности временных интервалов. С помощью этих функций Neutrino обеспечивает возможность синхронизации часов между несколькими системами. Приложение, запрашивающее сервис, нуждающийся в тайм-ауте, запрашивает у микроядра автоматический запуск таймера в случае перехода приложения в определенное состояние. Запуск таймера и запрос сервиса в этом случае реализуются как атомарная операция, исключающая неоднозначность. Инструментальная среда QNX Momentics Философия подхода Neutrino разрабатывалась с учетом необходимости обеспечить ее удобную интеграцию в программно-инструментальные платформы. Пара базовых элементов Neutrino микроядро и менеджер процессов (Process Manager) называется procnto. Блок procnto поставляется в двух модификациях, одна из которых предназначена для использования в процессе отладки. Эта инструментальная версия называется proconto-instr и обладает широким наборов средств для трассировки и мониторинга состояния разрабатываемой системы управления в процессе исполнения разрабатываемого кода. История развития QNX6 имеет в своем составе компонент Photon, предназначенный для обеспечения графического интерфейса (Graphic User Interface – GUI). Его реализация базируется на механизме обмена сообщениями. Этот интерфейс ориентирован на использование оконных интерфейсов Windows и Unix, с которыми он связывается посредством использования удаленного пользовательского интерфейса (Remote User Interface – RUI). Разработка этой оболочки велась одновременно с разработкой Neutrino. В настоящее время для разработки c Neutrino начинает широко использоваться IDE QNX Momentics. ПРИНЦИПЫ РЕАЛИЗАЦИИ Программно-инструментальная среда QNX Momentics представляет собой унифицированную среду для разработки многокомпонентных и разнородных систем управления. QNX Momentics состоит из ядра Eclipse, к которому подключены специализированные QNX расширения. Eclipse представляет собой универсальную расширяемую платформу, обеспечивающую возможность создания и поддержки специализированных сред поддержки разработки, путем объединении компонент IDE. Архитектура и способ реализации Eclipse ( язык JAVA ) обеспечивают его Переносимость и расширяемость. Символьный отладчик Momentics Символьный отладчик Momentics обеспечивает возможность: • одновременно отлаживать несколько приложений, написанных на C, C++ и/или Java; • отлаживать многопоточные приложения, контролируя каждый поток по отдельности и отслеживая передачу управления между ними; • отлаживать несколько процессов, выполняющихся одновременно на микропроцессорах с различными архитектурами ; • динамически подключаться отладчиком к любому выполняющемуся процессу; • проводить анализ дамп-файлов при аварийном завершении отладочного теста. ОКОННЫЙ ИНТЕРФЕЙС Монитор и навигатор Связь с аппаратной компонентой разрабатываемой системы обеспечивают такие компоненты инструментальной среды, как монитор и навигатор целевых систем. Монитор целевых систем предоставляет информацию о системах и процессах и используется совместно с навигатором целевых систем. Навигатор позволяет разработчику привязывать проекты к IP-адресам аппаратных модулей или именам хостов, однозначно определяя текущую программно-аппаратную конфигурацию целевой системы. Возможности монитора Монитор целевых систем позволяет в режиме исполнения программного кода отследить использование ресурсов, конкретными процессами и потоками. Можно проконтролировать расход памяти и ресурсов процессора, как для всей системы в целом, так и для каждого процесса в отдельности. Монитор позволяет отслеживать ряд атрибутов потока, таких как его текущее состояние, дисциплина планирования, использование процессора, размер стека, состояния сигналов, карты памяти программы, файловые дескрипторы и т.д . С помощью монитора можно выявлять потенциальные ситуации взаимных блокировок, просматривая графическую диаграмму отношений блокирования. Инструментальные версии Разработка программного обеспечения для систем управления обладает рядом существенных отличий по сравнению с разработкой программного обеспечения для чисто информационных систем. Возможность отслеживания динамики поведения каналов управления при отладке программного обеспечения, опция, которая существенно повышает производительность разработчиков и качество программного кода. При этом следует подчеркнуть, что использование описанных выше возможностей по отладке могут выполняться лишь с инструментальной версией ядра (proncto).