diff TaskManager/kernel/schedule/Scheduler.cc @ 109:5c194c71eca8

Cerium cvs version
author gongo@gendarme.local
date Wed, 12 Nov 2008 17:39:33 +0900
parents 7927e00fb8e2
children 907bda4a1a14
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/Scheduler.cc	Wed Nov 12 17:29:35 2008 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Wed Nov 12 17:39:33 2008 +0900
@@ -4,20 +4,49 @@
 #include "SchedNop.h"
 #include "error.h"
 
+Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
+
+Scheduler::~Scheduler(void)
+{
+    delete connector;
+}
+
 void
 Scheduler::init(void)
 {
     init_impl();
+
+    for (int i = 0; i < 2; i++) {
+	buff_taskList[i]    = (TaskListPtr)allocate(sizeof(TaskList));
+	buff_inListData[i]  = (ListDataPtr)allocate(sizeof(ListData));
+	buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData));
+    }
     
-    listBufFlg = 0;
-    readBufFlg = 0;
-    writeBufFlg = 0;
+    buffFlag_taskList = 0;
+    buffFlag_inListData = 0;
+    buffFlag_outListData = 0;
+    flag_renewTaskList = 0;
+
+    // bzero でもいいけど
+    for (int i = 0; i < MAX_GLOBAL_AREA; i++) {
+	globalList[i] = NULL;
+    }
+
+    for (int i = 0; i < MAX_MAINMEM_AREA; i++) {
+	mainMemList[i] = NULL;
+    }
+    
+
+    taskGroup = new TaskGroup;
+    renewTop_taskList = NULL;
+    renewCur_taskList = NULL;
 }
 
 void
 Scheduler::run(void)
 {
     SchedTaskBase* taskTmp;
+
     task1 = new SchedNop();
     task2 = new SchedNop();
     task3 = new SchedNop();
@@ -43,33 +72,186 @@
 void
 Scheduler::finish(void)
 {
-    free(listBuf[0]);
-    free(listBuf[1]);
-    free(readBuf[0]);
-    free(readBuf[1]);
-    free(writeBuf[0]);
-    free(writeBuf[1]);
+    free(buff_taskList[0]);
+    free(buff_taskList[1]);
+    free(buff_inListData[0]);
+    free(buff_inListData[1]);
+    free(buff_outListData[0]);
+    free(buff_outListData[1]);
 }
 
+/**
+ * あらかじめ memory allocte してある TaskList の領域を
+ * パイプラインの各処理が交代して使う。
+ */
 TaskListPtr
 Scheduler::get_curListBuf(void)
 {
-    listBufFlg ^= 1;
-    return listBuf[listBufFlg];
+    buffFlag_taskList ^= 1;
+    curIndex_taskList = 0;
+
+    return buff_taskList[buffFlag_taskList];
+}
+
+
+/**
+ * あらかじめ memory allocte してある ListData の領域を
+ * パイプラインの各処理が交代して使う。
+ */
+ListDataPtr
+Scheduler::get_curWriteBuf(void)
+{
+    buffFlag_outListData ^= 1;
+    return buff_outListData[buffFlag_outListData];
+}
+
+
+ListDataPtr
+Scheduler::get_curReadBuf(void)
+{
+    buffFlag_inListData ^= 1;
+    return buff_inListData[buffFlag_inListData];
+}
+
+/**
+ * タスク内で生成されたタスクを格納する TaskList を取得する
+ * 現在格納に使っている TaskList (renewCur_taskList) が使えるならそれを返す
+ * もしそうでないなら、新しく TaskList を allocate してそれを返す
+ * コード中で renewCur_taskList が NULL になるのは
+ *   - プログラム開始時
+ *   - タスク内生成タスクがある TaskList の実行を新しく始める (Nop2Ready 参照)
+ * 以上の場合です
+ */
+TaskListPtr
+Scheduler::get_renewListBuf(void)
+{
+    if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) {
+	return renewCur_taskList;
+    } else {
+	TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList));
+	newList->length = 0;
+	newList->next = NULL;
+	renewTop_taskList = TaskList::append(renewTop_taskList, newList);
+	renewCur_taskList = newList;
+	return newList;
+    }
+}
+
+void
+Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask)
+{
+    connector->dma_load(buf, addr, size, mask);
+}
+
+void
+Scheduler::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask)
+{
+    connector->dma_store(buf, addr, size, mask);
+}
+
+void
+Scheduler::dma_wait(uint32 mask)
+{
+    connector->dma_wait(mask);
+}
+
+void
+Scheduler::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
+{
+    connector->dma_loadList(list, buff, mask);
 }
 
 
-void *
-Scheduler::get_curWriteBuf(void)
+void
+Scheduler::dma_storeList(ListDataPtr list, void *buff, uint32 mask)
+{
+    return connector->dma_storeList(list, buff, mask);
+}
+
+void
+Scheduler::mail_write(uint32 data)
+{
+    connector->mail_write(data);
+}
+
+uint32
+Scheduler::mail_read(void)
+{
+    return connector->mail_read();
+}
+
+TaskGroupPtr
+Scheduler::set_groupTask(uint32 command)
+{
+    TaskGroupPtr ret = taskGroup;
+
+    reload_groupTask();
+
+    ret->command = command;
+    return ret;
+}
+
+void
+Scheduler::add_groupTask(TaskGroupPtr group, TaskPtr task)
+{
+    group->add(task);
+}
+
+void
+Scheduler::remove_groupTask(TaskGroupPtr group, TaskPtr task)
 {
-    writeBufFlg ^= 1;
-    return writeBuf[writeBufFlg];
+    group->remove(task);
+}
+
+void
+Scheduler::reload_groupTask(void)
+{
+    taskGroup = new TaskGroup;
+}
+
+uint32
+Scheduler::status_groupTask(TaskGroupPtr group)
+{
+    return group->status();
+}
+
+void*
+Scheduler::global_alloc(int id, int size)
+{
+    globalList[id] = allocate(size);
+    return globalList[id];
+}
+
+void*
+Scheduler::global_get(int id)
+{
+    return globalList[id];
+}
+
+void
+Scheduler::global_free(int id)
+{
+    free(globalList[id]);
+    globalList[id] = NULL;
+}
+
+/**
+ * mainMem_alloc で確保したメインメモリの領域アドレスを返す。
+ * これは Fifo, Cell で共通
+ */
+void*
+Scheduler::mainMem_get(int id)
+{
+    return mainMemList[id];
 }
 
 
-void*
-Scheduler::get_curReadBuf(void)
+/**
+ * 本当は Scheduler クラスに入れるべきなんだろうか。。。
+ * なんか手抜きの感がある
+ */
+void
+register_task(int cmd, Scheduler::TaskObject task)
 {
-    readBufFlg ^= 1;
-    return readBuf[readBufFlg];
+    task_list[cmd] = task;
 }