changeset 696:b5c3ef336878

on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 13 Dec 2009 10:49:07 +0900
parents cbcf0182635e
children 257ad1a518e3
files TaskManager/kernel/ppe/Task.h TaskManager/kernel/schedule/ListData.h TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskArray.cc
diffstat 4 files changed, 69 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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;
--- 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();
 
--- 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;i<list->length;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);
     }
 }