# HG changeset patch # User Shinji KONO # Date 1260788040 -32400 # Node ID 6d497c098455cfd5fcecedcc8db5a5922cf77a29 # Parent 61b59376aec5d180a7f0c8626256327507b444f9 Compatibility mode works. diff -r 61b59376aec5 -r 6d497c098455 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Mon Dec 14 19:54:00 2009 +0900 @@ -90,10 +90,12 @@ void CellTaskManagerImpl::set_runTaskList() { - // ここ...直すかな TaskListPtr list; - +#ifdef SIMPLE_TASK + SimpleTaskPtr task; +#else TaskPtr task; +#endif int speid; while (HTaskPtr htask = activeTaskQueue->poll()) { @@ -128,8 +130,33 @@ } task = &list->tasks[list->length++]; +#ifdef SIMPLE_TASK + if (htask->command==TaskArray1) { + // compatibility + // Task with ListData is stored in the ListData + int next = (htask->r_size+sizeof(SimpleTask))/sizeof(SimpleTask); + if (list->length+next>=TASK_MAX_SIZE) { + list->length--; + TaskListPtr newList = taskListImpl->create(); + newList = TaskListInfo::append(newList, speTaskList_bg[speid]); + speTaskList_bg[speid] = newList; + list = newList; + task = &list->tasks[list->length++]; + } + Task *array = (Task*)&list->tasks[list->length]; + list->length += next; + memcpy(array, htask->rbuf, htask->r_size); + free(htask->rbuf); + htask->rbuf = 0; htask->r_size = 0; + *task = *(SimpleTask*)htask; + } else { + *task = *(SimpleTask*)htask; + } +#else TaskPtr stask = (TaskPtr) task; *stask = *(TaskPtr) htask; +#endif + } } diff -r 61b59376aec5 -r 6d497c098455 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Dec 14 19:54:00 2009 +0900 @@ -107,9 +107,9 @@ while (HTaskPtr htask = activeTaskQueue->poll()) { task = &list->tasks[list->length++]; #ifdef SIMPLE_TASK - if (task->command==TaskArray1) { + if (htask->command==TaskArray1) { // compatibility - int next = (task->r_size+sizeof(SimpleTask))/sizeof(SimpleTask); + int next = (htask->r_size+sizeof(SimpleTask))/sizeof(SimpleTask); if (list->length+next>=TASK_MAX_SIZE) { list->length--; TaskListPtr newList = taskListImpl->create(); @@ -119,11 +119,10 @@ } Task *array = (Task*)&list->tasks[list->length]; list->length += next; + memcpy(array, htask->rbuf, htask->r_size); + free(htask->rbuf); + htask->rbuf = 0; htask->r_size = 0; *task = *(SimpleTask*)htask; - memcpy(array, task->rbuf, task->r_size); - free(task->rbuf); - task->rbuf = 0; task->r_size = 0; - htask->rbuf = 0; htask->r_size = 0; } else { *task = *(SimpleTask*)htask; } diff -r 61b59376aec5 -r 6d497c098455 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Mon Dec 14 19:54:00 2009 +0900 @@ -1,6 +1,7 @@ #include "HTask.h" #include "ListData.h" #include "TaskManagerImpl.h" +#include "strings.h" /*! @@ -56,6 +57,7 @@ { r_size = Task::calc_size(num_param, num_inData, num_outData)*num_task; rbuf = (memaddr) mimpl->allocate(r_size); + bzero(rbuf,r_size); Task *task = (Task*)rbuf; task->init(id, num_param,num_inData,num_outData); // task->print(); diff -r 61b59376aec5 -r 6d497c098455 TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Dec 14 19:54:00 2009 +0900 @@ -70,8 +70,9 @@ new_task->post_func = noaction; new_task->mimpl = this; Task *task = new_task->create_task_array(cmd,1,8,8,8); - new_task->r_size = task->size(); - new_task->rbuf = (memaddr)task; + new_task->command = TaskArray1; + // new_task->r_size = task->size(); + // new_task->rbuf = (memaddr)task; #else new_task = htaskImpl->create(cmd); new_task->post_func = noaction; diff -r 61b59376aec5 -r 6d497c098455 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Mon Dec 14 19:54:00 2009 +0900 @@ -95,10 +95,7 @@ // object creation をSchedTask生成時にやらないので、 // exec の直前のread で十分に間に合う - if (cur_index < list->length) { // if 文は要らないのでは? - // load next task - loadSchedTask(scheduler, list->tasks[cur_index].command); - } + loadSchedTask(scheduler, task->command); #ifdef SIMPLE_TASK // 読むデータが一つもなければ無視 if (task->r_size == 0) return; diff -r 61b59376aec5 -r 6d497c098455 TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Mon Dec 14 19:54:00 2009 +0900 @@ -40,8 +40,9 @@ outListData.length = 0; outListData.element = 0; - array = task = (TaskPtr)&sv->list->tasks[sv->cur_index]; - sv->cur_index += (task->size())/sizeof(SimpleTask); + task = (TaskPtr)&sv->list->tasks[sv->cur_index]; + array = 0; + sv->cur_index += (task->size()+sizeof(SimpleTask))/sizeof(SimpleTask); } @@ -129,7 +130,7 @@ free(outListData.bound); // このTaskArrayは終り。終了を知らせる。 - if (task->next() >= last()) { + if (!array || task->next() >= last()) { SchedTask *s = (SchedTask *)savedTask; scheduler->mail_write((memaddr)s->task->self); free(array); diff -r 61b59376aec5 -r 6d497c098455 TaskManager/kernel/schedule/SchedTaskList.cc --- a/TaskManager/kernel/schedule/SchedTaskList.cc Mon Dec 14 18:34:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Mon Dec 14 19:54:00 2009 +0900 @@ -2,6 +2,9 @@ #include #include "SchedTaskList.h" #include "SchedTask.h" +#include "SysFunc.h" +#include "SchedTaskArray.h" +#include "SchedTaskArrayLoad.h" #include "SchedNop2Ready.h" #include "DmaManager.h" #include "error.h" @@ -58,8 +61,17 @@ TaskPtr nextTask = &list->tasks[0]; #endif nextSched = createSchedTask(scheduler, nextTask); - ((SchedTask*)nextSched)->init(list, nextTask, 1, - scheduler); + ((SchedTask*)nextSched)->init(list, nextTask, 1, scheduler); +#ifdef SIMPLE_TASK + if (nextTask->command==TaskArray1) { + // compatibility + return new SchedTaskArray(scheduler, nextSched); + } + if (nextTask->command==TaskArray) { + // Start Task Array + return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched)); + } +#endif } return nextSched;