43 task(std::function<
void()> f,
44 const char * n, uint16_t stack_size=DEFAULT_STACK_SIZE);
49 task & operator= (
const task &) =
delete;
54 explicit task(
const char * n, uint16_t stack_size=DEFAULT_STACK_SIZE);
57 virtual void run() { _f(); }
65 enum state_t : uint8_t {
72 static inline const char * state_to_str(state_t state) {
73 static const char * names[] =
74 {
"READY",
"SLEEPING",
"SUSPENDED",
"BLOCKED" };
84 void sign_up(core_t = core_t::CURRENT_CORE,
85 uint16_t priority = DEFAULT_PRIORITY,
101 static void sleep_ms(uint32_t ms);
130 inline const char * getName()
const {
return _name; }
131 inline uint16_t getPriority()
const {
return _priority; }
132 inline void setPriority(uint16_t p) { _priority = p; }
133 inline state_t getState()
const {
return _state; }
134 inline uint32_t getMillisRun()
const {
return (_ticks * 1000) / TICK_FREQUENCY; }
135 inline uint16_t getStackSize()
const {
return _stack_size; }
136 inline bool isLinkedIn()
const {
return _linked_in; }
139 uint16_t getUsedStack();
142 uint32_t getDeltaTicks();
147 uint16_t _priority {0};
150 uint32_t _last_ticks {0};
151 uint64_t _sleep_until {0};
155 uint8_t * _stack_base;
156 uint16_t _stack_size;
157 uint8_t * _stack_ptr;
160 static task * _run_ptr [NUMBER_OF_CORES];
161 static task * _run_next[NUMBER_OF_CORES];
162 static uint64_t _up_ticks[NUMBER_OF_CORES];
176 std::function<void(
void)> _f;
182 void _setup_stack (
bool priv);
183 static void _context_switch();
186 static void start_scheduler();
188 static void cpu_sleep();
189 static void enterCritical();
190 static void leaveCritical();
191 static uint64_t millis();
192 static bool is_irq_context();
193 static bool multitasking_running();
194 static int8_t get_core();
196 bool isPrivileged()
const;
197 bool isUsingFloat()
const;
204 static void _scheduler();
205 static void _tick_handler ();
207 static task * currentTask() {
211 static void _switchToHead() {
213 _run_ptr[c] = _list[c].getHead();
215 static inline void _switchToNext() {
217 _run_ptr[c] = _run_next[c];
219 static inline uint8_t * _getStackBase() {
221 return _run_ptr[c]->_stack_base;
223 static inline uint8_t * _getStackPtr() {
225 return _run_ptr[c]->_stack_ptr;
227 static inline void _setStackPtr(uint8_t *s) {
229 _run_ptr[c]->_stack_ptr = s;