changeset 697:257ad1a518e3

TaskArray on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 13 Dec 2009 18:45:09 +0900
parents b5c3ef336878
children dcaa40ec963d
files TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskArrayLoad.cc TaskManager/kernel/schedule/SchedTaskArrayLoad.h TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/TaskArray.cc
diffstat 9 files changed, 57 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- 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;
 
--- 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));
     }
 
--- 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; 
     }
 
--- 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 には タスク登録時に設定した入力データが入っている。
--- 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;i<list->length;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);
     }
 }
 
--- 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);
--- 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
--- 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();
 
--- 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;