changeset 717:4c12f679a0fa

TaskList load timing...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Dec 2009 12:17:31 +0900
parents 974672c4ea2a
children 31eb1f56d986
files TaskManager/ChangeLog TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskList.cc TaskManager/kernel/schedule/SchedTaskList.h
diffstat 4 files changed, 51 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/ChangeLog	Wed Dec 16 18:04:26 2009 +0900
+++ b/TaskManager/ChangeLog	Fri Dec 18 12:17:31 2009 +0900
@@ -1,3 +1,37 @@
+2009-12-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+   CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が
+   queue なんだから、トップ二つを特別扱いしているだけでしょう。
+
+   TaskList をread()しているのと同時にnext()されてしまうので、
+   next()の中で、TaskList の中身に触るのは良くない。SchedTask
+   は微妙に大丈夫らしい。TLのdma waitは、write になっていた。
+
+   TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、
+   これはただしくない。TaskListLoad を間にはさむ手もあるが...
+
+     write   T3   T2  T1   TL  TA0   ! TL の dma wait
+     exec    T2   T1  TL!  TA0 TA1
+     read    T1   TL* TA   TA1 TA2   * TL の dma start
+     next    T1   TL% TA   TA1 TA2   % TAの作成判断
+
+  TaskListLoad をはさむ、安全だけど遅い方法
+
+     write   T3   T2  T1   TLL TL
+     exec    T2   T1  TLL! TL  TA0
+     read    T1   TLL*TL   TA0 TA1
+     next    T1   TLL TL%  TA0 TA1
+
+   なんだけど、pointer の下位ビットで送ると、前者で実行できる。
+   next で、TaskList のloadを始めてしまうという手もあるな...
+
+     write   T3   T2  T1   TL  TA0   ! TL の dma wait
+     exec    T2   T1  TL   TA0 TA1
+     read    T1   TL! TA   TA1 TA2   * TL の dma start
+     next    T1*  TL% TA   TA1 TA2   
+
+   こっっちかな...
+
 2009-12-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
    SimpleTask の実装が出来たので、TaskArray からは、
--- a/TaskManager/kernel/schedule/SchedTask.cc	Wed Dec 16 18:04:26 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Fri Dec 18 12:17:31 2009 +0900
@@ -116,6 +116,9 @@
 	TaskPtr nextTask = &list->tasks[cur_index++];
         SchedTask *nextSched = new SchedTask();
 	nextSched->init(list, nextTask, cur_index, scheduler);
+	// この時点で、TaskList は down load が済んでないことがある
+        // 最初のTaskの種類に関しては、別な情報で渡す方が良い
+	// あるいはTaskListの最初には、TaskArray1/TaskArray を置かない?
 
 	if (nextTask->command==TaskArray1) {
 	    // compatibility
--- a/TaskManager/kernel/schedule/SchedTaskList.cc	Wed Dec 16 18:04:26 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Fri Dec 18 12:17:31 2009 +0900
@@ -21,37 +21,40 @@
 
 SchedTaskList::SchedTaskList(memaddr addr, Scheduler *sched)
 {
+    // next() で生成された時に、Task List read を始める
     params_addr = addr;
-    list = NULL;
     scheduler = sched;
     cur_index = 0;
-
+    list = scheduler->get_curListBuf();
+    scheduler->dma_load(list, params_addr,
+                        sizeof(TaskList), DMA_READ_TASKLIST);
 }
 
 
 void
 SchedTaskList::read()
 {
+    // next() で TaskListの中身を見られてしまうので、
+    // ここで DMA 待ちを行う
     __debug("[SchedTaskList:%s]\n", __FUNCTION__);
-
-    list = scheduler->get_curListBuf();
-    scheduler->dma_load(list, params_addr,
-			sizeof(TaskList), DMA_READ_TASKLIST);
+    scheduler->dma_wait(DMA_READ_TASKLIST);
 }
 
 void
-SchedTaskList::exec() {}
+SchedTaskList::exec() {
+}
 
 void
 SchedTaskList::write()
 {
-    __debug("[SchedTaskList:%s]\n", __FUNCTION__);
-
-    scheduler->dma_wait(DMA_READ_TASKLIST);
 }
 
 /**
  *    next は、SchedTask のものが使われる。
+ *    それで正しく動くはず。
+ *
+ *    next() が呼ばれた時点で、TaskList のloadが終了しているように工夫する。
+ *
  */
 
 /* end */
--- a/TaskManager/kernel/schedule/SchedTaskList.h	Wed Dec 16 18:04:26 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.h	Fri Dec 18 12:17:31 2009 +0900
@@ -4,6 +4,7 @@
 #include "base.h"
 #include "Scheduler.h"
 #include "SchedTask.h"
+#include "TaskList.h"
 
 #include "error.h"