Розробка

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

В іншій частині серії статей «Вся правда про ОСРЧ» ми детально розглянемо, як впроваджується і розгортається ОСРВ. Для цього ми будемо розглянемо конкретну ОСРЧ: Nucleus SE. Навіть якщо ви не збираєтеся використовувати конкретно це ядро або інші, пов’язані з ним, ядра, розуміння того, як воно працює, дасть хороший фундамент для роботи з будь-якими ОСРВ.

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

Простота

Код ядра повинен бути простим, зрозумілим, добре прокомментированным та задокументованим. 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 і приділимо особливу увагу внутрішній структурі і розгортання ОСРВ.

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Close