agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
task_scheduler.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_TASK_SCHEDULER_H
8 #define ZRTOS_TASK_SCHEDULER_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/zrtos.h>
15 #include <zrtos/types.h>
16 #include <zrtos/clist.h>
17 #include <zrtos/error.h>
18 #include <zrtos/task.h>
19 
20 
21 typedef struct _zrtos_task_scheduler_t{
27 
28 
30 
31 
32 #define ZRTOS_TASK_SCHEDULER__DO_NOT_DISTURB(code) \
33  do{ \
34  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
35  zrtos_task_scheduler.do_not_disturb++; \
36  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
37  do{ \
38  code; \
39  }while(0); \
40  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
41  zrtos_task_scheduler.do_not_disturb--; \
42  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
43  }while(0);
44 
45 
46 #define ZRTOS_TASK_SCHEDULER__DO_NOT_DISTURB_EX(is_locked,code) \
47  do{ \
48  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
49  is_locked = (zrtos_task_scheduler.do_not_disturb == 0); \
50  zrtos_task_scheduler.do_not_disturb++; \
51  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
52  do{ \
53  code; \
54  }while(0); \
55  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
56  zrtos_task_scheduler.do_not_disturb--; \
57  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
58  }while(0);
59 
60 
63  &zrtos_task_scheduler.root
64  );
66 }
67 
71  zrtos_clist__push(&zrtos_task_scheduler.root,&task->node);
72  });
73 
74  return true;
75 }
76 
79  zrtos_clist__delete(&zrtos_task_scheduler.root,&task->node);
80  zrtos_task__set_parent(task,0);
81  });
82 
83  return true;
84 }
85 
87  bool ret = false;
88 
91  zrtos_task_t *sentinel = node;
92 
93  do{
94  if(node == task){
95  ret = true;
96  break;
97  }
98  node = zrtos_task__get_next_task(node);
99  }while(node != sentinel);
100  });
101 
102  return ret;
103 }
104 
106  return &zrtos_task_scheduler.sleep_task;
107 }
108 
112  active_task
113  ,zrtos_task_scheduler.tmp_stack_ptr
114  );
115  zrtos_task__set_errno(active_task,errno);
116 }
117 
119  zrtos_task_t *task
120 ){
121  zrtos_clist__set_root(&zrtos_task_scheduler.root,&task->node);
122  zrtos_task_scheduler.tmp_stack_ptr = zrtos_task__get_stack_ptr(task);
124 }
125 
129  return true;
130 }
131 
134  zrtos_task_t *task = active_task;
135 
136  do{
137  zrtos_task__on_tick(task);
138  task = zrtos_task__get_next_task(task);
139  }while(task != active_task);
140 
141  task = active_task;
142  do{
143  task = zrtos_task__get_next_task(task);
144  if(zrtos_task__is_ready(task)){
146  }
147  }while(task != active_task);
148 
151  );
152 
153  return true;
154 }
155 
156 #pragma GCC push_options
157 #pragma GCC optimize ("O0")
158 __attribute__((naked)) void _zrtos_task_scheduler__on_tick(void){
159  ZRTOS_ARCH__SAVE_CPU_STATE_EX(zrtos_task_scheduler.tmp_stack_ptr);
160  if(zrtos_task_scheduler.do_not_disturb == 0){
162  }
163  ZRTOS_ARCH__LOAD_CPU_STATE_EX(zrtos_task_scheduler.tmp_stack_ptr);
165 }
166 #pragma GCC pop_options
167 
170 }
171 
175  ,ms
176  );
178 }
179 
181 /*
182  while(true){
183  _zrtos_task_scheduler__on_tick_ex();
184  }
185  __builtin_unreachable();
186 */
187 }
188 
190  //_zrtos_task_scheduler__isr_stop();
191 }
192 
194  zrtos_clist__init(&zrtos_task_scheduler.root);
196  &zrtos_task_scheduler.sleep_task
197  ,(zrtos_arch_stack_t*)0
198  );
200  &zrtos_task_scheduler.root
201  ,&zrtos_task_scheduler.sleep_task.node
202  );
203  //zrtos_task_scheduler__add_task(&zrtos_task_scheduler.sleep_task);
204  //zrtos_task_scheduler.tmp_stack_ptr = 0;
205  zrtos_task_scheduler.do_not_disturb = 0;
207 }
208 
209 #define ZRTOS_TASK_SCHEDULER__EACH_TASK(node) \
210  for(zrtos_task_t *node = _zrtos_task_scheduler__get_active_task() \
211  ,*sentinel = node \
212  ,*next \
213  ;({ \
214  next = zrtos_task__get_next_task(node); \
215  node != sentinel; \
216  }) \
217  ;node = next \
218  )
219 
222  if(zrtos_task__get_parent(node) == task){
223  return node;
224  }
225  }
226  return 0;
227 }
228 
229 
230 #ifdef __cplusplus
231 }
232 #endif
233 #endif
#define ZRTOS_TASK_SCHEDULER__DO_NOT_DISTURB(code)
void zrtos_task__set_parent(zrtos_task_t *thiz, zrtos_task_t *parent)
Definition: task.h:140
void zrtos_task__set_stack_ptr(zrtos_task_t *thiz, zrtos_arch_stack_t *stack_ptr)
Definition: task.h:124
void zrtos_task_scheduler__init()
uint8_t zrtos_arch_stack_t
Definition: atmega2560.h:19
bool zrtos_task__init(zrtos_task_t *thiz, zrtos_arch_stack_t *stack_ptr)
Definition: task.h:44
bool zrtos_clist__init(zrtos_clist_t *thiz)
Definition: clist.h:61
void zrtos_task__on_tick(zrtos_task_t *thiz)
Definition: task.h:83
unsigned int zrtos_task_tick_t
Definition: task.h:24
bool zrtos_clist__delete(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:95
bool zrtos_task_scheduler__remove_task(zrtos_task_t *task)
void zrtos_task_scheduler__start(void)
#define ZRTOS_ARCH__LOAD_CPU_STATE_EX(ptr)
Definition: atmega2560.h:283
zrtos_arch_stack_t * zrtos_task__get_stack_ptr(zrtos_task_t *thiz)
Definition: task.h:128
static void zrtos_task_scheduler__page_task_in(zrtos_task_t *task)
struct _zrtos_task_scheduler_t zrtos_task_scheduler_t
zrtos_clist_node_t * zrtos_clist__get_root(zrtos_clist_t *thiz)
Definition: clist.h:25
#define ZRTOS_TASK_SCHEDULER__EACH_TASK(node)
#define ZRTOS_ARCH__RETURN_FROM_INTERRUPT()
Definition: atmega2560.h:293
static bool _zrtos_task_scheduler__set_active_task(zrtos_task_t *task)
bool zrtos_task_scheduler__add_task(zrtos_task_t *task)
#define zrtos_types__get_container_of(ptr, type, member)
Definition: types.h:69
#define ZRTOS_ARCH__SAVE_CPU_STATE_EX(ptr)
Definition: atmega2560.h:235
static void zrtos_task_scheduler__page_task_out(void)
zrtos_clist_node_t node
Definition: task.h:37
zrtos_task_scheduler_t zrtos_task_scheduler
zrtos_task_t * zrtos_task__get_next_task(zrtos_task_t *thiz)
Definition: task.h:114
static zrtos_task_t * zrtos_task_scheduler__get_any_child(zrtos_task_t *task)
void zrtos_task__set_delay_ms(zrtos_task_t *thiz, zrtos_task_tick_t ms)
Definition: task.h:75
static bool _zrtos_task_scheduler__switch_task(void)
zrtos_arch_stack_t * tmp_stack_ptr
zrtos_task_t * zrtos_task__get_parent(zrtos_task_t *thiz)
Definition: task.h:144
bool zrtos_task__is_ready(zrtos_task_t *thiz)
Definition: task.h:90
void _zrtos_task_scheduler__on_tick(void)
void zrtos_task_scheduler__stop(void)
zrtos_task_t * _zrtos_task_scheduler__get_active_task(void)
bool zrtos_task_scheduler__has_task(zrtos_task_t *task)
bool zrtos_clist__push(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:85
void zrtos_task_scheduler__delay_ms(zrtos_task_tick_t ms)
zrtos_error_t errno
Definition: errno.h:17
zrtos_error_t zrtos_task__get_errno(zrtos_task_t *thiz)
Definition: task.h:136
void zrtos_task__set_errno(zrtos_task_t *thiz, zrtos_error_t error_code)
Definition: task.h:132
void zrtos_clist__set_root(zrtos_clist_t *thiz, zrtos_clist_node_t *node)
Definition: clist.h:29
static zrtos_task_t * _zrtos_task_scheduler__get_sleep_task(void)
static void _zrtos_task_scheduler__on_tick_ex(void)