Mercurial > hg > Game > Cerium
view TaskManager/kernel/schedule/Scheduler.h @ 366:0251d06467de draft
rename include/TaskManager/* and add memory
author | aaa |
---|---|
date | Mon, 27 Jul 2009 15:51:18 +0900 |
parents | include/TaskManager/Scheduler.h@5b995810b86a |
children | 205e4a4af635 |
line wrap: on
line source
#ifndef INCLUDED_SCHEDULER #define INCLUDED_SCHEDULER #include "base.h" #include "TaskList.h" #include "ListData.h" #include "DmaManager.h" #include "SchedTaskBase.h" #include "SchedTaskList.h" #include "TaskGroup.h" #define MAX_USER_TASK 32 #define MAX_SYSTEM_TASK 2 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK #define MAX_GLOBAL_AREA 32 #define MAX_MAINMEM_AREA 32 class SchedTaskBase; class SchedTask; class SchedTaskList; class Scheduler { public: virtual ~Scheduler(void); BASE_NEW_DELETE(Scheduler); /* variables */ int id; // double buffering TaskListPtr buff_taskList[2]; ListDataPtr buff_inListData[2]; ListDataPtr buff_outListData[2]; int buffFlag_taskList; int buffFlag_inListData; int buffFlag_outListData; /* TaskList 関連 */ /** * 実行中 TaskList の現在の位置 (list->tasks[index]) * * bakIndex_taskList がある理由 * taskList の途中で renew task が作られたとき、 * 即座に実行するため、TaskList -> RenewTaskList と移って処理する。 * RenewTaskList が終了したとき、再び TaskList に戻ってくるが * Renew Task を生成した所から再スタートするため、 * taskList の index を覚えておく (backup) * 同様に TaskList も覚えておく */ int bakIndex_taskList; TaskListPtr bak_curTaskList; /** * タスク内で生成されたタスクを入れる * Linked List で管理 */ TaskListPtr renewCur_taskList; TaskListPtr renewTop_taskList; /** * 実行中 TaskList が Renew されたものかどうかのフラグ * Renew の場合、ListData は DMA する必要ないとか * いろいろな判定に使えるかもしれん * if (flag == 1) taskList is Renew */ int flag_renewTaskList; /** * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、 * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。 * なので、Tc を process group として記憶しておく。 * * Tc が taskGroup のアドレスを持つので * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk */ TaskGroupPtr taskGroup; /* GlobalMemoryList */ void* globalList[MAX_GLOBAL_AREA]; /* MainMemory Allocate Command List */ void* mainMemList[MAX_MAINMEM_AREA]; // Task Object Table // this is named TaskObject but it is not an object. // It is a pointer to an object creation function typedef SchedTask* (*TaskObject)(void); DmaManager* connector; // Pipeline Stage SchedTaskBase* task1; SchedTaskBase* task2; SchedTaskBase* task3; /* functions */ void init(void); void run(void); virtual void init_impl(void) {}; void finish(void); TaskListPtr get_curListBuf(void); ListDataPtr get_curReadBuf(void); ListDataPtr get_curWriteBuf(void); TaskListPtr get_renewListBuf(void); void set_backupTaskList(TaskListPtr cur_taskList); void set_backupTaskListIndex(int cur_index); SchedTaskList* get_nextRenewTaskList(void); TaskListPtr get_backupTaskList(void); int get_backupTaskListIndex(void); // なんか名前が変だが。。。 /* TaskGroup */ TaskGroupPtr set_groupTask(uint32 command); void add_groupTask(TaskGroupPtr group, TaskPtr task); void remove_groupTask(TaskGroupPtr group, TaskPtr task); void reload_groupTask(void); uint32 status_groupTask(TaskGroupPtr group); /* GlobalMemory */ void* global_alloc(int id, int size); void* global_get(int id); void global_free(int id); virtual void *allocate(int size) { return NULL; }; virtual void mainMem_alloc(int id, int size) {}; virtual void mainMem_wait(void) {}; void *mainMem_get(int id); /* DMA Transfer */ void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask); void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask); void dma_wait(uint32 mask); void show_dma_wait() { connector->show_dma_wait(id); }; void show_dma_wait(int id) { connector->show_dma_wait(id); }; void mail_write(uint32 data); uint32 mail_read(void); void dma_loadList(ListDataPtr list, void *, uint32 mask); void dma_storeList(ListDataPtr list, void *, uint32 mask); }; extern void register_task(int cmd, Scheduler::TaskObject task); #endif #define SchedConstructor(str) \ str(void) {} \ BASE_NEW_DELETE(str) \ #define SchedDefineTask(str) \ SchedTask* createTask_##str(void) \ { \ return new str(); \ } #define SchedExternTask(str) \ extern \ SchedTask* createTask_##str(void); #define SchedRegisterTask(cmd, str) \ register_task(cmd, createTask_##str);