22uint64_t task::_up_ticks[NUMBER_OF_CORES] {0};
23task * task::_run_ptr [NUMBER_OF_CORES] {
nullptr};
24task * task::_run_next[NUMBER_OF_CORES] {
nullptr};
29task::task(std::function<
void()> f,
const char *n, uint16_t stack_size)
30 :
task(n, stack_size) {
36 delete [] _stack_base;
37 _stack_base =
nullptr;
40task::task(
const char * n, uint16_t stack_size)
43 strncpy(_name, n, 15);
45 _state = state_t::SUSPENDED;
49 _stack_size = stack_size;
50 _stack_base =
new uint8_t[_stack_size];
62void task::sign_up(core_t c, uint16_t priority,
bool priv) {
63 assert((priority > 0) && !_linked_in);
66 _core = (c == core_t::CURRENT_CORE) ? get_core() : (int8_t)c;
69 for(uint16_t i=0; i < _stack_size; ++i) {
70 _stack_base[i] = STACK_MAGIC;
78 _state = state_t::READY;
86 _list[_core].push_back(
this);
95 _list[_core].remove(
this);
102void task::sleep_ms(uint32_t ms) {
105 uint64_t until = millis() + ms;
106 if (multitasking_running()) {
108 task * t = task::currentTask();
111 t->_sleep_until = until;
112 t->_state = state_t::SLEEPING;
116 while(millis() < until) ;
120void task::suspend() {
121 _state = state_t::SUSPENDED;
125 _state = state_t::READY;
130 _state = state_t::BLOCKED;
133void task::join()
const {
134 while ( _linked_in ) yield();
137uint16_t task::getUsedStack() {
139 for (i=0; i < _stack_size; ++i) {
140 if (_stack_base[i] != STACK_MAGIC)
break;
142 return _stack_size - i;
145uint32_t task::getDeltaTicks() {
146 uint32_t now = _ticks;
147 uint32_t ret = now - _last_ticks;
163void task::_scheduler() {
164 int8_t c = get_core();
165 task * cur_ptr = _run_ptr[c]->_next;
166 task * next_ptr =
nullptr;
167 uint16_t max_prio = 0;
169 for(
int i=0; i < _list[c].getSize(); ++i) {
170 state_t & state = cur_ptr->_state;
171 uint16_t prio = cur_ptr->_priority;
174 if (state == state_t::SLEEPING) {
175 if (millis() >= cur_ptr->_sleep_until) {
176 state = state_t::READY;
180 if (state == state_t::BLOCKED) {
181 if (!cur_ptr->_lock->is_locked()) {
182 state = state_t::READY;
186 if ((state == state_t::READY) && (prio > max_prio)) {
189 #ifdef SIMPLE_ROUND_ROBIN
193 cur_ptr = cur_ptr->_next;
199 if (next_ptr != _run_ptr[c]) {
200 _run_next[c] = next_ptr;
205void task::_tick_handler() {
207 int8_t c = get_core();
215 ++(_run_ptr[c]->_ticks);