# HG changeset patch # User Shinji KONO # Date 1260697509 -32400 # Node ID 257ad1a518e33b0926cf7679e509b6fb564632de # Parent b5c3ef3368780db734b8255501ddff97aa2179cb TaskArray on going... diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Sun Dec 13 18:45:09 2009 +0900 @@ -56,9 +56,9 @@ { Task *task = (Task*)((memaddr)rbuf + pos); task->set_task_id(task_id); - task-> param_size = 0; - task-> inData_size = 0; - task-> outData_size = 0; + task-> param_count = 0; + task-> inData_count = 0; + task-> outData_count = 0; task-> inData_offset = 0; task-> outData_offset = 0; diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Sun Dec 13 18:45:09 2009 +0900 @@ -114,9 +114,9 @@ { printf("task id %d task size = %d param size %d " "inData size %d " - "outData size %d\n", command, size(), param_size, inData_size, outData_size + "outData size %d\n", command, size(), param_count, inData_count, outData_count ); - for(int i=0; i< param_size && i<5; i++) { + for(int i=0; i< param_count && i<5; i++) { printf("param %d = 0x%ld\n", i, (long)param(i)); } diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Sun Dec 13 18:45:09 2009 +0900 @@ -58,7 +58,6 @@ void print(); -/* memaddr param(int index) { return (memaddr)data + sizeof(memaddr)*index; } @@ -70,17 +69,16 @@ memaddr p = (memaddr)data + outData_offset; return p + sizeof(ListElement)* index; } - */ ListElement *inListData() { memaddr data = (memaddr)this; - ListEelement *list = (ListElement *)(data+inData_offset); + ListElement *list = (ListElement *)(data+inData_offset); return list; } ListElement *outListData() { memaddr data = (memaddr)this; - ListEelement *list = (ListElement *)(data+outData_offset); + ListElement *list = (ListElement *)(data+outData_offset); return list; } diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Sun Dec 13 18:45:09 2009 +0900 @@ -22,22 +22,24 @@ // Task を実行するスケジューラ自身 Scheduler *scheduler; +#ifndef SIMPLE_TASK + TaskPtr task; + memaddr *param; + // read/write 用の ListData + ListDataPtr inListData; + ListDataPtr outListData; +#else + SimpleTaskPtr task; + ListData inListData; + ListData outListData; +#endif + private: /* variables */ // 現在スケジューラが実行している TaskList と、このタスクに対応する Task TaskListPtr list; -#ifndef SIMPLE_TASK - TaskPtr task; - memaddr *param; -#else - SimpleTaskPtr task; -#endif - // read/write 用の ListData - ListDataPtr inListData; - ListDataPtr outListData; - /** * read データ、write 用のバッファ * readbuf には タスク登録時に設定した入力データが入っている。 diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Sun Dec 13 18:45:09 2009 +0900 @@ -8,13 +8,7 @@ savedTask = savedTask_; task = curTask_; array = _array; -} -/** - * dma_store の wait を行う - */ -SchedTaskArray::~SchedTaskArray() -{ inListData.bound = 0; inListData.size = 0; inListData.length = 0; @@ -25,15 +19,21 @@ outListData.element = 0; } -static void -bound(ListData *list, void *data) +/** + */ +SchedTaskArray::~SchedTaskArray() { - ListEelement elm = list->element; - void *bound = list->bound; +} + +static void +bound(ListData *list) +{ + ListElement *elm = list->element; + int *bound = list->bound; + int offset=0; for(int i=0;ilength;i++) { - // we assume all data is properly aligned - bound[i] = data; - data = (void*)(((char*)data)+elm[i].size); + bound[i] = offset; + offset += elm[i].size; } } @@ -51,13 +51,13 @@ inListData.length = task->inData_count; inListData.size = task->inData_total_size(); - inListData.element = task->inData(); - inListData.bound = scheduler->allocate(inListData.count*sizeof(void*)); + inListData.element = task->inListData(); + inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int)); // load Input Data readbuf = scheduler->allocate(inListData.size); scheduler->dma_loadList(&inListData, readbuf, DMA_READ); - bound(&inListData, readbuf); + bound(&inListData); } @@ -72,14 +72,18 @@ task_list[task->command].run(this, readbuf, writebuf); free(readbuf); // 書き込む領域がなければ無視 + + // User 側で作る方法が必要... + if (task->outData_count > 0) { outListData.length = task->outData_count; outListData.size = task->outData_total_size(); - outListData.element = task->outData(); + outListData.element = task->outListData(); + outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int)); writebuf = scheduler->allocate(outListData.size); scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); - bound(&outListData, writebuf); + bound(&outListData); } } @@ -93,7 +97,8 @@ // このTaskArrayは終り。終了を知らせる。 if (task->next() >= last()) { - scheduler->mail_write((memaddr)savedTask->task->self); + SchedTask *s = (SchedTask *)savedTask; + scheduler->mail_write((memaddr)s->task->self); free(array); } @@ -101,22 +106,23 @@ Task *SchedTaskArray::last() { - return (Task*)(((char*)array)+ savedTask->read_size()); + SchedTask *s = (SchedTask *)savedTask; + return (Task*)(((char*)array)+ s->read_size()); } SchedTaskBase* -SchedTaskArray::next(Scheduler *scheduler, SchedTaskArrayBase *p) +SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p) { __debug("[SchedTaskArray:%s]\n", __FUNCTION__); - - if (task->next() < last()) { + Task *next = task->next(); + if (next < last()) { // Task List が残っているので、次を準備 return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array); } else { // このTaskArrayは終り。save していた Task の次を返す。 // savedTask の read/exec は実行されない (command = TaskArray) - return savedTask->next(); + return savedTask->next(scheduler, savedTask); } } diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/schedule/SchedTaskArrayLoad.cc --- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc Sun Dec 13 18:45:09 2009 +0900 @@ -4,15 +4,15 @@ SchedTaskArrayLoad::SchedTaskArrayLoad(SchedTaskBase *savedTask_) { - savedTask = saveTask_; + savedTask = savedTask_; } -~SchedTaskArrayLoad::SchedTaskArrayLoad() {} +SchedTaskArrayLoad::~SchedTaskArrayLoad() {} void SchedTaskArrayLoad::read() { - if (task->r_size == 0) return; + // if (task->r_size == 0) return; cannot happen... // load Task Array Data readbuf = scheduler->allocate(task->r_size); scheduler->dma_load(readbuf, task->rbuf,task->r_size, DMA_READ); @@ -25,7 +25,7 @@ SchedTaskArrayLoad::write() {} // to empty the pipeline SchedTaskBase* -SchedNop::next(Scheduler *scheduler, SchedTaskBase *p) +SchedTaskArrayLoad::next(Scheduler *scheduler, SchedTaskBase *p) { Task *nextTask = (Task *)readbuf; return new SchedTaskArray(savedTask, nextTask, nextTask); diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/schedule/SchedTaskArrayLoad.h --- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.h Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.h Sun Dec 13 18:45:09 2009 +0900 @@ -18,7 +18,8 @@ private: /* variables */ - TaskPtr task; + void *readbuf; + /* functions */ // override diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/schedule/Scheduler.h --- a/TaskManager/kernel/schedule/Scheduler.h Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Sun Dec 13 18:45:09 2009 +0900 @@ -75,7 +75,8 @@ /* functions */ void init(TaskManagerImpl *m); - void run(); + void run(SchedTaskBase* task1); + virtual void init_impl() {}; void finish(); diff -r b5c3ef336878 -r 257ad1a518e3 TaskManager/kernel/sys_task/TaskArray.cc --- a/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 13 10:49:07 2009 +0900 +++ b/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 13 18:45:09 2009 +0900 @@ -24,10 +24,6 @@ } #else - Task *task = (Task *)rbuf; - SchedTaskArray *nextSched = createSchedTaskArray(s->get_scheduler(), task); - s->get_scheduler()->run(nextSched); - #endif #endif return 0;