diff TaskManager/kernel/schedule/SchedTask.cc @ 180:5cde66c926b4

いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
author gongo@localhost.localdomain
date Mon, 22 Dec 2008 16:09:57 +0900
parents 5c194c71eca8
children df3cfc04e796
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/SchedTask.cc	Fri Dec 19 14:21:29 2008 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Mon Dec 22 16:09:57 2008 +0900
@@ -66,9 +66,6 @@
      * PPE ΤΤSPE ΤΤä
      * ɥ쥹ȽǤгڤˤʤȻפ
      */
-    /**
-     * ؿݥ󥿤Ǥ뤫
-     */
     if (__flag_renewTask == 0) {
 	__scheduler->dma_load(__inListData, (uint32)__task->inData,
 			      sizeof(ListData), DMA_READ_IN_LIST);
@@ -77,10 +74,18 @@
 	
 	__taskGroup = new TaskGroup;
 	__taskGroup->command = __task->self;
+
+	ex_read  = &SchedTask::ex_read_normal;
+	ex_exec  = &SchedTask::ex_exec_normal;
+	ex_write = &SchedTask::ex_write_normal;
     } else {
 	__inListData = __task->inData;
 	__outListData = __task->outData;
 	__taskGroup = (TaskGroupPtr)__task->self;
+
+	ex_read  = &SchedTask::ex_read_renew;
+	ex_exec  = &SchedTask::ex_exec_renew;
+	ex_write = &SchedTask::ex_write_renew;
     }
 }
 
@@ -108,6 +113,8 @@
     // load Input Data
     __readbuf = __scheduler->allocate(__inListData->size);
     __scheduler->dma_loadList(__inListData, __readbuf, DMA_READ);
+
+    (this->*ex_read)();
 }
 
 void
@@ -117,8 +124,6 @@
 
     // wait for load outListData 
     __scheduler->dma_wait(DMA_READ_OUT_LIST);
-    __scheduler->dma_wait(DMA_READ);
-
     __writebuf = __scheduler->allocate(__outListData->size);
 
     __debug("  task->command  = %d\n", __task->command);
@@ -128,12 +133,11 @@
     __debug("  list->next     = 0x%x\n", (unsigned int)__list->next);
     __debug("  list->length   = 0x%x\n", (unsigned int)__list->length);
 
+    __scheduler->dma_wait(DMA_READ);
+
     run(__readbuf, __writebuf);
 
-    // 񤭹ΰ褬פʤ̵
-    if (__outListData->size > 0) {
-	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
-    }
+    free(__readbuf);
 
     if (__taskGroup->status() != 0) {
 	__task->self = __taskGroup->command;
@@ -141,7 +145,16 @@
 	__taskGroup = NULL;
     }
 
-    free(__readbuf);
+    // 񤭹ΰ褬פʤ̵
+    if (__outListData->size > 0 || __outListData->length > 0) {
+	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
+	// SchedTask::write(void) Ǥ wait ݤƤɡ
+        // ºݤˤϤ wait ʤȤȽ񤭹ޤƤʤ
+	// wait ϤƤϤʤʡ
+	__scheduler->dma_wait(DMA_WRITE);
+    }
+
+    (this->*ex_exec)();
 }
 
 void
@@ -149,31 +162,98 @@
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
-    __scheduler->dma_wait(DMA_WRITE);
-
+    //__scheduler->dma_wait(DMA_WRITE);
     free(__writebuf);
 
     /**
-     * Ƥ硢
-     * ΥäƤ餳Υλޥɤ롣
-     * # ޥɤ줿˰Ѥ
+     * ΥSPE줿
+     * ΥνλԤɬפϤʤȤ꤬Ƥ뤿ᡢ
+     *   (wait_task() ƤФƤʤ)
+     * ǽλ롣ex_write ϼ¹Ԥʤ
      */
     if (__task->self == MY_SPE_NOP) return;
 
-    if (__flag_renewTask) {
-	uint32 cmd;
-	
-	__taskGroup->remove(__task);
-	cmd = __taskGroup->status();
+    (this->*ex_write)();
+}
+
+/**
+ * PPE 줿 ex_read()
+ */
+void
+SchedTask::ex_read_normal(void)
+{
+}
+
+/**
+ * SPE 줿 ex_read()
+ */
+void
+SchedTask::ex_read_renew(void)
+{
+}
+
+/**
+ * PPE 줿 ex_exec()
+ */
+void
+SchedTask::ex_exec_normal(void)
+{
+}
+
+/**
+ * SPE 줿 ex_exec()
+ */
+void
+SchedTask::ex_exec_renew(void)
+{
+}
+
+
 
-	if (cmd != 0) {
-	    delete __taskGroup;
-	    __scheduler->mail_write(cmd);
-	}
-    } else {
-	if (__renew_flag == 0) {
-	    __scheduler->mail_write(__task->self);
-	}
+/**
+ * PPE 줿 ex_write()
+ * 
+ * Υǿ˥졢
+ * ĤΥνλԤɬפ硢
+ * PPE ˽λȤΤ餻ʤ(command ʤ)
+ */
+void
+SchedTask::ex_write_normal(void)
+{
+    /**
+     * Υǿ˥ʤä
+     * or 줿ΥνλԤɬפ̵
+     */
+    if (__renew_flag == 0) {
+	__scheduler->mail_write(__task->self);
+    }
+}
+
+/**
+ * SPE 줿 ex_write()
+ *
+ *  A <- ƥ
+ *  | \
+ *  B   C <- SPE 줿
+ *
+ * A  SPE  B, C Ȥ롣
+ * B  C λ顢A  PPE Ϥäޥɤ
+ * ҥ˰ѤƤΤǡǸ˼¹Ԥ줿ҥ
+ * PPE  mail 롣
+ */
+void
+SchedTask::ex_write_renew(void)
+{
+    uint32 cmd;
+	
+    __taskGroup->remove(__task);
+    cmd = __taskGroup->status();
+    
+
+    // Ǻ줿ƤΥλ
+    if (cmd != 0) {
+	delete __taskGroup;
+	__scheduler->mail_write(cmd);
     }
 }
     
@@ -259,7 +339,10 @@
 }
 
 /**
- * ̾
+ * λƤ顢ᥤ󥹥塼(PPE) 
+ * λݤΤ餻롣
+ *
+ * @param[in] waitTask 
  */
 void
 SchedTask::wait_task(TaskPtr waitTask)