Mercurial > hg > Members > kono > Cerium
view include/TaskManager/Scheduler.h @ 201:b257e27d995c
add SceneGraphIterator
author | gongo@gendarme.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Mon, 26 Jan 2009 16:46:59 +0900 |
parents | 72dcf908ec52 |
children | 6bb8725e60ae |
line wrap: on
line source
#ifndef INCLUDED_SCHEDULER #define INCLUDED_SCHEDULER #ifndef INCLUDED_BASE_H_ # include "base.h" #endif #ifndef INCLUDED_TASKLIST # include "TaskList.h" #endif #ifndef INCLUDED_LIST_DATA # include "ListData.h" #endif #ifndef INCLUDED_DMA_MANAGER # include "DmaManager.h" #endif #ifndef INCLUDED_SCHED_TASK_BASE # include "SchedTaskBase.h" #endif #ifndef INCLUDED_SCHED_TASK # include "SchedTask.h" #endif #ifndef INCLUDED_SCHED_TASKLIST # include "SchedTaskList.h" #endif #ifndef INCLUDED_TASK_GROUP # include "TaskGroup.h" #endif #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 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 mail_write(uint32 data); uint32 mail_read(void); void dma_loadList(ListDataPtr list, void *, uint32 mask); void dma_storeList(ListDataPtr list, void *, uint32 mask); }; #endif extern void register_task(int cmd, Scheduler::TaskObject task); #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);