Найти в Дзене

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

Самый высокоуровневый подход - Событийно-ориентированная архитектура (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) или диспетчера сообщений. Компонент

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

Самый высокоуровневый подход - Событийно-ориентированная архитектура (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 #шинасобытий #реактивноепрограммирование