mruby/c VM Source Code master (2026/08/06)
Loading...
Searching...
No Matches
rrt0.h
Go to the documentation of this file.
1
14
15#ifndef MRBC_SRC_RRT0_H_
16#define MRBC_SRC_RRT0_H_
17
18/***** Feature test switches ************************************************/
19/***** System headers *******************************************************/
20//@cond
21#include <stddef.h>
22#include <stdint.h>
23#include "vm_config.h"
24//@endcond
25
26/***** Local headers ********************************************************/
27#include "vm.h"
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32/***** Constant values ******************************************************/
33
34//================================================
52
59
60static const int MRBC_TASK_DEFAULT_PRIORITY = 128;
62
63/* Sentinel stored in queue.wakeup_tick meaning "wait without a timeout".
64 The scheduler never produces this tick value for a real deadline
65 (mrbc_deadline_after_ms normalizes it away), so it is safe to reserve. */
66#define MRBC_WAIT_FOREVER UINT32_MAX
67
68#if !defined(MRBC_TASK_NAME_LEN)
69#define MRBC_TASK_NAME_LEN 15
70#endif
71
72
73/***** Macros ***************************************************************/
74/***** Typedefs *************************************************************/
75
76struct RMutex;
77
78//================================================
82typedef struct RTcb {
83#if defined(MRBC_DEBUG)
84 uint8_t obj_mark_[4];
85#endif
86 struct RTcb *next;
87 uint8_t priority;
89 volatile uint8_t timeslice;
90 uint8_t state;
91 uint8_t reason;
93
94 union {
95 uint32_t wakeup_tick;
96 struct RMutex *mutex;
97 struct {
98 void *target;
99 uint32_t wakeup_tick;
101 };
102 const struct RTcb *tcb_join;
104
105 struct VM vm;
106
108
109
110//================================================
114typedef struct RMutex {
115 volatile int lock;
116 struct RTcb *tcb;
118
119#define MRBC_MUTEX_INITIALIZER { 0 }
120
121
122/***** Global variables *****************************************************/
123/***** Function prototypes **************************************************/
124//@cond
125void mrbc_tick(void);
126mrbc_tcb *mrbc_tcb_new(int regs_size, enum MrbcTaskState task_state, int priority);
127mrbc_tcb *mrbc_create_task(const void *byte_code, mrbc_tcb *tcb);
128int mrbc_delete_task(mrbc_tcb *tcb);
129void mrbc_set_task_name(mrbc_tcb *tcb, const char *name);
130mrbc_tcb *mrbc_find_task(const char *name);
131int mrbc_start_task(mrbc_tcb *tcb);
132int mrbc_run(void);
133void mrbc_sleep_ms(mrbc_tcb *tcb, uint32_t ms);
134void mrbc_relinquish(mrbc_tcb *tcb);
136void mrbc_suspend_task(mrbc_tcb *tcb);
137void mrbc_resume_task(mrbc_tcb *tcb);
139void mrbc_join_task(mrbc_tcb *tcb, const mrbc_tcb *tcb_join);
144void mrbc_cleanup(void);
145void mrbc_init(void *heap_ptr, unsigned int size);
146void pq(const mrbc_tcb *p_tcb);
147void pqall(void);
148void mrbc_task_q_insert(mrbc_tcb *p_tcb);
149void mrbc_task_q_delete(mrbc_tcb *p_tcb);
151uint32_t mrbc_deadline_after_ms(mrbc_int_t ms, int *p_overflow);
152int mrbc_deadline_reached(uint32_t deadline);
153void mrbc_register_wakeup(uint32_t wakeup_tick);
154//@endcond
155
156#if defined(MRBC_TASK_SCHEDULER_HOOK)
157//================================================
168void mrbc_task_set_scheduler_hook(void (*fn)(void *ud), void *ud);
169#endif
170
171
172/***** Inline functions *****************************************************/
173//================================================================
179static inline mrbc_tcb * mrbc_get_tcb( const mrbc_vm *vm )
180{
181 return (mrbc_tcb *)((uint8_t *)vm - offsetof(mrbc_tcb, vm));
182}
183
184
185#ifdef __cplusplus
186}
187#endif
188#endif // ifndef MRBC_SRC_RRT0_H_
struct RInstance mrbc_instance
Instance object.
void mrbc_join_task(mrbc_tcb *tcb, const mrbc_tcb *tcb_join)
Definition rrt0.c:789
void mrbc_set_task_name(mrbc_tcb *tcb, const char *name)
Definition rrt0.c:352
void mrbc_task_q_insert(mrbc_tcb *p_tcb)
Definition rrt0.c:94
void mrbc_init(void *heap_ptr, unsigned int size)
Definition rrt0.c:1634
void mrbc_terminate_task(mrbc_tcb *tcb)
Definition rrt0.c:774
mrbc_tcb * mrbc_task_q_waiting_head(void)
Definition rrt0.c:163
void mrbc_resume_task(mrbc_tcb *tcb)
Definition rrt0.c:741
int mrbc_mutex_unlock(mrbc_mutex *mutex, mrbc_tcb *tcb)
Definition rrt0.c:877
void mrbc_cleanup(void)
Definition rrt0.c:961
mrbc_tcb * mrbc_tcb_new(int regs_size, enum MrbcTaskState task_state, int priority)
Definition rrt0.c:273
mrbc_tcb * mrbc_find_task(const char *name)
Definition rrt0.c:370
mrbc_tcb * mrbc_create_task(const void *byte_code, mrbc_tcb *tcb)
Definition rrt0.c:298
void mrbc_tick(void)
Definition rrt0.c:213
mrbc_mutex * mrbc_mutex_init(mrbc_mutex *mutex)
Definition rrt0.c:814
void mrbc_change_priority(mrbc_tcb *tcb, int priority)
Definition rrt0.c:702
uint32_t mrbc_deadline_after_ms(mrbc_int_t ms, int *p_overflow)
Definition rrt0.c:603
void mrbc_sleep_ms(mrbc_tcb *tcb, uint32_t ms)
Definition rrt0.c:575
int mrbc_mutex_trylock(mrbc_mutex *mutex, mrbc_tcb *tcb)
Definition rrt0.c:934
int mrbc_deadline_reached(uint32_t deadline)
Definition rrt0.c:625
int mrbc_mutex_lock(mrbc_mutex *mutex, mrbc_tcb *tcb)
Definition rrt0.c:833
void mrbc_register_wakeup(uint32_t wakeup_tick)
Definition rrt0.c:639
void mrbc_suspend_task(mrbc_tcb *tcb)
Definition rrt0.c:722
void mrbc_relinquish(mrbc_tcb *tcb)
Definition rrt0.c:689
int mrbc_start_task(mrbc_tcb *tcb)
Definition rrt0.c:393
int mrbc_run(void)
Definition rrt0.c:448
void mrbc_task_q_delete(mrbc_tcb *p_tcb)
Definition rrt0.c:128
int mrbc_delete_task(mrbc_tcb *tcb)
Definition rrt0.c:332
struct RTcb mrbc_tcb
Task control block.
MrbcTaskState
Task state.
Definition rrt0.h:45
@ TASKSTATE_SUSPENDED
Suspended.
Definition rrt0.h:50
@ TASKSTATE_READY
Ready.
Definition rrt0.h:47
@ TASKSTATE_WAITING
Waiting.
Definition rrt0.h:49
@ TASKSTATE_RUNNING
Running.
Definition rrt0.h:48
@ TASKSTATE_DORMANT
Domant.
Definition rrt0.h:46
static const int MRBC_TASK_DEFAULT_STATE
Definition rrt0.h:61
struct RMutex mrbc_mutex
Mutex.
static mrbc_tcb * mrbc_get_tcb(const mrbc_vm *vm)
Definition rrt0.h:179
MrbcTaskReason
Definition rrt0.h:53
@ TASKREASON_JOIN
Definition rrt0.h:56
@ TASKREASON_MUTEX
Definition rrt0.h:55
@ TASKREASON_QUEUE
Definition rrt0.h:57
@ TASKREASON_SLEEP
Definition rrt0.h:54
#define MRBC_TASK_NAME_LEN
Definition rrt0.h:69
static const int MRBC_TASK_DEFAULT_PRIORITY
Definition rrt0.h:60
Mutex.
Definition rrt0.h:114
volatile int lock
Definition rrt0.h:115
struct RTcb * tcb
Definition rrt0.h:116
Task control block.
Definition rrt0.h:82
uint8_t priority
task priority. initial value.
Definition rrt0.h:87
void * target
Task::Queue instance waited on (TASKREASON_QUEUE).
Definition rrt0.h:98
struct VM vm
Definition rrt0.h:105
char name[MRBC_TASK_NAME_LEN+1]
task name (optional)
Definition rrt0.h:92
const struct RTcb * tcb_join
joined task.
Definition rrt0.h:102
uint8_t priority_preemption
task priority. effective value.
Definition rrt0.h:88
uint8_t state
task state. defined in MrbcTaskState.
Definition rrt0.h:90
struct RMutex * mutex
Definition rrt0.h:96
mrbc_instance * task_instance
Task instance or NULL.
Definition rrt0.h:103
volatile uint8_t timeslice
time slice counter.
Definition rrt0.h:89
uint8_t reason
sub state. defined in MrbcTaskReason.
Definition rrt0.h:91
uint32_t wakeup_tick
wakeup time for sleep state.
Definition rrt0.h:95
struct RTcb::@363107132000246361337323266072372261072345062300::@123367244141214366021077021374060365005063270262 queue
queue wait state (TASKREASON_QUEUE).
struct RTcb * next
daisy chain in task queue.
Definition rrt0.h:86
Virtual Machine.
Definition vm.h:150
int32_t mrbc_int_t
Definition value.h:47
mruby bytecode executor.
struct VM mrbc_vm
Virtual Machine.
Global configuration of mruby/c VM's.