21static msg_t *free_list_msg_pool;
22static uint8_t msg_pool_used;
27static void msg_pool_init(
void)
29 AKOS_CORE_ENTER_CRITICAL();
32 free_list_msg_pool = (msg_t *)msg_pool;
38 msg_pool[index].next = NULL;
42 msg_pool[index].next = (msg_t *)&msg_pool[index + 1];
48 AKOS_CORE_EXIT_CRITICAL();
64 AKOS_CORE_ENTER_CRITICAL();
66 p_msg->next = free_list_msg_pool;
67 free_list_msg_pool = p_msg;
74 AKOS_CORE_EXIT_CRITICAL();
85 p_msg_q->head_ptr = NULL;
86 p_msg_q->tail_ptr = NULL;
87 p_msg_q->size_max = size;
88 p_msg_q->size_curr = 0u;
103 AKOS_CORE_ENTER_CRITICAL();
106 if (p_msg_q->size_curr >= p_msg_q->size_max)
109 core_assert(0,
"OS_ERR_MSG_QUEUE_IS_FULL");
110 AKOS_CORE_EXIT_CRITICAL();
116 core_assert(0,
"OS_ERR_MSG_POOL_IS_FULL");
117 AKOS_CORE_EXIT_CRITICAL();
121 p_msg = free_list_msg_pool;
122 free_list_msg_pool = p_msg->next;
129 if (p_msg->content_ptr == NULL)
131 p_msg->next = free_list_msg_pool;
132 free_list_msg_pool = p_msg;
134 core_assert(0,
"OS_ERR_MEM_NO_BLOCK");
135 AKOS_CORE_EXIT_CRITICAL();
138 memcpy(p_msg->content_ptr, p_content, size);
140 if (p_msg_q->size_curr == 0u)
142 p_msg_q->head_ptr = p_msg;
143 p_msg_q->tail_ptr = p_msg;
144 p_msg_q->size_curr = 1u;
149 p_msg_tail = p_msg_q->tail_ptr;
150 p_msg_tail->next = p_msg;
151 p_msg_q->tail_ptr = p_msg;
154 p_msg_q->size_curr++;
157 AKOS_CORE_EXIT_CRITICAL();
167 AKOS_CORE_ENTER_CRITICAL();
170 if (p_msg_q->size_curr >= p_msg_q->size_max)
173 core_assert(0,
"OS_ERR_MSG_QUEUE_IS_FULL");
174 AKOS_CORE_EXIT_CRITICAL();
181 core_assert(0,
"OS_ERR_MSG_POOL_IS_FULL");
182 AKOS_CORE_EXIT_CRITICAL();
186 p_msg = free_list_msg_pool;
187 free_list_msg_pool = p_msg->next;
190 if (p_msg_q->size_curr == 0u)
192 p_msg_q->head_ptr = p_msg;
193 p_msg_q->tail_ptr = p_msg;
194 p_msg_q->size_curr = 1u;
199 p_msg_tail = p_msg_q->tail_ptr;
200 p_msg_tail->next = p_msg;
201 p_msg_q->tail_ptr = p_msg;
204 p_msg_q->size_curr++;
210 AKOS_CORE_EXIT_CRITICAL();
222 if (p_msg_q->size_curr == 0u)
229 p_msg = p_msg_q->head_ptr;
231 p_msg_q->head_ptr = p_msg->next;
233 if (p_msg_q->size_curr == 1u)
235 p_msg_q->head_ptr = NULL;
236 p_msg_q->tail_ptr = NULL;
237 p_msg_q->size_curr = 0u;
241 p_msg_q->size_curr--;
256 *p_msg_size = p_msg->size;
257 return p_msg->content_ptr;
269 if (p_msg_q->size_curr == 0u)
276 p_msg = p_msg_q->head_ptr;
278 p_msg_q->head_ptr = p_msg->next;
280 if (p_msg_q->size_curr == 1u)
282 p_msg_q->head_ptr = NULL;
283 p_msg_q->tail_ptr = NULL;
284 p_msg_q->size_curr = 0u;
288 p_msg_q->size_curr--;
#define OS_CFG_MSG_POOL_SIZE
Kernel control and critical-section API.
Static-heap allocator APIs.
void akos_memory_free(void *p_addr)
Free previously allocated memory block.
void * akos_memory_malloc(size_t size)
Allocate memory from OS heap.
void * akos_message_get_dynamic_data(msg_t *p_msg, uint8_t *p_msg_size)
Access payload pointer and payload size from dynamic message.
msg_t * akos_message_queue_get(msg_queue_t *p_msg_q)
Dequeue next message from queue.
msg_t * akos_message_queue_get_pure(msg_queue_t *p_msg_q)
Dequeue next pure message from queue.
void akos_message_init(void)
Initialize message subsystem.
void akos_message_free(msg_t *p_msg)
Free a message and return resources to pools.
int32_t akos_message_get_pure_data(msg_t *p_msg)
Read signal value from pure message.
void akos_message_queue_put_dynamic(msg_queue_t *p_msg_q, int32_t sig, void *p_content, uint8_t size)
Enqueue dynamic message and copy payload.
void akos_message_queue_init(msg_queue_t *p_msg_q, uint8_t size)
Initialize a message queue.
void akos_message_queue_put_pure(msg_queue_t *p_msg_q, int32_t sig)
Enqueue pure message (signal only).
Message object and message queue APIs.