# HG changeset patch # User Shinji KONO # Date 1261106251 -32400 # Node ID 4c12f679a0faf372171f063d2c9280025178c003 # Parent 974672c4ea2a77515b057a97a760eab3a9db13ee TaskList load timing... diff -r 974672c4ea2a -r 4c12f679a0fa TaskManager/ChangeLog --- 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 + + 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 SimpleTask の実装が出来たので、TaskArray からは、 diff -r 974672c4ea2a -r 4c12f679a0fa TaskManager/kernel/schedule/SchedTask.cc --- 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 diff -r 974672c4ea2a -r 4c12f679a0fa TaskManager/kernel/schedule/SchedTaskList.cc --- 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 */ diff -r 974672c4ea2a -r 4c12f679a0fa TaskManager/kernel/schedule/SchedTaskList.h --- 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"