# HG changeset patch # User Shinji KONO # Date 1260668947 -32400 # Node ID b5c3ef3368780db734b8255501ddff97aa2179cb # Parent cbcf0182635e59ec027620d5ee0a208d02e480cd on going... diff -r cbcf0182635e -r b5c3ef336878 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Sat Dec 12 17:38:30 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Sun Dec 13 10:49:07 2009 +0900 @@ -13,7 +13,7 @@ public: // variables BASE_NEW_DELETE(Task); - int param_size; // 4 byte + int param_count; // 4 byte memaddr param[MAX_PARAMS]; // 4*MAX_PARAMS byte ListData inData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); ListData outData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); @@ -42,15 +42,15 @@ public: // variables int task_size; int command; - int param_size; - int inData_size; - int outData_size; + int param_count; + int inData_count; + int outData_count; int inData_offset; int outData_offset; void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); - // memaddr param[param_size]; - // ListEelemnt inData[inData_size]; - // ListElement outData[outData_size]; + // memaddr param[param_count]; + // ListEelemnt inData[inData_count]; + // ListElement outData[outData_count]; public: // functions // int add_inData_t(memaddr addr, int size); @@ -58,6 +58,7 @@ void print(); +/* memaddr param(int index) { return (memaddr)data + sizeof(memaddr)*index; } @@ -69,35 +70,38 @@ memaddr p = (memaddr)data + outData_offset; return p + sizeof(ListElement)* index; } + */ ListElement *inListData() { memaddr data = (memaddr)this; - return (ListElement*)(data+inData_offset); + ListEelement *list = (ListElement *)(data+inData_offset); + return list; } ListElement *outListData() { memaddr data = (memaddr)this; - return (ListElement*)(data+outData_offset); + ListEelement *list = (ListElement *)(data+outData_offset); + return list; } void set_param_length(int i) { - param_size = i; - inData_offset = round_up16(sizeof(Task))+param_size*sizeof(memaddr); + param_count = i; + inData_offset = round_up16(sizeof(Task))+param_count*sizeof(memaddr); } void set_inData_length(int length) { - inData_size = length; + inData_count = length; if (inData_offset==0) { printf("call set_param_length before\n"); } outData_offset = - round_up16(inData_offset+inData_size*sizeof(ListElement)); + round_up16(inData_offset+inData_count*sizeof(ListElement)); } void set_outData_length(int length) { - outData_size = length; + outData_count = length; if (outData_offset==0) { printf("call set_outData_length before\n"); } - task_size = round_up16(outData_offset+outData_size*sizeof(ListElement)); + task_size = round_up16(outData_offset+outData_count*sizeof(ListElement)); } int size() { if (task_size==0) { @@ -105,6 +109,9 @@ } return task_size; } + int inData_total_size() ; + int outData_total_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; } @@ -113,7 +120,7 @@ *p = param; } - static int count_size(int params, int ins, int outs) { + static int calc_size(int params, int ins, int outs) { int size = round_up16(sizeof(Task)) + round_up16(sizeof(memaddr)*params) + round_up16(sizeof(ListElement)*ins) diff -r cbcf0182635e -r b5c3ef336878 TaskManager/kernel/schedule/ListData.h --- a/TaskManager/kernel/schedule/ListData.h Sat Dec 12 17:38:30 2009 +0900 +++ b/TaskManager/kernel/schedule/ListData.h Sun Dec 13 10:49:07 2009 +0900 @@ -27,9 +27,14 @@ int length; // The number of data (4) int size; // Total size of data (4) +#ifdef SIMPLE_TASK + int *bound; + ListElement *element; +#else int a[2]; // for alignment int bound[MAX_LIST_DMA_SIZE]; // (4 * MAX_LIST_DMA_SIZE) ListElement element[MAX_LIST_DMA_SIZE]; // (8 * MAX_LIST_DMA_SIZE) +#endif void clear(void) { length = 0; diff -r cbcf0182635e -r b5c3ef336878 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Sat Dec 12 17:38:30 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Sun Dec 13 10:49:07 2009 +0900 @@ -31,12 +31,12 @@ #ifndef SIMPLE_TASK TaskPtr task; memaddr *param; +#else + SimpleTaskPtr task; +#endif // read/write 用の ListData ListDataPtr inListData; ListDataPtr outListData; -#else - SimpleTaskPtr task; -#endif /** * read データ、write 用のバッファ @@ -80,7 +80,7 @@ int read_size() { return task->r_size; } int write_size() { return task->w_size; } void set_write_size(int w) { task->w_size = w; } -#else +#endif void* get_input(void *buff, int index); void* get_output(void *buff, int index); memaddr get_inputAddr(int index); @@ -89,7 +89,6 @@ int get_inputSize(int index); int get_outputSize(int index); memaddr get_param(int index); -#endif int get_cpuid(); diff -r cbcf0182635e -r b5c3ef336878 TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Sat Dec 12 17:38:30 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Sun Dec 13 10:49:07 2009 +0900 @@ -15,6 +15,26 @@ */ SchedTaskArray::~SchedTaskArray() { + inListData.bound = 0; + inListData.size = 0; + inListData.length = 0; + inListData.element = 0; + outListData.bound = 0; + outListData.size = 0; + outListData.length = 0; + outListData.element = 0; +} + +static void +bound(ListData *list, void *data) +{ + ListEelement elm = list->element; + void *bound = list->bound; + for(int i=0;ilength;i++) { + // we assume all data is properly aligned + bound[i] = data; + data = (void*)(((char*)data)+elm[i].size); + } } void @@ -27,11 +47,17 @@ loadSchedTask(scheduler, task); // 読むデータが一つもなければ無視 - if (task->inData_size == 0) return; + if (task->inData_count == 0) return; + + inListData.length = task->inData_count; + inListData.size = task->inData_total_size(); + inListData.element = task->inData(); + inListData.bound = scheduler->allocate(inListData.count*sizeof(void*)); // load Input Data - readbuf = scheduler->allocate(task->inListData()->size); - scheduler->dma_loadList(task->inListData(), readbuf, DMA_READ); + readbuf = scheduler->allocate(inListData.size); + scheduler->dma_loadList(&inListData, readbuf, DMA_READ); + bound(&inListData, readbuf); } @@ -46,9 +72,14 @@ 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); + if (task->outData_count > 0) { + outListData.length = task->outData_count; + outListData.size = task->outData_total_size(); + outListData.element = task->outData(); + + writebuf = scheduler->allocate(outListData.size); + scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); + bound(&outListData, writebuf); } }