# HG changeset patch # User Shinji KONO # Date 1260108208 -32400 # Node ID 458a1ad91427d6ba9828c08dcc7825d525352bc8 # Parent 9a6cb2439593caeb9b1e2324d2775ef700260138 Task Array generation worked. diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Sun Dec 06 23:03:28 2009 +0900 @@ -52,13 +52,29 @@ #ifdef SIMPLE_TASK Task * -HTask::create_task(int task_id, int pos) +HTask::create_task_array(int task_id, int pos) { - Task *task = (Task*)((memaddr)this->rbuf + pos); + 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-> inData_offset = 0; + task-> outData_offset = 0; + return task; } +void +HTask::spawn_task_array(int pos) +{ + if (pos!= r_size) { + printf("spawn task array size differ pos 0x%x r_size 0x%x\n", + pos, r_size); + } +} + + #endif /* end */ diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/ppe/HTask.h --- a/TaskManager/kernel/ppe/HTask.h Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Sun Dec 06 23:03:28 2009 +0900 @@ -44,12 +44,13 @@ HTask *next; HTask *prev; - void spawn(void); + void spawn(); void wait_for(HTask *); void set_cpu(CPU_TYPE type); void set_post(PostFunction func, void *read, void *write); #ifdef SIMPLE_TASK - Task *create_task(int task_id, int pos); + Task *create_task_array(int task_id, int pos); + void spawn_task_array(int pos); #endif }; diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Sun Dec 06 23:03:28 2009 +0900 @@ -112,11 +112,11 @@ void Task::print() { - printf("task id %d param size %d " + printf("task id %d task size = %d param size %d " "inData size %d " - "outData size %d\n", command, param_size, inData_size, outData_size + "outData size %d\n", command, size(), param_size, inData_size, outData_size ); - for(int i=0; i< param_size; i++) { + for(int i=0; i< param_size && i<5; i++) { printf("param %d = 0x%ld\n", i, (long)param(i)); } diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Sun Dec 06 23:03:28 2009 +0900 @@ -40,11 +40,13 @@ class Task { public: // variables - + int task_size; int command; int param_size; int inData_size; int outData_size; + int inData_offset; + int outData_offset; void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // memaddr param[param_size]; // ListEelemnt inData[inData_size]; @@ -57,20 +59,42 @@ void print(); memaddr param(int index) { - memaddr p = (memaddr)data; - return p + sizeof(memaddr)*index; + return (memaddr)data + sizeof(memaddr)*index; } memaddr inData(int index) { - return param(param_size) + sizeof(ListElement)*index; + memaddr p = (memaddr)data + inData_offset; + return p + sizeof(ListElement)*index; } memaddr outData(int index) { - memaddr p = inData(inData_size); + memaddr p = (memaddr)data + outData_offset; return p + sizeof(ListElement)* index; } - void set_param_length(int i) { param_size = i; } - void set_inData_length(int length) { inData_size = length; } - void set_outData_length(int length) { outData_size = length; } + void set_param_length(int i) { + param_size = i; + inData_offset = round_up16(sizeof(Task))+param_size*sizeof(memaddr); + } + void set_inData_length(int length) { + inData_size = length; + if (inData_offset==0) { + printf("call set_param_length before\n"); + } + outData_offset = + round_up16(inData_offset+inData_size*sizeof(ListElement)); + } + void set_outData_length(int length) { + outData_size = length; + if (outData_offset==0) { + printf("call set_outData_length before\n"); + } + task_size = round_up16(outData_offset+outData_size*sizeof(ListElement)); + } + int size() { + if (task_size==0) { + printf("call set_outData_length before\n"); + } + return task_size; + } void set_inData_t( int index, memaddr addr, int size); void set_outData_t(int index, memaddr addr, int size); void set_task_id(int id) { command = id; } @@ -78,14 +102,12 @@ memaddr *p = (memaddr*)this->param(index); *p = param; } - int size() { - return outData(outData_size)-(memaddr)data; - } static int count_size(int params, int ins, int outs) { - int size = sizeof(memaddr)*params - + sizeof(ListElement)*ins - + sizeof(ListElement)*outs; + int size = round_up16(sizeof(Task)) + + round_up16(sizeof(memaddr)*params) + + round_up16(sizeof(ListElement)*ins) + + round_up16(sizeof(ListElement)*outs); return size; } diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/schedule/Scheduler.cc --- a/TaskManager/kernel/schedule/Scheduler.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Sun Dec 06 23:03:28 2009 +0900 @@ -25,6 +25,8 @@ return 0; } +static void null_loader(Scheduler *m, int task_id); + /*! @brief speTaskの入出力のパイプラインバッファを確保する */ @@ -34,7 +36,9 @@ hash = 0; for (int i = 0; i< MAX_TASK_OBJECT; i++) { - task_list[0].run = null_run; + task_list[i].run = null_run; + task_list[i].load = null_loader; + task_list[i].wait = null_loader; } set_manager(m); diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/sys_task/TaskArray.cc --- a/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 06 23:03:28 2009 +0900 @@ -22,8 +22,10 @@ #ifdef SIMPLE_TASK Task *task = (Task *)rbuf; Task *last = (Task*)(((char*)rbuf)+ s->read_size()); - + + s->printf("last = %lx\n" ,(long) last); while( task < last) { + s->printf(" task = %lx\n" ,(long) task); task->print(); task = next(task); } diff -r 9a6cb2439593 -r 458a1ad91427 TaskManager/kernel/sys_task/systask_register.cc --- a/TaskManager/kernel/sys_task/systask_register.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/TaskManager/kernel/sys_task/systask_register.cc Sun Dec 06 23:03:28 2009 +0900 @@ -3,10 +3,12 @@ SchedExternTask(StartTask); SchedExternTask(FinishTask); +SchedExternTask(TaskArray); void systask_register() { SchedRegister(StartTask); SchedRegister(FinishTask); + SchedRegister(TaskArray); } diff -r 9a6cb2439593 -r 458a1ad91427 example/Bulk/main.cc --- a/example/Bulk/main.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/example/Bulk/main.cc Sun Dec 06 23:03:28 2009 +0900 @@ -71,14 +71,16 @@ * Create Task * create_task(Task ID); */ - int size = Task::count_size(2,length,0) * count; + int size = Task::count_size(2,2,2); + printf("allocate task size 0x%0x\n",size); + printf("allocate task total size 0x%0x\n",(size *= count)); memaddr task_buf = (memaddr)manager->allocate(size); HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0); int pos = 0; for(int i = 0;icreate_task(Twice,pos); + Task *t = twice_main->create_task_array(Twice,pos); int length2 = length/2; // 以下の順序でデータを追加する必要がある。 // length を先に指定すればsetは後からでも良い。 @@ -104,9 +106,10 @@ t->set_outData(0,data, sizeof(int)*length2); t->set_outData(1,data+length2, sizeof(int)*length2); pos += t->size(); + printf("pos 0x%0x size 0x%0x\n",pos, t->size()); + } + twice_main->spawn_task_array(pos); - // delete t; // Wao! - } twice_main->set_cpu(SPE_ANY); /* * set_post() で ppe task を渡せるようにしたい diff -r 9a6cb2439593 -r 458a1ad91427 example/Bulk/ppe/Twice.cc --- a/example/Bulk/ppe/Twice.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/example/Bulk/ppe/Twice.cc Sun Dec 06 23:03:28 2009 +0900 @@ -9,6 +9,7 @@ static int run(SchedTask *s,void *rbuf, void *wbuf) { +#if 0 int *i_data; int *o_data; long length; @@ -20,6 +21,7 @@ for (int i = 0; i < length; i++) { o_data[i] = i_data[i] * 2; } +#endif return 0; } diff -r 9a6cb2439593 -r 458a1ad91427 example/Bulk/ppe/task_init.cc --- a/example/Bulk/ppe/task_init.cc Sun Dec 06 18:53:46 2009 +0900 +++ b/example/Bulk/ppe/task_init.cc Sun Dec 06 23:03:28 2009 +0900 @@ -13,5 +13,5 @@ void task_init(void) { - SchedRegisterTask(TWICE_TASK, Twice); + SchedRegister(Twice); }