Mercurial > hg > Members > kono > Cerium
view TaskManager/kernel/schedule/SchedTask.h @ 518:125a72948e44
....
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 16 Oct 2009 17:57:17 +0900 |
parents | 1d4a8a86f26b |
children | 5c76db2a07fa |
line wrap: on
line source
#ifndef INCLUDED_SCHED_TASK #define INCLUDED_SCHED_TASK #include <stdio.h> #include <stdlib.h> #include "base.h" #include "Scheduler.h" #include "SchedTaskBase.h" #include "ListData.h" #include "TaskGroup.h" #include "MemList.h" #include "HTask.h" class SchedTask : public SchedTaskBase { public: /* constructor */ SchedTask(); virtual ~SchedTask(); BASE_NEW_DELETE(SchedTask); private: /* variables */ // Task を実行するスケジューラ自身 Scheduler *scheduler; // 現在スケジューラが実行している TaskList と、このタスクに対応する Task TaskListPtr list; TaskPtr task; // read/write 用の ListData ListDataPtr inListData; ListDataPtr outListData; /** * read データ、write 用のバッファ * readbuf には タスク登録時に設定した入力データが入っている。 * writebuf にデータを描き込んでおくと、 * タスク登録時に設定した出力先に書き込む */ void *readbuf; void *writebuf; // Task の、Tasklist での位置。(task = &list[cur_index-1]) int cur_index; // タスク内で生成されたタスクのグループ TaskGroup *taskGroup; // このタスク内で生成されたタスクの数 int renew_flag; // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No int flag_renewTask; // タスクがメインメモリ側で生成されたものか、 // SPE で生成されたものかによって、データの扱いが変わってくる。 // そのために if (flag_renewTask) を連発するのはよくないので // 関数ポインタで持っておく void (SchedTask::*ex_init)(); void (SchedTask::*ex_read)(); void (SchedTask::*ex_exec)(); void (SchedTask::*ex_write)(); SchedTaskBase* (SchedTask::*ex_next)(); /* functions */ // override void read(); void exec(); void write(); SchedTaskBase* next(Scheduler *, SchedTaskBase *); // タスクの処理は、task_list に登録された C の関数によっておこなう //--- System API --- SchedTask* get_nextTask(TaskListPtr list); /** * PPE で生成されたタスクに対する * init, read,exec,write,next の付属(?)処理 */ void ex_init_normal(); void ex_read_normal(); void ex_exec_normal(); void ex_write_normal(); SchedTaskBase* ex_next_normal(); /** * SPE で生成されたタスクに対する * inti, ead,exec,write,next の付属(?)処理 */ void ex_init_renew(); void ex_read_renew(); void ex_exec_renew(); void ex_write_renew(); SchedTaskBase* ex_next_renew(); public: /* functions */ void setRenew(); void init(TaskListPtr _list, TaskPtr _task, int index, // ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc); //--- User API --- int get_cpuid(); void* get_input(void *buff, int index); void* get_output(void *buff, int index); uint32 get_inputAddr(int index); uint32 get_outputAddr(int index); // 書き出しを追加する API がない... int get_inputSize(int index); int get_outputSize(int index); int get_param(int index); void set_post(PostFunction func,void *read, void *write); TaskPtr create_task(int cmd); void wait_task(TaskPtr waitTask); void* global_alloc(int id, int size); void* global_get(int id); void global_set(int id, void *addr); void global_free(int id); MemList* createMemList(int size, int count); void mainMem_alloc(int id, int size); void mainMem_wait(); void* mainMem_get(int id); MemorySegment * get_segment(memaddr addr, MemList *m); uint32 get_tag(); void put_segment(MemorySegment *s); void wait_segment(MemorySegment *s); void *allocate(int size); void free_(void *p) { scheduler->free_(p); } /* これは禁止するべき */ 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(); /*! SPU用の get_input, get_output */ void* get_input(int index) { return get_input(readbuf, index); } void* get_output(int index) { return get_output(writebuf, index); } /* system call */ FILE *stdout_; FILE *stderr_; FILE *stdin_; int fprintf(FILE * stream, const char * format, ...); int printf(const char * format, ...); }; const int SCHED_TASK_NORMAL = 0; const int SCHED_TASK_RENEW = 1; extern SchedTask* createSchedTask(Scheduler *,TaskPtr); extern void loadSchedTask(Scheduler *scheduler,TaskPtr task); #endif