Pull to refresh

Вся правда об ОСРВ. Статья #7. Nucleus SE: введение

Reading time 6 min
Views 3.5K
Original author: Collin Walls


В оставшейся части серии статей «Вся правда об ОСРВ» мы подробно рассмотрим, как внедряется и развертывается ОСРВ. Для этого мы рассмотрим конкретную ОСРВ: Nucleus SE. Даже если вы не собираетесь использовать конкретно это ядро или другие, связанные с ним, ядра, понимание того, как оно работает, даст хороший фундамент для работы с любыми ОСРВ.

Чтобы понять, почему Nucleus SE была спроектирована именно так, важно выделить задачи ядра и цели, которыми я руководствовался в начале этого проекта.

Предыдущие статьи серии:
Статья #6. Другие сервисы ОСРВ
Статья #5. Взаимодействие между задачами и синхронизация
Статья #4. Задачи, переключение контекста и прерывания
Статья #3. Задачи и планирование
Статья #2. ОСРВ: Структура и режим реального времени
Статья #1. ОСРВ: введение.


Простота

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

Размер

Это должно быть небольшое, хорошо масштабируемое ядро (поскольку память, особенно оперативная (RAM), может быть в дефиците).

Функциональные возможности

Ядро должно иметь высокий уровень функциональности, поддерживающий стандартные службы ОСРВ.

Поддержка 8/16 бит

Оно должно поддерживать 8- и 16-битные архитектуры: по мере возможности следует использовать данные размером с байт; структуры данных не должны требовать экзотических способов адресации; постоянные данные не должны копироваться в ОЗУ без необходимости.

Будущее

Должен быть путь развития от Nucleus SE до Nucleus RTOS. Пользователи должны иметь возможность легко переносить код между ядрами. Что еще более важно, переноситься должны и их знания. API Nucleus SE эффективно реализует подмножество API Nucleus RTOS.

Стоимость

Бизнес-модель должна быть привлекательной для всех потенциальных пользователей: разработчиков 8/16-разрядных устройств, тех, кто впервые пользуется ОСРВ и тех, кто только изучает саму технологию. Таким образом, Nucleus SE находится в свободном доступе, абсолютно бесплатна для пользования в коммерческих и образовательных целях; код можно использовать и модифицировать.

Целевая аудитория Nucleus SE

Результатом этого подхода стало ядро, которое может быть полезно для трех типов разработчиков:

  • Программисты 8/16-разрядных устройств, которым требуется простое ядро или планировщик задач. Это особенно привлекательно, если разработчики заинтересованы в приобретении определенных навыков использования ОСРВ или в случае разработки системы, в которой используются другие 32-разрядные устройства, где Nucleus RTOS может стать хорошим выбором.
  • Разработчики встроенных приложений, использующие 32-битные устройства, где сложность программного обеспечения не стоит затрат на традиционную коммерческую ОСРВ. Использование Nucleus SE может быть полезно и позволит развиваться (до Nucleus RTOS), если сложность приложения возрастает.
  • Студенты в процессе обучения могут воспользоваться Nucleus SE в качестве базы для изучения ОСРВ. Приобретенные навыки пригодятся позже, когда они начнут работать.

Проектные решения и компромиссы

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

Статическая конфигурация

Nucleus SE представляет собой статическую ОСРВ, то есть все решения о конфигурации производятся во время сборки, а не динамически во время выполнения. Это имеет множество преимуществ, включая упрощение структуры данных и сокращение размера кода, поэтому и нет необходимости в вызове API-функций «create» и «delete». Для большинства приложений динамическое создание объектов не требуется.

Количество объектов

Количество объектов каждого типа ограничено в приложении на базе Nucleus SE. Может быть от одной до шестнадцати задач и от нуля до шестнадцати разных видов объекта ядра. Это упрощает адресацию объектов (см. ниже). Это ограничение не является трудностью для небольших приложений, для которых и предназначено ядро.

Адресация объектов

Объекты адресуются с помощью «индекса», который может иметь значения от нуля до пятнадцати. По сравнению с обычным использованием указателей, это может быть более эффективным на небольших процессорах и позволит использовать меньше памяти: для индекса требуется всего 4 бита памяти; адрес составляет 16-32 бита.

Планировщик

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

Ограниченная функциональность

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

Использование памяти

Поскольку Nucleus SE должна поддерживать приложения с ограниченным объёмом памяти, особое внимание было уделено использованию памяти. Предполагалось использование «классической» ПЗУ и ОЗУ: ПЗУ использовался для кода и постоянных данных; ОЗУ — для хранения переменных, стека и т. д. Хотя конкретная цель может иметь другую схему, код Nucleus SE довольно гибкий; определения (#defines) ПЗУ и ОЗУ используются для префикса всех структур переменных и данных для указания их местоположения. Этого можно добиться с помощью инструментария.

Ключевым требованием было избежать ненужного копирования данных с ПЗУ в ОЗУ, поскольку оперативной памяти может не хватать. Механизм, с помощью которого это достигается, описывается в разделе «Структуры данных» в следующей статье.

Реализация API

API для Nucleus SE реализован традиционным способом: функция языка C реализует каждый вызов API. Эти вызовы логически сгруппированы. Хотя вызовы API в Nucleus SE не совсем такие, как в Nucleus RTOS, общий функционал имитируется, а сопоставление между API осуществляется просто. Подробная информация о API Nucleus RTOS будет включена.

Критические секции

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

Определена пара макросов под названием NUSE_CS_Enter() и NUSE_CS_Exit(). Весь код API-функций Nucleus SE использует их, чтобы охватить критическую секцию, таким образом:

NUSE_CS_Enter();
<non-interruptable code>
NUSE_CS_Exit();

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

Масштабируемость

Как и все современные ОСРВ Nucleus SE масштабируется. Чтобы убедиться в том, что включены только используемые компоненты ОСРВ, все API-функции представляются в виде библиотеки. Таким образом, во время линковки функции, на которые есть ссылки, извлекаются и включаются в конечный образ приложения. Nucleus RTOS использует этот подход как для ядра, так и для всех других компонентов ОС. Nucleus SE использует другую технику.

Вместо того, чтобы полагаться на библиотеку в выбранном наборе инструментов, все исходные файлы в поставке Nucleus SE содержат директивы условной компиляции. Чтобы настроить Nucleus SE для программы, разработчику необходимо установить несколько символов #define (подробнее об этом в следующей статье). Это определяет, какие функции API скомпилированы и, следовательно, включены в программу.

Nucleus SE улучшает этот подход, предлагая объект, который я называю «экстремальной масштабируемостью». Несколько аспектов функциональности ядра могут быть включены и выключены или настроены другими способами с использованием аналогичных символов #define. Таким образом, у разработчика появляется точечный контроль над использованием памяти.

Какой API?

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

Некоторые пользователи могут предпочесть использовать другой API: либо стандартный, либо тот, с которым они знакомы. API Nucleus SE достаточно гибкий и позволяет создавать обертку (wrapper), которая преобразует интерфейс к другому API.

Одна из главных целей разработки Nucleus SE — высокая степень совместимости на пользовательском уровне с Nucleus RTOS. Хотя API отличаются, они разработаны так, что сопоставить их будет просто. Будет доступна обертка, облегчающая использование API Nucleus RTOS на Nucleus SE.

В следующей статье мы продолжим рассматривать Nucleus SE и уделим особое внимание внутренней структуре и развертыванию ОСРВ.
Tags:
Hubs:
+7
Comments 0
Comments Leave a comment

Articles