Найти в Дзене
Что куда ставить
? Итак, у нас есть 5 основных архитектур. Как выбрать? Давайте сравним их по ключевым критериям. По простоте и порогу входа 🟢Суперлуп - начать может любой новичок 🟢Прерывания - требуется понимание работы МК 🟢Планировщик - нужны знания таймеров и прерываний 🟢RTOS - серьезный скачок в сложности 🟢Событийно-ориентированная - самый сложный для проектирования По отзывчивости и времени отклика 🟡Прерывания - абсолютный лидер (почти мгновенно) 🟡RTOS - отличная отзывчивость для приоритетных задач 🟡Событийно-ориентированная - зависит от реализации 🟡Планировщик - задержка до следующего "тика"...
4 недели назад
Событийно-ориентированная архитектура - общение сообщениями
Самый высокоуровневый подход - Событийно-ориентированная архитектура (Event-Driven Architecture, EDA). Здесь нет центрального цикла. Компоненты системы общаются через сообщения (события): одни модули их "издают" (publish), другие - "обрабатывают" (subscribe). Часто строится поверх RTOS или как большая state-машина. // Издатель события (например, драйвер кнопки) void button_isr(void) { event_t btn_event = { .type = EVENT_BUTTON_PRESSED, .data = 1 }; event_bus_publish(&btn_event); // Отправка в шину событий } // Подписчик события (обработчик интерфейса) void ui_handler(const event_t *event) {...
4 недели назад
RTOS - мощь многозадачности
Для сложных систем требуется полноценная многозадачность. Здесь на сцену выходит RTOS (Real-Time Operating System), например, FreeRTOS, Zephyr или Azure RTOS. Её ядро - это вытесняющий планировщик, который на основе приоритетов решает, какую задачу (поток) выполнять прямо сейчас. // Поток 1: Высокоприоритетный, обрабатывает прерывания void high_priority_task(void *params) { while(1) { xQueueReceive(irq_queue, &data, portMAX_DELAY); process_critical_data(data); } } // Поток 2: Средний приоритет, управление интерфейсом void ui_task(void *params) { while(1) { update_display(); vTaskDelay(pdMS_TO_TICKS(100));...
4 недели назад
Планировщик на таймере - порядок во времени
Следующий шаг к структурированию - Планировщик на таймере (Timer-Based Scheduler). Это эволюция суперлупа, где системный таймер периодически генерирует прерывание (тик), которое проверяет, каким задачам пора выполняться, и выставляет флаги. Основной цикл проверяет эти флаги и запускает соответствующие задачи. volatile uint32_t tick_count = 0; #define TASK1_PERIOD 100 // Выполнять каждые 100 мс #define TASK2_PERIOD 500 // Выполнять каждые 500 мс void systick_isr(void) { tick_count++; } int main(void) { uint32_t last_task1 = 0, last_task2 = 0; setup_timer(); enable_interrupts(); while(1) { uint32_t...
4 недели назад
Прерывания: как заставить систему реагировать мгновенно
Чтобы система реагировала на события мгновенно, переходим к архитектуре на основе Прерываний (Interrupt-Driven). Основная логика переносится в обработчики прерываний (ISR), которые асинхронно вызываются аппаратурой микроконтроллера. Суперлуп часто остается для фоновых, не срочных задач. volatile bool button_pressed = false; void button_isr(void) { button_pressed = true; } int main(void) { setup_hardware(); enable_interrupts(); while(1) { update_clock(); if(button_pressed) { button_pressed = false; handle_button_action(); } sleep_mode(); } } Как это работает на практике? Аппаратура МК генерирует сигнал прерывания при событии...
4 недели назад
Если нравится — подпишитесь
Так вы не пропустите новые публикации этого канала