#pragma once #include #include #include #include #define SIGNAL_MAX 32 #define SIGNAL_MY_BASE 4 #if SIGNAL_MAX > 32 #define SIGNAL_ONE 1ULL typedef uint64_t Signals; #elif SIGNAL_MAX > 16 #define SIGNAL_ONE 1UL typedef uint32_t Signals; #elif SIGNAL_MAX > 8 #define SIGNAL_ONE 1U typedef uint16_t Signals; #else #define SIGNAL_ONE 1 typedef uint8_t Signals; #endif #define SIGNAL(n) (SIGNAL_ONE << (n)) #define MY_SIGNAL(n) (SIGNAL_ONE << (SIGNAL_MY_BASE+n)) #define SIGNAL_SET(s,n) ((s) | SIGNAL(n)) #define SIGNAL_RESET(s,n) ((s) & ~SIGNAL(n)) #define SIGNAL_TEST(s,n) ((s) & SIGNAL(n)) extern int execTicks; struct Task { struct Node node; uintptr_t sp; Signals sig_alloc; Signals sig_wait; Signals sig_received; Signals sig_except; atomic_int *blocked_address; int blocked_value; uint32_t forbids; }; void TasksInit(void); void AddTask(struct Task *task, uintptr_t initial_pc, uintptr_t final_pc); struct Task *CreateTask(char *name, int8_t pri, uintptr_t initial_pc, size_t stack_size); struct Task *ThisTask(void); void Block(struct Task *task, atomic_int *address, int value); void Yield(void); void Delay(int ticks); void InterruptsSaveAndDisable(void); void InterruptsRestore(void); int Forbid(); int Permit(); uint8_t AllocSignal(uint8_t hint); void FreeSignal(uint8_t signal); void Signal(struct Task *task, Signals signals); Signals Wait(Signals signals);