101 lines
2.1 KiB
C
101 lines
2.1 KiB
C
#ifndef YAKK_H
|
|
#define YAKK_H
|
|
|
|
#include "yaku.h"
|
|
|
|
#define null 0
|
|
#define IDLETASKSTACKSIZE 512
|
|
|
|
//Error Codes
|
|
#define NEW_TASK_FAILED 1
|
|
#define READY_QUEUE_EMPTY 2
|
|
#define NEW_SEM_FAILED 3
|
|
#define NEW_QUEUE_FAILED 4
|
|
|
|
//Kernel Data Structures
|
|
|
|
enum TaskState {T_BLOCKED, T_READY, T_RUNNING};
|
|
enum KernelState {K_BLOCKED, K_RUNNING};
|
|
|
|
typedef struct TCB {
|
|
unsigned int tid;
|
|
unsigned char priority;
|
|
void* stackPointer;
|
|
enum TaskState state;
|
|
unsigned int delayCount;
|
|
struct TCB* next;
|
|
struct TCB* prev;
|
|
} TCB;
|
|
|
|
typedef struct TaskBlock {
|
|
TCB TCBPool[MAX_TASKS+1];
|
|
unsigned int nextFreeTCB;
|
|
} TaskBlock;
|
|
|
|
typedef struct PriorityQueue {
|
|
TCB* head;
|
|
TCB* tail;
|
|
unsigned int size;
|
|
} PriorityQueue;
|
|
|
|
typedef struct DelayQueue {
|
|
TCB* head;
|
|
unsigned int size;
|
|
} DelayQueue;
|
|
|
|
typedef struct Semaphore {
|
|
int value;
|
|
PriorityQueue queue;
|
|
} YKSEM;
|
|
|
|
typedef struct SemBlock {
|
|
YKSEM SemPool[MAX_SEMS];
|
|
unsigned int nextFreeSem;
|
|
} SemBlock;
|
|
|
|
typedef struct MessageQueue {
|
|
void** messages;
|
|
unsigned int currentSize;
|
|
unsigned int maxSize;
|
|
PriorityQueue queue;
|
|
} YKQ;
|
|
|
|
typedef struct MessageQueueBlock {
|
|
YKQ QueuePool[MAX_QUEUES];
|
|
unsigned int nextFreeQueue;
|
|
} MsgQueueBlock;
|
|
|
|
//Kernel API
|
|
void YKInitialize(void);
|
|
void YKEnterMutex(void);
|
|
void YKExitMutex(void);
|
|
void YKIdleTask(void);
|
|
void YKNewTask(void (* task) (void), void *taskStack, unsigned char priority);
|
|
void YKDelayTask(unsigned count);
|
|
void YKEnterISR(void);
|
|
void YKExitISR(void);
|
|
unsigned int YKGetISRCallDepth(void);
|
|
void YKScheduler(void);
|
|
void YKDispatcher(TCB* readyTask);
|
|
void YKTickHandler(void);
|
|
YKSEM* YKSemCreate(int initialValue);
|
|
void YKSemPend(YKSEM* semaphore);
|
|
void YKSemPost(YKSEM* semaphore);
|
|
YKQ* YKQCreate(void** start, unsigned size);
|
|
void* YKQPend(YKQ* queue);
|
|
int YKQPost(YKQ* queue, void* msg);
|
|
//YKEVENT* YKEventCreate(unsigned initialValue);
|
|
//void YKEventSet(YKEVENT* event, unsigned eventMask);
|
|
//void YKEVentReset(YKEVENT* event, unsigned eventMask);
|
|
TCB* getNewTCB(void);
|
|
YKSEM* getNewSem(void);
|
|
YKQ* getNewQueue(void);
|
|
void YKRun(void);
|
|
unsigned int getYKCtxSwCount();
|
|
unsigned int getYKIdelCount();
|
|
void setYKIdelCount(int value);
|
|
void setYKCtxSwCount(int value);
|
|
unsigned int getYKTickNum();
|
|
|
|
#endif
|