1. Введение: что такое RTOS и зачем она нужна
Операционная система реального времени (RTOS, Real‑Time Operating System) — специализированная ОС, гарантирующая выполнение задач в строго определённые временные рамки (дедлайны).
1.1. Ключевые отличия от «обычных» ОС
- Детерминированность: время отклика предсказуемо и измеримо.
- Приоритетная диспетчеризация: высокоприоритетные задачи вытесняют низкоприоритетные.
- Минимальные задержки: переключение контекстов — десятки микросекунд.
- Отсутствие свопинга: вся память — физическая, нет дискового обмена.
- Фиксированный набор задач: обычно известен на этапе разработки.
1.2. Где применяется RTOS
- промышленная автоматика (ПЛК, ЧПУ);
- автомобильная электроника (ABS, ECU);
- медицинская техника (ИВЛ, дефибрилляторы);
- аэрокосмос (бортовые компьютеры);
- IoT‑устройства с жёсткими временными требованиями.
1.3. Типы RTOS по жёсткости требований
- Hard RTOS: нарушение дедлайна = отказ системы (авиация, медицина).
- Soft RTOS: допустимы редкие пропуски, но средняя задержка важна (мультимедиа, IoT).
- Firm RTOS: пропуски дедлайнов ведут к потере качества, но не к катастрофе.
2. Архитектура RTOS: базовые компоненты
2.1. Ядро (Kernel)
Отвечает за:
- планирование задач (scheduler);
- управление памятью;
- синхронизацию и взаимное исключение;
- обработку прерываний.
2.2. Задачи (Tasks)
- Имеют приоритет (от 0 до N).
- Могут находиться в состояниях: Running, Ready, Blocked, Suspended.
- Стек и контекст сохраняются при переключении.
2.3. Механизмы синхронизации
- Семафоры (Binary, Counting) — сигнализация между задачами.
- Мьютексы (Mutex) — защита критических секций.
- Очереди (Queues) — передача данных между задачами.
- События (Event Flags) — многобитовая сигнализация.
2.4. Таймеры
- Software Timers — отложенные вызовы функций.
- Tick Interrupt — базовый квант времени (1–10 мс).
2.5. Управление памятью
- Статическое выделение (на этапе компиляции) — для жёстких систем.
- Динамическое (heap) — с контролем утечек и фрагментации.
3. FreeRTOS: популярная RTOS для микроконтроллеров
3.1. Общие сведения
- Лицензия: MIT (открытая, без роялти).
- Портабельность: поддерживает ARM Cortex‑M, AVR, RISC‑V, PIC, ESP32 и др.
- Размер кода: от 6–10 КБ ROM, 1–2 КБ RAM.
- Сообщество: огромное, множество готовых драйверов и примеров.
3.2. Ключевые особенности
- Кооперативное/вытесняющее планирование — настраивается.
- До 255 приоритетов — гибкая иерархия задач.
- Поддержка SMP (симметричная многопроцессорность) — в новых версиях.
- Программное таймирование — до тысяч таймеров.
- Обнаружение мёртвых блокировок (configUSE_TRACE_FACILITY).
3.3. Типовая структура приложения
void Task1(void *parameter) {
for(;;) {
// Работа задачи 1
vTaskDelay(100); // Задержка на 100 тиков (например, 100 мс)
}
}
void Task2(void *parameter) {
for(;;) {
// Работа задачи 2
vTaskDelay(50);
}
}
int main(void) {
xTaskCreate(Task1, "Task1", 128, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 128, NULL, 2, NULL);
vTaskStartScheduler();
return 0;
}
3.4. Синхронизация: пример с очередью
QueueHandle_t queue;
void SenderTask(void *parameter) {
int data = 42;
for(;;) {
xQueueSend(queue, &data, portMAX_DELAY);
vTaskDelay(1000);
}
}
void ReceiverTask(void *parameter) {
int received;
for(;;) {
if (xQueueReceive(queue, &received, portMAX_DELAY) == pdPASS) {
printf("Received: %d\n", received);
}
}
}
// В main()
queue = xQueueCreate(10, sizeof(int));
xTaskCreate(SenderTask, "...", ..., 1, NULL);
xTaskCreate(ReceiverTask, "...", ..., 2, NULL);
3.5. Настройка FreeRTOS (FreeRTOSConfig.h)
Важные макросы:
configTICK_RATE_HZ— частота системного тика (например, 1000 Гц → 1 мс).configMAX_PRIORITIES— число приоритетов.configTOTAL_HEAP_SIZE— размер кучи.configUSE_MUTEXES— включить мьютексы.configCHECK_FOR_STACK_OVERFLOW— проверка переполнения стека.
4. Zephyr: RTOS для современных IoT‑устройств
4.1. Общие сведения
- Лицензия: Apache 2.0.
- Поддержку: Linux Foundation, крупные вендоры (Nordic, STMicroelectronics).
- Архитектура: модульная, с Kconfig (как в Linux).
- Целевые платформы: ARM Cortex‑M, RISC‑V, x86, ARC.
4.2. Ключевые особенности
- Единое дерево устройств (DT) — описание периферии в .dts.
- Подсистема служб (Services) — модульная архитектура.
- Поддержка POSIX API — частичная совместимость с Linux.
- Безопасность: изоляция памяти (MPU/MMU), криптография.
- Энергосбережение: режимы сна на уровне ядра.
4.3. Модель программирования
- Задания (Threads) — аналоги задач FreeRTOS.
- Работа (Work Items) — отложенные функции.
- Сигналы (Signals) — асинхронная коммуникация.
- Каналы (Message Queues) — передача данных.
4.4. Пример приложения (Zephyr)
#include <zephyr.h>
#include <sys/printk.h>
void thread1(void) {
while (1) {
printk("Hello from Thread 1!\n");
k_sleep(K_SECONDS(1));
}
}
void thread2(void) {
while (1) {
printk("Hello from Thread 2!\n");
k_sleep(K_SECONDS(2));
}
}
K_THREAD_DEFINE(thread1_id, 512, thread1, NULL, NULL, NULL,
1, 0, K_NO_WAIT);
K_THREAD_DEFINE(thread2_id, 512, thread2, NULL, NULL, NULL,
2, 0, K_NO_WAIT);
void main(void) {
printk("Zephyr RTOS started!\n");
}
4.5. Синхронизация: пример с семафором
#include <kernel.h>
K_SEM_DEFINE(sem, 0, 1); // Начальное значение 0
void producer(void) {
while (1) {
k_sleep(K_SECONDS(2));
k_sem_give(&sem); // Сигнализируем
}
}
void consumer(void) {
while (1) {
k_sem_take(&sem, K_FOREVER); // Ждём сигнала
printk("Consumed!\n");
}
}
K_THREAD_DEFINE(producer_id, 512, producer, NULL, NULL, NULL, 1, 0, K_NO_WAIT);
K_THREAD_DEFINE(consumer_id, 512, consumer, NULL, NULL, NULL, 2, 0, K_NO_WAIT);



