struct Task { int pid = 0; bool running = false; int exit_code = 0; int (*callback)(int, unsigned int); unsigned long run_interval = 0; unsigned long run_accumulator = 0; unsigned int signal = 0; unsigned int signal_pending = 0; unsigned int signal_mask = 0xFFFF; }; void Kernel_setup(); void Kernel_tick(); // Panic and stop everything void Kernel_panic(char* message); // Start a new process int Kernel_start(int (*callback)(int, unsigned int), unsigned long interval); // Continue execution of a process void Kernel_enable(int pid); // Pause execution of a process void Kernel_disable(int pid); // Clean up exited process void Kernel_reap(int pid); // Send a signal to a/all processes void Kernel_signal(int pid, unsigned int signal); void Kernel_signal(unsigned int signal); // Set a tasks's signal mask void Kernel_signal_mask(int pid, unsigned int signal_mask); // Get the run interval of a process unsigned long Kernel_get_run_interval(int pid); void Kernel_set_run_interval(int pid, unsigned long interval); // Count how many tasks are running int Kernel_count_running_tasks(); // Check if process has exited bool Kernel_is_exited(int pid); // Get exit code of process int Kernel_get_exit_code(int pid); // Check if a button was pressed bool Kernel_read_input(int input); // Get how long *actually* elapsed since the last tick since we don't provide hard guarantees unsigned long Kernel_get_last_tick_duration(); #define SIGNAL_NONE 0x0000 #define SIGNAL_TICK 0x0001 #define SIGNAL_START 0x0002 #define SIGNAL_STOP 0x0004 #define SIGNAL_INPUT_A 0x0008 #define SIGNAL_INPUT_B 0x0010 #define SIGNAL_REDRAW 0x0020 #define KERNEL_INPUT_BUTTON_A 0 #define KERNEL_INPUT_BUTTON_B 1