agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
vheap_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_VHEAP_TASK_SCHEDULER_H
8 #define ZRTOS_VHEAP_TASK_SCHEDULER_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/types.h>
15 #include <zrtos/vheap_task.h>
16 #include <zrtos/vheap.h>
17 
18 
22  uint16_t ctx_switch_task_stack[100];
23  size_t start_offset;
25 
26 
28 
29 
31  return zrtos_vheap_task_scheduler.heap;
32 }
33 
35  zrtos_vheap_task_scheduler.heap = heap;
36 }
37 
41  ,sizeof(zrtos_vheap_task_t)
42  );
43 }
44 
45 #pragma GCC push_options
46 #pragma GCC optimize ("O0")
48  ZRTOS_ARCH__LOAD_CPU_STATE_EX(zrtos_vheap_task_scheduler.tmp_stack_ptr);
50 }
51 #pragma GCC pop_options
52 
56 
57  zrtos_vheap_task__set_stack_ptr(task,zrtos_vheap_task_scheduler.tmp_stack_ptr);
60  heap
64  ,zrtos_vheap_task_scheduler.tmp_stack_ptr
65  )
66  );
67 }
68 
70  /*zrtos_vheap_task_t *task
71  ,*/zrtos_vheap_chunk_t *chunk
72 ){
73  zrtos_vheap_task_t *task;
76  heap
77  ,chunk
78  );
80  zrtos_vheap_task_scheduler.tmp_stack_ptr = zrtos_vheap_task__get_stack_ptr(task);
82 }
83 
85  /*zrtos_vheap_task_t *task
86  ,zrtos_vheap_chunk_t *chunk*/
88 ){
90  zrtos_vheap_chunk_t *chunk;
92  chunk = zrtos_vheap__get_by_id(
93  heap
94  ,uid
95  );
97 
98  return true;
99 }
100 
102  zrtos_vheap_task_t *task
103  ,zrtos_vheap_chunk_t *chunk
104 ){
106  //@todo stack_size_min
107  //size_t stack_size_min = zrtos_vheap_task__get_stack_size_min(task);
109  mem
110  ,zrtos_vheap_task_scheduler.tmp_stack_ptr
111  )
112  <= ZRTOS_TYPES__MAX(
115  ) - zrtos_vheap_chunk__get_length(chunk)){
117  return false;
118  }
119  return true;
120 }
121 
125  heap
127  );
128  if(chunk){
131  while(true){}
132  return true;
133  }
134  return false;
135 }
136 
137 #define ZRTOS_VHEAP_TASK_SCHEDULER__EACH_TASK_BEGIN(thiz,start_offset,pos,chunk,task)\
138  ZRTOS_VHEAP__EACH_EX_BEGIN( \
139  thiz \
140  ,start_offset \
141  ,pos \
142  ,ZRTOS_VHEAP_TYPE__TASK_IDLE \
143  ,chunk \
144  ){ \
145  zrtos_vheap_task_t *task = zrtos_types__ptr_subtract( \
146  zrtos_types__ptr_add( \
147  zrtos_vheap_chunk__get_ptr(chunk) \
148  ,zrtos_vheap_chunk__get_length(chunk) \
149  ) \
150  ,sizeof(zrtos_vheap_task_t) \
151  ); \
152  {
153 
154 #define ZRTOS_VHEAP_TASK_SCHEDULER__EACH_TASK_END \
155  } \
156  }ZRTOS_VHEAP__EACH_EX_END
157 
159  uint8_t tmp = 1;
160  size_t offset = 0;
161  do{
164  ,offset
165  ,pos
166  ,chunk
167  ,task
168  ){
169  if(tmp){
171  }else{
172  if(!zrtos_vheap_task__is_idle(task)
174  task
175  ,chunk
176  )
177  ){
178  /*size_t chunk_count = zrtos_vheap__get_chunk_count(
179  zrtos_vheap_task_scheduler__get_heap()
180  );
181 
182  zrtos_vheap_task_scheduler.start_offset = pos+1;
183  zrtos_vheap_task_scheduler.start_offset = zrtos_vheap_task_scheduler.start_offset < chunk_count
184  ? zrtos_vheap_task_scheduler.start_offset
185  : 0
186  ;*/
187 
189  /*task
191  );
192  goto L_OUT;
193  }
194  }
196 
197  //offset = zrtos_vheap_task_scheduler.start_offset;
198  }while(tmp--);
199 
200 L_OUT:
202 }
203 
204 #pragma GCC push_options
205 #pragma GCC optimize ("O0")
207  ZRTOS_ARCH__SAVE_CPU_STATE_EX(zrtos_vheap_task_scheduler.tmp_stack_ptr);
208 
210  zrtos_debug__memset(
211  (void*)zrtos_vheap_task_scheduler.ctx_switch_task_stack
212  ,0xbb
214  zrtos_vheap_task_scheduler.ctx_switch_task_stack
215  )*sizeof(zrtos_vheap_task_scheduler.ctx_switch_task_stack[0])
216  );
217  });
218 
220  zrtos_vheap_task_scheduler.ctx_switch_task_stack
222  zrtos_vheap_task_scheduler.ctx_switch_task_stack
223  )
224  );
225 
227 }
228 #pragma GCC pop_options
229 
233  ,ms
234  );
236 }
237 
238 __attribute__((noreturn)) void zrtos_vheap_task_scheduler__trampoline_cb(
239  zrtos_vheap_task_t *thiz
240  ,void *(*callback)(void *args)
241  ,void *args
242 ){
243  void *ret = callback(args);
247  );
250 
252 
253  __builtin_unreachable();
254  while(1){
255  //should not return
256  }
257 }
258 
259 #ifdef __cplusplus
260 }
261 #endif
262 #endif
#define ZRTOS_VHEAP_TASK_SCHEDULER__EACH_TASK_END
uint8_t zrtos_arch_stack_t
Definition: atmega2560.h:19
void * zrtos_types__ptr_subtract(void *ptr, size_t byte_len)
Definition: types.h:39
static void _zrtos_vheap_task_scheduler__restore_task(void)
void zrtos_vheap_task__set_errno(zrtos_vheap_task_t *thiz, zrtos_error_t errno)
Definition: vheap_task.h:86
#define ZRTOS_TYPES__MAX(a, b)
Definition: types.h:79
#define ZRTOS_DEBUG__CODE(code)
Definition: debug.h:47
#define ZRTOS_ARCH__FATAL()
Definition: atmega2560.h:30
void _zrtos_vheap_task_scheduler__on_tick(void)
bool zrtos_vheap_task__is_idle(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:71
#define ZRTOS_ARCH__LOAD_CPU_STATE_EX(ptr)
Definition: atmega2560.h:283
bool zrtos_vheap_task_scheduler__has_enough_stack_space(zrtos_vheap_task_t *task, zrtos_vheap_chunk_t *chunk)
#define ZRTOS_ARCH__SET_STACK_PTR(ptr)
Definition: atmega2560.h:32
void zrtos_vheap_task__set_return_value(zrtos_vheap_task_t *thiz, void *return_value)
Definition: vheap_task.h:98
static void zrtos_vheap_task_scheduler__page_task_in(zrtos_vheap_chunk_t *chunk)
void zrtos_vheap_task__set_delay_ms(zrtos_vheap_task_t *thiz, zrtos_vheap_task_tick_type_t ms)
Definition: vheap_task.h:59
zrtos_vheap_chunk_t * zrtos_vheap__get_by_id(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t uid)
Definition: vheap.h:81
void zrtos_vheap_task__set_stack_ptr(zrtos_vheap_task_t *thiz, zrtos_arch_stack_t *stack_ptr)
Definition: vheap_task.h:75
#define ZRTOS_ARCH__RETURN_FROM_INTERRUPT()
Definition: atmega2560.h:293
#define ZRTOS_ARCH__SAVE_CPU_STATE_EX(ptr)
Definition: atmega2560.h:235
void zrtos_vheap_task_scheduler__set_heap(zrtos_vheap_t *heap)
zrtos_vheap_chunk_t * zrtos_vheap__get_by_type_ex(zrtos_vheap_t *thiz, zrtos_vheap_type_t type)
Definition: vheap.h:107
size_t zrtos_vheap_chunk__get_length(zrtos_vheap_chunk_t *thiz)
Definition: vheap_chunk.h:32
zrtos_vheap_chunk_uid_t zrtos_vheap_chunk__get_uid(zrtos_vheap_chunk_t *thiz)
Definition: vheap_chunk.h:36
#define ZRTOS_VHEAP_TASK_SCHEDULER__EACH_TASK_BEGIN(thiz, start_offset, pos, chunk, task)
#define ZRTOS_TYPES__GET_STATIC_ARRAY_LENGTH(arr)
Definition: types.h:166
void * zrtos_vheap__get_last_address(zrtos_vheap_t *thiz)
Definition: vheap.h:52
size_t zrtos_types__ptr_get_byte_distance(void *bigger, void *smaller)
Definition: types.h:43
bool zrtos_vheap_task_scheduler__start(void)
size_t zrtos_vheap_task__get_stack_size_min(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:94
void zrtos_vheap_task__on_tick(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:67
zrtos_error_t zrtos_vheap_task__get_errno(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:90
zrtos_arch_stack_t * tmp_stack_ptr
volatile zrtos_vheap_task_scheduler_t zrtos_vheap_task_scheduler
zrtos_arch_stack_t * zrtos_vheap_task__get_stack_ptr(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:82
void zrtos_vheap_chunk__set_type(zrtos_vheap_chunk_t *thiz, zrtos_vheap_type_t type)
Definition: vheap_chunk.h:46
zrtos_error_t errno
Definition: errno.h:17
zrtos_vheap_task_t * _zrtos_vheap_task_scheduler__get_active_task(void)
void * zrtos_vheap__page_in(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
Definition: vheap.h:321
static uint8_t
Definition: mcp2515.h:159
struct _zrtos_vheap_task_scheduler_t zrtos_vheap_task_scheduler_t
static bool _zrtos_vheap_task_scheduler__set_active_task(zrtos_vheap_chunk_uid_t uid)
size_t _zrtos_vheap__get_free_space_ex(zrtos_vheap_t *thiz, void *stack_ptr)
Definition: vheap.h:60
void zrtos_vheap_task_scheduler__delay_ms(zrtos_vheap_task_delay_t ms)
static void zrtos_vheap_task_scheduler__page_task_out(void)
void _zrtos_vheap_task_scheduler__switch_task(void)
zrtos_vheap_t * zrtos_vheap_task_scheduler__get_heap(void)
void zrtos_vheap_task_scheduler__trampoline_cb(zrtos_vheap_task_t *thiz, void *(*callback)(void *args), void *args)
void zrtos_vheap__page_out(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk, size_t length)
Definition: vheap.h:349
uint16_t zrtos_vheap_task_delay_t
Definition: vheap_task.h:24