# HG changeset patch # User gongo # Date 1202981257 -32400 # Node ID aa11038dbdc1d8daca14754754ea4303e9b301dd # Parent 68fb5bfee6b76ecb51d847a517a62239ed7d4f41 *** empty log message *** diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Feb 14 18:27:37 2008 +0900 @@ -13,49 +13,10 @@ void FifoTaskManagerImpl::init(void) { + TaskManagerImpl::init(); + taskInfo = new FifoTaskInfo(); taskInfo->init(); - - mailManager = new MailManager(); - mailManager->init_pool_mailQueue(20); -} - -TaskListPtr -FifoTaskManagerImpl::set_task(void) -{ - // ここ...直すかな - TaskListPtr list; - TaskQueuePtr queue; - TaskQueuePtr d; - HTaskPtr htask; - TaskPtr task; - - queue = taskInfo->activeTaskQueue; - if (queue == NULL) { - return NULL; - } - - taskInfo->clear_taskList(); - - while (queue) { - list = taskInfo->get_available_taskList(); - htask = queue->task; - d = queue; - queue = queue->next; - - task = &list->tasks[list->length++]; - task->command = htask->command; - task->in_addr = htask->in_addr; - task->out_addr = htask->out_addr; - task->in_size = htask->in_size; - task->self = htask; - - taskInfo->free_taskQueue(d); - } - - taskInfo->activeTaskQueue = NULL; - - return list; } void @@ -65,78 +26,6 @@ //run(); } -// ../spe/main.cpp -extern MailQueuePtr spe_main(MailManager*, MailQueuePtr); - -/** - * spe 側は MY_SPE_COMMAND_EXIT を受け取るまでは別スレッドで動き続ける。 - * fifo version では sequential に動かすため、 - * mail list の最後に番兵として MY_SPE_COMMAND_EXIT のメールを入れる。 - * これで、fifo での spe 側は、mail で受け取った task_list を処理した後 - * EXIT を受け取って終了する・・・といいな - */ -void -FifoTaskManagerImpl::run(void) -{ - TaskListPtr list; - MailQueuePtr mail_list = NULL; - MailQueuePtr list_mail = NULL; // task list - MailQueuePtr sentinel = NULL; // 番兵 - - // 暫定 - list = set_task(); - - list_mail = mailManager->create_mail((unsigned int)list); - mail_list = append_mailQueue(mail_list, list_mail); - - do { - sentinel = mailManager->create_mail(MY_SPE_COMMAND_EXIT); - mail_list = append_mailQueue(mail_list, sentinel); - - // 返って来た mail_list には、spe からの mail がある - mail_list = spe_main(mailManager, mail_list); - mail_list = mail_check(mail_list); - } while (mail_list); -} - -MailQueuePtr -FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list) -{ - MailQueuePtr q = mail_list; - MailQueuePtr d; - MailQueuePtr ret = NULL; - unsigned int data; - TaskListPtr next_list; - - while (q) { - data = q->data; - - if (data == MY_SPE_STATUS_READY) { -#ifdef _PPE_DEBUG - printf("[FIFO] finish\n"); -#endif - next_list = set_task(); - if (next_list != NULL) { - d = mailManager->create_mail((unsigned int)next_list); - ret = append_mailQueue(ret, d); - } - } else { -#ifdef _PPE_DEBUG - printf("[PPE] recv from : 0x%x\n", data); -#endif - taskInfo->check_task_finish((HTaskPtr)data); - } - - d = q; - q = q->next; - - mailManager->free_mailQueue(d); - } - - return ret; -} - - TaskManagerImpl* create_impl(int num) { diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Makefile --- a/TaskManager/Makefile Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Makefile Thu Feb 14 18:27:37 2008 +0900 @@ -24,7 +24,7 @@ cd $(KERN_SPE_DIR); rm -f *~ \#* cd $(IMPL_FIFO_DIR); rm -f *~ \#* cd $(IMPL_CELL_DIR); rm -f *~ \#* - rm -f $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) + rm -f $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(KERN_SCHED_OBJS) rm -f $(IMPL_FIFO_OBJS) $(IMPL_CELL_OBJS) tags: diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Makefile.def Thu Feb 14 18:27:37 2008 +0900 @@ -7,6 +7,10 @@ KERN_PPE_SRCS = $(wildcard $(KERN_PPE_DIR)/*.cpp) KERN_PPE_OBJS = $(KERN_PPE_SRCS:.cpp=.o) +KERN_SCHED_DIR = $(KERN_DIR)/schedule +KERN_SCHED_SRCS = $(wildcard $(KERN_SCHED_DIR)/*.cpp) +KERN_SCHED_OBJS = $(KERN_SCHED_SRCS:.cpp=.o) + KERN_SPE_DIR = $(KERN_DIR)/spe KERN_SPE_SRCS = $(wildcard $(KERN_SPE_DIR)/*.cpp) KERN_SPE_OBJS = $(KERN_SPE_SRCS:.cpp=.o) @@ -20,7 +24,7 @@ IMPL_CELL_OBJS = $(IMPL_CELL_SRCS:.cpp=.o) CC = g++ -CFLAGS = -O9 -Wall -g -D_PPE_DEBUG# -DDEBUG +CFLAGS = -Wall -g -D_PPE_DEBUG -DDEBUG LIBS = INCLUDE = -I../include/TaskManager \ No newline at end of file diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Makefile.fifo --- a/TaskManager/Makefile.fifo Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Makefile.fifo Thu Feb 14 18:27:37 2008 +0900 @@ -8,5 +8,8 @@ all: default default: $(TARGET) -$(TARGET): $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS) - ar crus $@ $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS) +ALL_OBJS = $(KERN_PPE_OBJS) $(KERN_SCHED_OBJS) $(IMPL_FIFO_OBJS) + +#$(TARGET): $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS) +$(TARGET): $(ALL_OBJS) + ar crus $@ $(ALL_OBJS) diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Test/simple_render/Makefile --- a/TaskManager/Test/simple_render/Makefile Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Test/simple_render/Makefile Thu Feb 14 18:27:37 2008 +0900 @@ -8,7 +8,7 @@ TASK_OBJS = $(TASK_SRCS:.cpp=.o) CC = g++ -CFLAGS = -O9 -g -Wall +CFLAGS = -g -Wall INCLUDE = -I../../../include/TaskManager -I. EXTRA_CFLAGS = `sdl-config --cflags` `xml2-config --cflags`\ diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Test/simple_render/main.cpp --- a/TaskManager/Test/simple_render/main.cpp Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Test/simple_render/main.cpp Thu Feb 14 18:27:37 2008 +0900 @@ -12,6 +12,8 @@ int run(void*, void*); int finish(void*, void*); +extern int run_init(); + TaskManager *manager; Viewer *screen; diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/Test/simple_render/viewer.cpp --- a/TaskManager/Test/simple_render/viewer.cpp Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/Test/simple_render/viewer.cpp Thu Feb 14 18:27:37 2008 +0900 @@ -316,6 +316,122 @@ } +struct run_arg_t { + int start_time; + int this_time; + int frames; + SDL_Surface *bitmap; + SDL_PixelFormat *pf; + Uint32 background; + Polygon *p; + SceneGraphPack *sgp; + PolygonPack *pp; +}; + +#if 0 +void +Viewer::run_init() +{ + struct run_arg_t *arg = new run_arg_t; + HTaskPtr task; + int fd; + + arg->start_time = get_ticks(); + arg->pf = screen->format; + arg->background = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00); + arg->p = new Polygon; + arg->p->set_data("cube.xml"); + arg->p->viewer = this; + arg->sgp = new SceneGraphPack; + create_sgp(arg->sgp, arg->p); + arg->pp = new PolygonPack; + + pixels = new Uint32[width*height]; + + graph_line(); + + arg->bitmap = SDL_CreateRGBSurfaceFrom((void *)pixels, width, height, 32, + width*4, redMask, greenMask, + blueMask, alphaMask); + + fd = manager->open("ViewerRunLoop"); + task = manager->create_task(fd, sizeof(struct run_arg_t), + (unsigned int)arg, 0, NULL); + manager->spawn_task(task_create_pp); + //manager->run(); +} + +void +Viewer::run_loop(struct run_arg_t *arg) +{ + HTaskPtr task_update_sgp = NULL; + HTaskPtr task_create_pp = NULL; + HTaskPtr task_finish = NULL; + int fd_update_sgp; + int fd_create_pp; + int fd_finish; + + if (quit_check()) { + arg->this_time = get_ticks(); + fd_finish = manager->open("ViewerRunFinish"); + task_finish = manager->create(fd_finish, sizeof(struct run_arg_t), + (unsigned int)arg, 0, NULL); + manager->spawn_task(task_finish); + return; + } + + clean_pixels(); + + this->zRow_init(); + graph_line(); + + fd_update_sgp = manager->open("UpdateSGP"); + fd_create_pp = manager->open("CreatePP"); + task_update_sgp = + manager->create_task(fd_update_sgp, + sizeof(SceneGraphPack), + (unsigned int)arg->sgp, + (unsigned int)arg->sgp, + NULL); + task_create_pp = + manager->create_task(fd_create_pp, + sizeof(SceneGraphPack), + (unsigned int)arg->sgp, + (unsigned int)arg->pp, + NULL); + + manager->spawn_task(task_update_sgp); + manager->spawn_task(task_create_pp); + manager->run(); + + arg->p->draw(pp); // test draw of PolygonPack + + SDL_BlitSurface(arg->bitmap, NULL, screen, NULL); + SDL_UpdateRect(screen, 0, 0, 0, 0); + + //swap_buffers(); + arg->frames++; +} + +void +Viewer::run_finish(struct run_arg_t *arg) +{ + if (arg->this_time != arg->start_time) { + cout<< ((float)arg->frames/(this_time-start_time))*1000.0 << " FPS\n"; + } + + SDL_FreeSurface(arg->bitmap); + delete [] pixels; + arg->p->delete_data(); + delete arg->p; + delete arg->sgp; + delete arg->pp; + quit(); + + delete arg; +} +#endif + void Viewer::run() { int frames = 0; diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Feb 13 23:49:08 2008 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Thu Feb 14 18:27:37 2008 +0900 @@ -1,6 +1,8 @@ #include #include "TaskManagerImpl.h" +#include "ppe_spe.h" + void noaction(void) { @@ -11,6 +13,17 @@ machineNum = num; } +void +TaskManagerImpl::init(void) +{ + mailManager = new MailManager(); + mailManager->init_pool_mailQueue(20); + + scheduler = new MainScheduler(); + scheduler->init(); + scheduler->set_mailManager(mailManager); +} + HTaskPtr TaskManagerImpl::create_task(int cmd, int size, unsigned long long in_addr, @@ -55,3 +68,112 @@ taskInfo->append_waitTask(task); } } + +TaskListPtr +TaskManagerImpl::set_task(void) +{ + // ここ...直すかな + TaskListPtr list; + TaskQueuePtr queue; + TaskQueuePtr d; + HTaskPtr htask; + TaskPtr task; + + queue = taskInfo->activeTaskQueue; + if (queue == NULL) { + return NULL; + } + + taskInfo->clear_taskList(); + + while (queue) { + list = taskInfo->get_available_taskList(); + htask = queue->task; + d = queue; + queue = queue->next; + + task = &list->tasks[list->length++]; + task->command = htask->command; + task->in_addr = htask->in_addr; + task->out_addr = htask->out_addr; + task->in_size = htask->in_size; + task->self = htask; + + taskInfo->free_taskQueue(d); + } + + taskInfo->activeTaskQueue = NULL; + + return list; +} + + +// ../spe/main.cpp +extern MailQueuePtr spe_main(MailManager*, MailQueuePtr); + +void +TaskManagerImpl::run(void) +{ + TaskListPtr list; + MailQueuePtr list_mail; // task list + MailQueuePtr sentinel; // 番兵 + MailQueuePtr in_mail_list = NULL; + MailQueuePtr out_mail_list = NULL; + + // 暫定 + list = set_task(); + + list_mail = mailManager->create_mail((unsigned int)list); + in_mail_list = append_mailQueue(in_mail_list, list_mail); + + do { + sentinel = mailManager->create_mail(MY_SPE_COMMAND_EXIT); + in_mail_list = append_mailQueue(in_mail_list, sentinel); + + // 返って来た mail_list には、spe からの mail がある + scheduler->send_mailList(in_mail_list); + scheduler->run(); + out_mail_list = scheduler->recv_mailList(); + in_mail_list = mail_check(out_mail_list); + } while (in_mail_list); +} + +/** + * PPE Scheduler からのメールをチェックする + */ +MailQueuePtr +TaskManagerImpl::mail_check(MailQueuePtr mail_list) +{ + MailQueuePtr q = mail_list; + MailQueuePtr d; + MailQueuePtr ret = NULL; + unsigned int data; + TaskListPtr next_list; + + while (q) { + data = q->data; + + if (data == MY_SPE_STATUS_READY) { +#ifdef _PPE_DEBUG + printf("[FIFO] finish\n"); +#endif + next_list = set_task(); + if (next_list != NULL) { + d = mailManager->create_mail((unsigned int)next_list); + ret = append_mailQueue(ret, d); + } + } else { +#ifdef _PPE_DEBUG + printf("[PPE] recv from : 0x%x\n", data); +#endif + taskInfo->check_task_finish((HTaskPtr)data); + } + + d = q; + q = q->next; + + mailManager->free_mailQueue(d); + } + + return ret; +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/MainScheduler.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/MainScheduler.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,47 @@ +#include +#include "MainScheduler.h" +#include "FifoDmaManager.h" +#include "error.h" + +void +MainScheduler::init_impl(void) +{ + connector = new FifoDmaManager(); + + for (int i = 0; i < 2; i++) { + listBuf[i] = new TaskList; + readBuf[i] = malloc(16*1024); + writeBuf[i] = malloc(16*1024); + } +} + +void +MainScheduler::set_mailManager(MailManager *m) +{ + ((FifoDmaManager*)connector)->mailManager = m; +} + + +void +MainScheduler::send_mailList(MailQueuePtr mail_list) +{ + ((FifoDmaManager*)connector)->mail_recvQueue = mail_list; + ((FifoDmaManager*)connector)->mail_sendQueue = NULL; +} + +MailQueuePtr +MainScheduler::recv_mailList(void) +{ + return ((FifoDmaManager*)connector)->mail_sendQueue; +} + +void +MainScheduler::finish(void) +{ + delete listBuf[0]; + delete listBuf[1]; + free(readBuf[0]); + free(readBuf[1]); + free(writeBuf[0]); + free(writeBuf[1]); +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedExit.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedExit.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,13 @@ +#include +#include "SchedExit.h" +#include "error.h" + +SchedTaskBase* +SchedExit::next(Scheduler *m, SchedTaskBase *p) +{ + delete p; + + __debug("SchedExit::next()\n"); + + return NULL; +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedMail.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedMail.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,35 @@ +#include "SchedMail.h" +#include "SchedTaskList.h" +#include "SchedExit.h" +#include "error.h" + +SchedMail::SchedMail(DmaManager *cn) +{ + connector = cn; +} + +void +SchedMail::read(void) +{ + + __debug("[SchedMail:%s]\n", __FUNCTION__); + + params_addr = connector->mail_read(); + + __debug(" params_addr = 0x%x\n", params_addr); +} + +SchedTaskBase* +SchedMail::next(Scheduler *m, SchedTaskBase *p) +{ + delete p; + + __debug("[SchedMail:%s]\n", __FUNCTION__); + + // if 文なくすには・・・関数ポインタ? + if ((int)params_addr == MY_SPE_COMMAND_EXIT) { + return new SchedExit(); + } else { + return new SchedTaskList(params_addr, m->get_curListBuf(), connector); + } +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedNop.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedNop.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,14 @@ +#include +#include "SchedNop.h" +#include "SchedMail.h" +#include "error.h" + +SchedTaskBase* +SchedNop::next(Scheduler *m, SchedTaskBase *p) +{ + __debug("SchedNop::next()"); + + delete p; + + return new SchedMail(m->connector); +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedNop2Ready.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedNop2Ready.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,27 @@ +#include +#include "SchedNop2Ready.h" +#include "SchedMail.h" +#include "error.h" + +SchedNop2Ready::SchedNop2Ready(DmaManager *cn) +{ + connector = cn; +} + +void +SchedNop2Ready::exec(void) +{ + __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); + + connector->mail_write(MY_SPE_STATUS_READY); +} + +SchedTaskBase* +SchedNop2Ready::next(Scheduler *m, SchedTaskBase *p) +{ + __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); + + delete p; + + return new SchedMail(connector); +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedTask.cc --- /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 diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/SchedTaskList.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,40 @@ +#include "SchedTaskList.h" +#include "SchedTask.h" +#include "SchedNop2Ready.h" +#include "DmaManager.h" +#include "error.h" + +SchedTaskList::SchedTaskList(unsigned int addr, TaskListPtr listbuf, DmaManager* c) +{ + params_addr = addr; + list = listbuf; + connector = c; +} + +void +SchedTaskList::read(void) +{ + __debug("[SchedTaskList:%s]\n", __FUNCTION__); + + connector->dma_load(list, params_addr, sizeof(TaskList), DMA_READ); + connector->dma_wait(DMA_READ); +} + +SchedTaskBase* +SchedTaskList::next(Scheduler *m, SchedTaskBase *p) +{ + __debug("[SchedTaskList:%s]\n", __FUNCTION__); + + delete p; + + if (list->length < 1) { + return new SchedNop2Ready(connector); + } else { + // 本当は、ここで task->command に対応する、 + // SchedTask を継承する class を作ればいい。。。はず + return new SchedTask(list, &list->tasks[--list->length], + m->get_curReadBuf(), + m->get_curWriteBuf(), + connector); + } +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 TaskManager/kernel/schedule/Scheduler.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/Scheduler.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,61 @@ +#include "Scheduler.h" +#include "SchedNop.h" +#include "error.h" + +void +Scheduler::init(void) +{ + init_impl(); + + listBufFlg = 0; + readBufFlg = 0; + writeBufFlg = 0; +} + +void +Scheduler::run(void) +{ + SchedTaskBase* taskTmp; + task1 = new SchedNop(); + task2 = new SchedNop(); + task3 = new SchedNop(); + + // main loop + do { + __debug("----------\n"); + task3->write(); + task2->exec(); + task1->read(); + + taskTmp = task3; + task3 = task2; + task2 = task1; + task1 = task1->next(this, taskTmp); + } while (task1); + + delete task3; + delete task2; +} + +TaskListPtr +Scheduler::get_curListBuf(void) +{ + listBufFlg ^= 1; + return listBuf[listBufFlg]; +} + + +void * +Scheduler::get_curWriteBuf(void) +{ + writeBufFlg ^= 1; + return writeBuf[writeBufFlg]; +} + + +void* +Scheduler::get_curReadBuf(void) +{ + readBufFlg ^= 1; + return readBuf[readBufFlg]; +} diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/DmaManager.h --- a/include/TaskManager/DmaManager.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/DmaManager.h Thu Feb 14 18:27:37 2008 +0900 @@ -6,7 +6,9 @@ DMA_WRITE }; -#include "ppe_spe.h" +#ifndef INCLUDED_TYPES +# include "ppe_spe.h" +#endif class DmaManager { public: diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/FifoTaskManagerImpl.h --- a/include/TaskManager/FifoTaskManagerImpl.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/FifoTaskManagerImpl.h Thu Feb 14 18:27:37 2008 +0900 @@ -9,10 +9,6 @@ # include "TaskManagerImpl.h" #endif -#ifndef INCLUDED_MAIL_MANAGER -# include "MailManager.h" -#endif - class FifoTaskManagerImpl : public TaskManagerImpl { public: /* constructor */ @@ -23,14 +19,6 @@ void run(void); void spawn_task(HTaskPtr); - TaskListPtr set_task(void); - -private: - /* variables */ - MailManager *mailManager; - - /* functions */ - MailQueuePtr mail_check(MailQueuePtr mail_list); }; #endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/MainScheduler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/MainScheduler.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,21 @@ +#ifndef INCLUDED_MAIN_SCHEDULER +#define INCLUDED_MAIN_SCHEDULER + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_MAIL_MANAGER +# include "MailManager.h" +#endif + +class MainScheduler : public Scheduler { +public: + void init_impl(void); + void finish(void); + void set_mailManager(MailManager *); + void send_mailList(MailQueuePtr mail_list); + MailQueuePtr recv_mailList(void); +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedExit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedExit.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,23 @@ +#ifndef INCLUDED_SCHED_EXIT +#define INCLUDED_SCHED_EXIT + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +class SchedExit : public SchedTaskBase { +public: + /* constructor */ + SchedExit(void) {} + + /* variables */ + + /* functions */ + SchedTaskBase* next(Scheduler *, SchedTaskBase *); +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedMail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedMail.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,33 @@ +#ifndef INCLUDED_SCHED_MAIL +#define INCLUDED_SCHED_MAIL + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +#include "error.h" + +class SchedMail : public SchedTaskBase{ +public: + /* constructor */ + SchedMail(DmaManager *); + + /* variables */ + unsigned int params_addr; + DmaManager* connector; + + /* functions */ + void read(void); + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + +#if DEBUG + void exec(void) { __debug("[SchedMail:%s]\n", __FUNCTION__); } + void write(void) { __debug("[SchedMail:%s]\n", __FUNCTION__); } +#endif +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedNop.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedNop.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,26 @@ +#ifndef INCLUDED_SCHED_NOP +#define INCLUDED_SCHED_NOP + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +#include "error.h" + +class SchedNop : public SchedTaskBase { +public: + /* functions */ + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + +#if DEBUG + void read(void) { __debug("[SchedNop:%s]\n", __FUNCTION__); } + void exec(void) { __debug("[SchedNop:%s]\n", __FUNCTION__); } + void write(void) { __debug("[SchedNop:%s]\n", __FUNCTION__); } +#endif +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedNop2Ready.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedNop2Ready.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,36 @@ +#ifndef INCLUDED_SCHED_NOP2READY +#define INCLUDED_SCHED_NOP2READY + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +#ifndef INCLUDED_SCHED_NOP +# include "SchedNop.h" +#endif + +#include "error.h" + +class SchedNop2Ready : public SchedNop { +public: + /* constructor */ + SchedNop2Ready(DmaManager*); + + /* variables */ + DmaManager* connector; + + /* functions */ + void exec(void); + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + +#if DEBUG + void read(void) { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); } + void write(void) { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); } +#endif +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedTask.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedTask.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,41 @@ +#ifndef INCLUDED_SCHED_TASK +#define INCLUDED_SCHED_TASK + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +class SchedTask : public SchedTaskBase { +public: + /* constructor */ + SchedTask(TaskListPtr, TaskPtr, void*, void*, DmaManager*); + + /* variables */ + TaskListPtr list; + TaskPtr task; + void *readbuf; + void *writebuf; + + DmaManager* connector; + + // work area + // global variable 用とか + // 次の task に引き渡したり + // size : デフォルトで 4k + // ppuから教えてもらう? task に入れる + void (*func)(void *wbuf, void *rbuf); + + /* functions */ + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + + // override + void read(void); + void exec(void); + void write(void); +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedTaskBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedTaskBase.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,26 @@ +#ifndef INCLUDED_SCHED_TASK_BASE +#define INCLUDED_SCHED_TASK_BASE + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +class Scheduler; + +class SchedTaskBase { +public: + /* constructor */ + //SchedTaskBase(void) {} + virtual ~SchedTaskBase(void) {} + + // noaction in default + virtual void load(void) {} + virtual void read(void) {} + virtual void exec(void) {} + virtual void write(void) {} + + /* functions */ + virtual SchedTaskBase* next(Scheduler*, SchedTaskBase*) = 0; +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/SchedTaskList.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SchedTaskList.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,40 @@ +#ifndef INCLUDED_SCHED_TASKLIST +#define INCLUDED_SCHED_TASKLIST + +#ifndef INCLUDED_SCHEDULER +# include "Scheduler.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +#include "error.h" + +class SchedTaskList : public SchedTaskBase { +public: + /* constructor */ + SchedTaskList(unsigned int addr, TaskListPtr list, DmaManager* c); + + /* variables */ + unsigned int params_addr; + TaskListPtr list; + DmaManager* connector; + + /* functions */ + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + + /* override functions */ + void read(void); + +#ifdef DEBUG + void exec(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); } + void write(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); } +#endif + +}; + +//extern void get_task_list(); +//extern void print_task_list(); + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/Scheduler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/Scheduler.h Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,47 @@ +#ifndef INCLUDED_SCHEDULER +#define INCLUDED_SCHEDULER + +#ifndef INCLUDED_TASK +# include "task.h" +#endif + +#ifndef INCLUDED_DMA_MANAGER +# include "DmaManager.h" +#endif + +#ifndef INCLUDED_SCHED_TASK_BASE +# include "SchedTaskBase.h" +#endif + +class SchedTaskBase; + +class Scheduler { +public: + virtual ~Scheduler(void) {} + + /* variables */ + TaskListPtr listBuf[2]; + void *readBuf[2]; + void *writeBuf[2]; + int listBufFlg; + int readBufFlg; + int writeBufFlg; + + DmaManager* connector; + + SchedTaskBase* task1; + SchedTaskBase* task2; + SchedTaskBase* task3; + + /* functions */ + void init(void); + void run(void); + virtual void init_impl(void) = 0; + virtual void finish(void) = 0; + + TaskListPtr get_curListBuf(void); + void* get_curReadBuf(void); + void* get_curWriteBuf(void); +}; + +#endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/TaskInfo.h --- a/include/TaskManager/TaskInfo.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/TaskInfo.h Thu Feb 14 18:27:37 2008 +0900 @@ -53,8 +53,8 @@ virtual void clear_taskList(void) = 0; - void append_activeTask(HTaskPtr); - void append_waitTask(HTaskPtr); + virtual void append_activeTask(HTaskPtr); + virtual void append_waitTask(HTaskPtr); void free_taskList(TaskListPtr q); void free_taskQueue(TaskQueuePtr q); diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/TaskManagerImpl.h --- a/include/TaskManager/TaskManagerImpl.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/TaskManagerImpl.h Thu Feb 14 18:27:37 2008 +0900 @@ -5,6 +5,14 @@ # include "TaskInfo.h" #endif +#ifndef INCLUDED_MAIL_MANAGER +# include "MailManager.h" +#endif + +#ifndef INCLUDED_MAIN_SCHEDULER +# include "MainScheduler.h" +#endif + class TaskManagerImpl { public: /* constructor */ @@ -14,16 +22,20 @@ /* variables */ int machineNum; TaskInfo* taskInfo; + MailManager *mailManager; + MainScheduler *scheduler; /* functions */ - virtual void init(void) = 0; - virtual void run(void) = 0; + virtual void init(void); + void run(void); + MailQueuePtr mail_check(MailQueuePtr mail_list); HTaskPtr create_task(int cmd, int siz, unsigned long long in_addr, unsigned long long out_addr, void (*func)(void)); void set_task_depend(HTaskPtr master, HTaskPtr slave); + TaskListPtr set_task(void); virtual void spawn_task(HTaskPtr); }; #endif diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/error.h --- a/include/TaskManager/error.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/error.h Thu Feb 14 18:27:37 2008 +0900 @@ -1,4 +1,3 @@ -//extern void __debug(char *str); #ifdef DEBUG # include # define __debug(...) do { \ @@ -7,3 +6,13 @@ #else /* DEBUG */ # define __debug(...) #endif + +#ifdef _PPE_DEBUG +# include +# define __debug_ppe(...) do { \ + printf(__VA_ARGS__); \ + } while (0) +#else /* DEBUG */ +# define __debug_ooe(...) +#endif + diff -r 68fb5bfee6b7 -r aa11038dbdc1 include/TaskManager/ppe_spe.h --- a/include/TaskManager/ppe_spe.h Wed Feb 13 23:49:08 2008 +0900 +++ b/include/TaskManager/ppe_spe.h Thu Feb 14 18:27:37 2008 +0900 @@ -1,6 +1,9 @@ /** * Alignment value and macro for DMA transfer in SPE */ +#ifndef INCLUDED_TYPES +#define INCLUDED_TYPES + #define SPE_ALIGNMENT 16 #define SPE_ALIGNMENT_FULL 128 #define SPE_ALIGN __attribute__((aligned(SPE_ALIGNMENT))) @@ -16,3 +19,5 @@ MY_SPE_STATUS_BUSY, MY_SPE_STATUS_READY }; + +#endif