changeset 704:6d497c098455

Compatibility mode works.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2009 19:54:00 +0900
parents 61b59376aec5
children 55159a5bf2c4
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskList.cc
diffstat 7 files changed, 58 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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
+
     }
 }
 
--- 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;
 	}
--- 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();
--- 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;
--- 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;
--- 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);
--- 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 <string.h>
 #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;