Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/schedule/SchedTaskArray.cc @ 695:cbcf0182635e
TaskArray on going...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 12 Dec 2009 17:38:30 +0900 |
parents | |
children | b5c3ef336878 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Sat Dec 12 17:38:30 2009 +0900 @@ -0,0 +1,94 @@ +#include "SchedTaskArray.h" +#include "SchedTask.h" + +extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; + +SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array) +{ + savedTask = savedTask_; + task = curTask_; + array = _array; +} + +/** + * dma_store の wait を行う + */ +SchedTaskArray::~SchedTaskArray() +{ +} + +void +SchedTaskArray::read() +{ + __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); + + // object creation をSchedTaskArray生成時にやらないので、 + // exec の直前のread で十分に間に合う + loadSchedTask(scheduler, task); + + // 読むデータが一つもなければ無視 + if (task->inData_size == 0) return; + + // load Input Data + readbuf = scheduler->allocate(task->inListData()->size); + scheduler->dma_loadList(task->inListData(), readbuf, DMA_READ); + +} + + +void +SchedTaskArray::exec() +{ + __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); + + scheduler->dma_wait(DMA_READ); + task_list[task->command].wait(scheduler,task->command); + task_list[task->command].run(this, readbuf, writebuf); + free(readbuf); + // 書き込む領域がなければ無視 + if (task->outData_size > 0) { + writebuf = scheduler->allocate(task->outListData()->size); + scheduler->dma_storeList(task->outListData(), writebuf, DMA_WRITE); + } +} + +void +SchedTaskArray::write() +{ + __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); + + scheduler->dma_wait(DMA_WRITE); + free(writebuf); + + // このTaskArrayは終り。終了を知らせる。 + if (task->next() >= last()) { + scheduler->mail_write((memaddr)savedTask->task->self); + free(array); + } + +} + +Task *SchedTaskArray::last() +{ + return (Task*)(((char*)array)+ savedTask->read_size()); +} + +SchedTaskBase* +SchedTaskArray::next(Scheduler *scheduler, SchedTaskArrayBase *p) +{ + __debug("[SchedTaskArray:%s]\n", __FUNCTION__); + + + if (task->next() < last()) { + // Task List が残っているので、次を準備 + return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array); + } else { + // このTaskArrayは終り。save していた Task の次を返す。 + // savedTask の read/exec は実行されない (command = TaskArray) + return savedTask->next(); + } +} + + + +/* end */