58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
#pragma once
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdatomic.h>
|
|
#include <exec/list.h>
|
|
|
|
#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); |