#pragma once


#include "software-modes.h"

// Task routine type

typedef void (* RoutineTaskType) (USER_MODE) ;

// kernel_createTask

void kernel_createTask (INIT_MODE_
                        uint64_t * inStackBufferAddress,
                        uint32_t inStackBufferSize,
                        RoutineTaskType inTaskRoutine) ;


struct TaskControlBlock ;

TaskControlBlock * descriptorPointerForTaskIndex (const uint8_t inTaskIndex) ;

uint8_t indexForDescriptorTask (const TaskControlBlock * inTaskPtr) ; // should be not nullptr

// Task termination
void taskSelfTerminates(USER_MODE) asm ("task.self.terminates");
void service_taskSelfTerminates(KERNEL_MODE) asm ("service.task.self.terminates");
//$service task.self.terminates

// Task suspension
void kernel_blockOnDeadline (KERNEL_MODE_ const uint32_t inDeadline);

// Task reactivation
void irq_makeTasksReadyFromCurrentDate (IRQ_MODE);