80 (void)memset(r, 0,
sizeof(*r));
126 for (uint8_t i = 0u; i < r->
count; i++) {
127 if (r->
pipes[i] == pipe_idx) {
150 for (uint8_t i = 0u; i < r->
count; i++) {
151 if (r->
pipes[i] == pipe_idx) {
175 if ((data == NULL) || (len == 0u)) {
184 uint8_t delivered = 0u;
185 for (uint8_t i = 0u; i < r->
count; i++) {
186 uint8_t pidx = r->
pipes[i];
202 return (r != NULL) ? r->
count : 0u;
223 __asm__
volatile (
"svc %0\n" : :
"I" (
SVC_SB_INIT));
245 :
"r" ((uint32_t)msg_id),
"r" ((uint32_t)pipe_idx),
271 :
"r" ((uint32_t)msg_id),
"r" ((uint32_t)pipe_idx),
298 :
"r" ((uint32_t)msg_id),
"r" ((uint32_t)(uintptr_t)data),
302 return (uint8_t)result;
324 return (uint8_t)result;
344 return (uint8_t)result;
#define SB_MAX_ROUTES
Maximum number of distinct message IDs that can have subscriptions.
#define SB_MAX_SUBS_PER_MSG
Maximum subscribers per message ID.
ICARUS OS - Main API Header.
void __pipe_write_bytes(uint8_t pipe_idx, uint8_t *message, uint8_t message_bytes)
Privileged write gate: write bytes to pipe buffer.
bool __pipe_can_enqueue(uint8_t pipe_idx, uint8_t message_bytes)
Privileged call gate: can pipe accept message_bytes bytes?
static uint8_t route_used
Number of route slots in use.
static sb_route_t routes[32]
Route table — privileged DTCM, zero wait-state.
bool sb_subscribe(sb_msg_id_t msg_id, uint8_t pipe_idx)
Subscribe a pipe to a message ID via SVC gate.
void sb_init(void)
Initialize the software bus via SVC gate.
bool sb_unsubscribe(sb_msg_id_t msg_id, uint8_t pipe_idx)
Remove a subscription via SVC gate.
uint8_t __sb_subscriber_count(sb_msg_id_t msg_id)
Privileged implementation of sb_subscriber_count().
static sb_route_t * alloc_route(void)
Allocate a fresh route slot.
uint8_t sb_route_count(void)
Return the total route count via SVC gate.
bool __sb_subscribe(sb_msg_id_t msg_id, uint8_t pipe_idx)
Privileged implementation of sb_subscribe().
void __sb_init(void)
Privileged implementation of sb_init().
uint8_t __sb_route_count(void)
Privileged implementation of sb_route_count().
uint8_t sb_publish(sb_msg_id_t msg_id, const uint8_t *data, uint8_t len)
Publish a message to all subscribers via SVC gate.
uint8_t __sb_publish(sb_msg_id_t msg_id, const uint8_t *data, uint8_t len)
Privileged implementation of sb_publish().
bool __sb_unsubscribe(sb_msg_id_t msg_id, uint8_t pipe_idx)
Privileged implementation of sb_unsubscribe().
static sb_route_t * find_route(sb_msg_id_t msg_id)
Find the route entry for msg_id.
uint8_t sb_subscriber_count(sb_msg_id_t msg_id)
Return the subscriber count for a message ID via SVC gate.
uint16_t sb_msg_id_t
Software Bus message identifier.
Single route entry: one msg_id → up to SB_MAX_SUBS_PER_MSG pipes.
bool used
Slot is occupied
uint8_t pipes[4]
Subscriber pipe indices
sb_msg_id_t msg_id
Subscribed message ID
uint8_t count
Active subscriber count
ICARUS Supervisor Call (SVC) Definitions.
#define SVC_SB_ROUTE_COUNT
#define SVC_SB_UNSUBSCRIBE
#define SVC_SB_SUBSCRIBER_COUNT