Mercurial > hg > Members > kono > Cerium
view 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 source
#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 */