Главная / Без рубрики / Операционные системы реального времени (RTOS): FreeRTOS, Zephyr

Операционные системы реального времени (RTOS): FreeRTOS, Zephyr

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);

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *