diff TaskManager/kernel/schedule/SchedTask.cc @ 42:aa11038dbdc1

*** empty log message ***
author gongo
date Thu, 14 Feb 2008 18:27:37 +0900
parents
children 70a0ac46133e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,101 @@
+#include "SchedTask.h"
+#include "SchedTaskList.h"
+#include "SchedNop2Ready.h"
+#include "DmaManager.h"
+#include "error.h"
+#include "TaskManager.h"
+#include "SymTable.h"
+
+SymTable *TaskManager::symtb;
+
+SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf,
+		 DmaManager* cn)
+{
+    list = _list;
+    task = _task;
+    readbuf = rbuf;
+    writebuf = wbuf;
+    connector = cn;
+}
+
+void
+SchedTask::read(void)
+{    
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    //task = &list->tasks[--list->length];
+    connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ);
+}
+
+void
+SchedTask::exec(void)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    connector->dma_wait(DMA_READ);
+
+    __debug("  task->command  = %d\n", task->command);
+    __debug("  task->in_size  = %d\n", task->in_size);
+    __debug("  task->in_addr  = 0x%x\n", task->in_addr);
+    __debug("  task->out_addr = 0x%x\n", task->out_addr);
+    __debug("  list->next     = 0x%x\n", (unsigned int)list->next);
+    __debug("  list->length   = 0x%x\n", (unsigned int)list->length);
+
+    // obsolute
+    //   task->in_size = func_list[task->command](writebuf, readbuf);
+
+    // ごちゃごちゃしてるな
+    // 最初から void* じゃなくて 関数ポインタ としていれるべきか?
+    int (*func)(void*, void*)
+	= (int (*)(void*,void*))TaskManager::get_address(task->command);
+    task->in_size = func(writebuf, readbuf);
+    connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE);
+}
+
+void
+SchedTask::write(void)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    connector->dma_wait(DMA_WRITE);
+    connector->mail_write((unsigned int)task->self);
+}
+
+SchedTaskBase*
+SchedTask::next(Scheduler *m, SchedTaskBase *p)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    delete p;
+ 
+    // ここ直さねば。どうやって if 文消そう?
+    // オブジェクト増やせばいいのかな
+    if (list->length == 0) {
+	if (list->next == 0) {
+	    return new SchedNop2Ready(connector);
+	} else {
+	    return new SchedTaskList((unsigned int)list->next,
+				   m->get_curListBuf(), connector);
+	}
+    } else {
+	//return new SchedTask(list, m->get_curReadBuf(),
+	//m->get_curWriteBuf(), connector);
+
+	// 本当は、ここで task->command に対応する、
+	// SchedTask を継承する class を作ればいい。。。はず
+	return new SchedTask(list, &list->tasks[--list->length],
+			     m->get_curReadBuf(), m->get_curWriteBuf(),
+			     connector);
+    }
+}
+
+#if 0
+SchedTask
+createSchedTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn)
+{
+    TaskPtr task;
+
+    task = &list->tasks[--list->length];
+    
+}
+#endif