Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/schedule/Scheduler.cc @ 109:5c194c71eca8
Cerium cvs version
author | gongo@gendarme.local |
---|---|
date | Wed, 12 Nov 2008 17:39:33 +0900 |
parents | 7927e00fb8e2 |
children | 907bda4a1a14 |
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/Scheduler.cc Wed Nov 12 17:29:35 2008 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Wed Nov 12 17:39:33 2008 +0900 @@ -4,20 +4,49 @@ #include "SchedNop.h" #include "error.h" +Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; + +Scheduler::~Scheduler(void) +{ + delete connector; +} + void Scheduler::init(void) { init_impl(); + + for (int i = 0; i < 2; i++) { + buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); + buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); + buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); + } - listBufFlg = 0; - readBufFlg = 0; - writeBufFlg = 0; + buffFlag_taskList = 0; + buffFlag_inListData = 0; + buffFlag_outListData = 0; + flag_renewTaskList = 0; + + // bzero でもいいけど + for (int i = 0; i < MAX_GLOBAL_AREA; i++) { + globalList[i] = NULL; + } + + for (int i = 0; i < MAX_MAINMEM_AREA; i++) { + mainMemList[i] = NULL; + } + + + taskGroup = new TaskGroup; + renewTop_taskList = NULL; + renewCur_taskList = NULL; } void Scheduler::run(void) { SchedTaskBase* taskTmp; + task1 = new SchedNop(); task2 = new SchedNop(); task3 = new SchedNop(); @@ -43,33 +72,186 @@ void Scheduler::finish(void) { - free(listBuf[0]); - free(listBuf[1]); - free(readBuf[0]); - free(readBuf[1]); - free(writeBuf[0]); - free(writeBuf[1]); + free(buff_taskList[0]); + free(buff_taskList[1]); + free(buff_inListData[0]); + free(buff_inListData[1]); + free(buff_outListData[0]); + free(buff_outListData[1]); } +/** + * あらかじめ memory allocte してある TaskList の領域を + * パイプラインの各処理が交代して使う。 + */ TaskListPtr Scheduler::get_curListBuf(void) { - listBufFlg ^= 1; - return listBuf[listBufFlg]; + buffFlag_taskList ^= 1; + curIndex_taskList = 0; + + return buff_taskList[buffFlag_taskList]; +} + + +/** + * あらかじめ memory allocte してある ListData の領域を + * パイプラインの各処理が交代して使う。 + */ +ListDataPtr +Scheduler::get_curWriteBuf(void) +{ + buffFlag_outListData ^= 1; + return buff_outListData[buffFlag_outListData]; +} + + +ListDataPtr +Scheduler::get_curReadBuf(void) +{ + buffFlag_inListData ^= 1; + return buff_inListData[buffFlag_inListData]; +} + +/** + * タスク内で生成されたタスクを格納する TaskList を取得する + * 現在格納に使っている TaskList (renewCur_taskList) が使えるならそれを返す + * もしそうでないなら、新しく TaskList を allocate してそれを返す + * コード中で renewCur_taskList が NULL になるのは + * - プログラム開始時 + * - タスク内生成タスクがある TaskList の実行を新しく始める (Nop2Ready 参照) + * 以上の場合です + */ +TaskListPtr +Scheduler::get_renewListBuf(void) +{ + if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { + return renewCur_taskList; + } else { + TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); + newList->length = 0; + newList->next = NULL; + renewTop_taskList = TaskList::append(renewTop_taskList, newList); + renewCur_taskList = newList; + return newList; + } +} + +void +Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) +{ + connector->dma_load(buf, addr, size, mask); +} + +void +Scheduler::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask) +{ + connector->dma_store(buf, addr, size, mask); +} + +void +Scheduler::dma_wait(uint32 mask) +{ + connector->dma_wait(mask); +} + +void +Scheduler::dma_loadList(ListDataPtr list, void *buff, uint32 mask) +{ + connector->dma_loadList(list, buff, mask); } -void * -Scheduler::get_curWriteBuf(void) +void +Scheduler::dma_storeList(ListDataPtr list, void *buff, uint32 mask) +{ + return connector->dma_storeList(list, buff, mask); +} + +void +Scheduler::mail_write(uint32 data) +{ + connector->mail_write(data); +} + +uint32 +Scheduler::mail_read(void) +{ + return connector->mail_read(); +} + +TaskGroupPtr +Scheduler::set_groupTask(uint32 command) +{ + TaskGroupPtr ret = taskGroup; + + reload_groupTask(); + + ret->command = command; + return ret; +} + +void +Scheduler::add_groupTask(TaskGroupPtr group, TaskPtr task) +{ + group->add(task); +} + +void +Scheduler::remove_groupTask(TaskGroupPtr group, TaskPtr task) { - writeBufFlg ^= 1; - return writeBuf[writeBufFlg]; + group->remove(task); +} + +void +Scheduler::reload_groupTask(void) +{ + taskGroup = new TaskGroup; +} + +uint32 +Scheduler::status_groupTask(TaskGroupPtr group) +{ + return group->status(); +} + +void* +Scheduler::global_alloc(int id, int size) +{ + globalList[id] = allocate(size); + return globalList[id]; +} + +void* +Scheduler::global_get(int id) +{ + return globalList[id]; +} + +void +Scheduler::global_free(int id) +{ + free(globalList[id]); + globalList[id] = NULL; +} + +/** + * mainMem_alloc で確保したメインメモリの領域アドレスを返す。 + * これは Fifo, Cell で共通 + */ +void* +Scheduler::mainMem_get(int id) +{ + return mainMemList[id]; } -void* -Scheduler::get_curReadBuf(void) +/** + * 本当は Scheduler クラスに入れるべきなんだろうか。。。 + * なんか手抜きの感がある + */ +void +register_task(int cmd, Scheduler::TaskObject task) { - readBufFlg ^= 1; - return readBuf[readBufFlg]; + task_list[cmd] = task; }