ICARUS OS (Intelligent Cooperative Architecture for Real-time Unified Systems) 0.1.0
Preemptive Real-Time Operating System for ARM Cortex-M7
Loading...
Searching...
No Matches
event.c
Go to the documentation of this file.
1
22#include "icarus/icarus.h"
23#include <string.h>
24
25/* ---- Backing storage in DTCM_PRIV --------------------------------------- */
26
28DTCM_DATA_PRIV static uint32_t ring_head; /* next write index */
29DTCM_DATA_PRIV static uint32_t ring_count; /* valid entry count */
31
32/* ---- Privileged implementations ----------------------------------------- */
33
35 (void)memset(ring, 0, sizeof(ring));
36 ring_head = 0u;
37 ring_count = 0u;
38 for (uint32_t i = 0u; i < (uint32_t)EVENT_MOD_MAX; i++) {
40 }
41}
42
43ITCM_FUNC void __os_event(uint8_t module_id, event_severity_t severity,
44 uint16_t event_id, const void *payload,
45 uint8_t payload_len) {
46 if (module_id >= (uint8_t)EVENT_MOD_MAX) {
47 return;
48 }
49 if ((uint8_t)severity < (uint8_t)squelch[module_id]) {
50 return;
51 }
52 uint8_t pl_len = payload_len;
53 if (pl_len > 12u) {
54 pl_len = 12u;
55 }
56
57 event_entry_t *entry = &ring[ring_head];
58 entry->module_id = module_id;
59 entry->severity = (uint8_t)severity;
60 entry->event_id = event_id;
61
62 (void)memset(entry->payload, 0, sizeof(entry->payload));
63 if ((payload != NULL) && (pl_len > 0u)) {
64 (void)memcpy(entry->payload, payload, pl_len);
65 }
66
67 ring_head = (ring_head + 1u) % (uint32_t)EVENT_RING_SIZE;
68 if (ring_count < (uint32_t)EVENT_RING_SIZE) {
69 ring_count++;
70 }
71}
72
73ITCM_FUNC void __event_set_squelch(uint8_t module_id,
74 event_severity_t min_severity) {
75 if (module_id >= (uint8_t)EVENT_MOD_MAX) {
76 return;
77 }
78 squelch[module_id] = min_severity;
79}
80
82 if (module_id >= (uint8_t)EVENT_MOD_MAX) {
83 return EVENT_DEBUG;
84 }
85 return squelch[module_id];
86}
87
88ITCM_FUNC bool __event_drain(event_entry_t *out_buf, uint8_t max_entries,
89 uint8_t *num_drained) {
90 if ((out_buf == NULL) || (max_entries == 0u)) {
91 if (num_drained != NULL) {
92 *num_drained = 0u;
93 }
94 return false;
95 }
96
97 if (ring_count == 0u) {
98 if (num_drained != NULL) {
99 *num_drained = 0u;
100 }
101 return false;
102 }
103
104 /* Index of the oldest entry */
105 uint32_t tail;
106 if (ring_count < (uint32_t)EVENT_RING_SIZE) {
107 tail = 0u;
108 } else {
109 tail = ring_head; /* head points to oldest when full */
110 }
111
112 uint32_t to_drain = ring_count;
113 if (to_drain > (uint32_t)max_entries) {
114 to_drain = (uint32_t)max_entries;
115 }
116
117 for (uint32_t i = 0u; i < to_drain; i++) {
118 uint32_t idx = (tail + i) % (uint32_t)EVENT_RING_SIZE;
119 (void)memcpy(&out_buf[i], &ring[idx], sizeof(event_entry_t));
120 }
121
122 ring_count -= to_drain;
123 if (ring_count == 0u) {
124 ring_head = 0u;
125 }
126
127 if (num_drained != NULL) {
128 *num_drained = (uint8_t)to_drain;
129 }
130 return true;
131}
132
134 return ring_count;
135}
void __event_init(void)
Definition event.c:34
event_severity_t __event_get_squelch(uint8_t module_id)
Definition event.c:81
static event_severity_t squelch[16]
Definition event.c:30
void __os_event(uint8_t module_id, event_severity_t severity, uint16_t event_id, const void *payload, uint8_t payload_len)
Definition event.c:43
bool __event_drain(event_entry_t *out_buf, uint8_t max_entries, uint8_t *num_drained)
Definition event.c:88
uint32_t __event_get_count(void)
Definition event.c:133
static event_entry_t ring[32]
Definition event.c:27
static uint32_t ring_head
Definition event.c:28
static uint32_t ring_count
Definition event.c:29
void __event_set_squelch(uint8_t module_id, event_severity_t min_severity)
Definition event.c:73
#define EVENT_MOD_MAX
Definition event.h:40
#define EVENT_RING_SIZE
Definition event.h:44
event_severity_t
Definition event.h:30
@ EVENT_DEBUG
Definition event.h:31
#define DTCM_DATA_PRIV
Definition config.h:156
#define ITCM_FUNC
Definition config.h:155
ICARUS OS - Main API Header.
Definition event.h:49
uint8_t payload[12]
Definition event.h:53
uint8_t severity
Definition event.h:51
uint16_t event_id
Definition event.h:52
uint8_t module_id
Definition event.h:50