Event pub/sub bus for embedded systems.
C99 | Zero dependencies | Zero allocations | ISR-safe queue | Portable
Without an event bus, modules call each other directly:
mfsm_dispatch(&fsm, EV_TEMP_HIGH);
MLOG_WARN("SENSOR", "overtemp");
iotspool_enqueue("alerts", cbor_buf, n);
mhealth_check_now(&hm);With microbus, modules are decoupled:
mbus_publish(&bus, MBUS_TOPIC_SENSOR, &temp, sizeof(temp));
mbus_subscribe(&bus, MBUS_TOPIC_SENSOR, log_handler, NULL);
mbus_subscribe(&bus, MBUS_TOPIC_SENSOR, health_handler, &hm);
mbus_subscribe(&bus, MBUS_TOPIC_ANY, monitor_handler, NULL);- Topic-based pub/sub with
uint8_ttopics - Wildcard subscriber support (
MBUS_TOPIC_ANY) - Fixed-size payload (default: 32 bytes, configurable)
- Synchronous publish (
mbus_publish) - Deferred ISR-safe queue (
mbus_queue+mbus_dispatch) - Signal events (
mbus_signal,mbus_queue_signal) - Unsubscribe by index and by topic
- Slot reuse after unsubscribe
- Built-in counters (publish, deliver, drop)
#include "mbus.h"
void on_sensor(const mbus_event_t *e, void *ctx) {
(void)ctx;
float temp;
memcpy(&temp, e->payload, sizeof(temp));
}
mbus_t bus;
mbus_init(&bus, HAL_GetTick);
mbus_subscribe(&bus, MBUS_TOPIC_SENSOR, on_sensor, NULL);
float temp = 23.5f;
mbus_publish(&bus, MBUS_TOPIC_SENSOR, &temp, sizeof(temp));Requirements:
- GCC (or compatible C99 compiler)
make- microtest header in
../../microtest/include/mtest.hrelative totests/
Run tests:
cd tests
make| Macro | Default | Description |
|---|---|---|
MBUS_MAX_SUBSCRIBERS |
16 | Maximum subscribers |
MBUS_MAX_PAYLOAD |
32 | Maximum payload size in bytes |
MBUS_ENABLE_QUEUE |
1 | Enable deferred queue |
MBUS_QUEUE_DEPTH |
8 | Queue depth (power of 2) |
include/mbus.h- public APIsrc/mbus.c- implementationtests/test_all.c- unit testsdocs/DESIGN.md- design rationaleCHANGELOG.md- release notesCONTRIBUTING.md- contribution rules
MIT, see LICENSE.