Событийно-ориентированная архитектура - общение сообщениями

Самый высокоуровневый подход - Событийно-ориентированная архитектура (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) { if(event->type == EVENT_BUTTON_PRESSED) { update_display(“Button pressed!”); } }

// Инициализация системы событий int main(void) { event_bus_init(); event_bus_subscribe(EVENT_BUTTON_PRESSED, ui_handler);

while(1) { event_bus_process(); // Обработка очереди событий idle_task(); } } Как это работает на практике? Система строится вокруг шины событий (event bus) или диспетчера сообщений. Компоненты не вызывают функции друг друга напрямую, а отправляют события в шину. Другие компоненты, подписанные на определенные типы событий, получают и обрабатывают их. Это создает полностью асинхронную и слабосвязанную архитектуру.

Когда выбирать событийно-ориентированную архитектуру? 🟢Система состоит из множества независимых компонентов? 🟢Требуется ли высокая гибкость и возможность расширения? 🟢Важна ли тестируемость и изоляция модулей? 🟢Система по природе реактивная (событие → реакция)? 🟢Готовы ли вы к сложному проектированию с самого начала?

Идеальные кандидаты: Сложные IoT-устройства, системы домашней автоматизации, продвинутые HMI-интерфейсы, сетевые шлюзы, приложения с множеством асинхронных источников данных.

Сильные стороны: ➕Слабая связанность. Модули ничего не знают друг о друге ➕Гибкость и масштабируемость. Новый функционал = новый подписчик ➕Идеально для реактивных систем. Отражает суть embedded ➕Упрощённое тестирование. Модули можно тестировать изолированно

Слабые стороны: ➖Высокий порог входа. Сложно правильно спроектировать ➖Непрозрачность потока. Трудно отлаживать цепочки событий ➖Накладные расходы. Буферизация и маршрутизация требуют ресурсов ➖Риск переполнения очереди. События генерируются быстрее обработки ➖Потенциальная латентность. Сообщение проходит дольше прямого вызова

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

#событийнаяархитектура #eventdriven #архитектурапрошивки #embedded #шинасобытий #реактивноепрограммирование