Mercurial > hg > Members > kono > Cerium
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)