Mercurial > hg > Members > e085722 > Cerium
diff TaskManager/kernel/ppe/HTask.h @ 0:04e28d8d3c6f
first commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Nov 2010 01:23:25 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/ppe/HTask.h Mon Nov 08 01:23:25 2010 +0900 @@ -0,0 +1,166 @@ +#ifndef INCLUDED_HTASK +#define INCLUDED_HTASK + +#include "base.h" +#include "types.h" +#include "Task.h" +#include "TaskQueue.h" +#include "QueueInfo.h" +#include <stdio.h> + +class TaskManagerImpl; +class SchedTask; + +typedef void (*PostFunction)(SchedTask *s, void *read, void *write); + +extern QueueInfo<TaskQueue>* taskQueuePool; + +/*! + @class + + @brief + + Cerium の Task で、spawn() でキューに格納されて順次実行される。 + cpu の指定があれば並列に実行される。 + 特定の Task を待ち合わせる事が可能。 + Task の入出力は dma などで copy される。 + */ + +#include "SimpleTask.h" + +class HTask : public SimpleTask { +public: + BASE_NEW_DELETE(HTask); + + QueueInfo<TaskQueue> *wait_me; // List of task waiting for me + QueueInfo<TaskQueue> *wait_i; // List of task for which I am waiting + PostFunction post_func; + void *post_arg1; + void *post_arg2; + CPU_TYPE cpu_type; + TaskManagerImpl *mimpl; + + HTask *waiter; + HTask *next; + HTask *prev; + + struct { + unsigned no_auto_free:1; // bit 0 auto free flag (0 .. auto, 1 manual) + } flag; + + void spawn(); + void wait_for(HTask *); + void set_cpu(CPU_TYPE type); + void set_post(PostFunction func, void *read, void *write); + Task *create_task_array(int task_id, int num_task, int num_param, int num_inData, int num_outData); + Task *next_task_array(int task_id, Task *t); + void spawn_task_array(Task *t); + + HTask *init(int cmd, memaddr rbuf, int rs, memaddr wbuf, int ws) { + init(cmd); + set_input(rbuf, rs); + set_output(wbuf, ws); + return this; + } + + void initOnce() { + wait_me = new QueueInfo<TaskQueue>(taskQueuePool); + wait_i = new QueueInfo<TaskQueue>(taskQueuePool); + } + + void freeOnce() { + delete wait_me; + delete wait_i; + } + + private: + + int param_index; + int in_index; + int out_index; + +// compatibility + public: // functions + void add_inData_t(memaddr addr, int size) { + Task *t = (Task*)rbuf; + t->set_inData_t(in_index++, addr,size); + } + void add_outData_t(memaddr addr, int size) { + Task *t = (Task*)rbuf; + t->set_outData_t(out_index++, addr,size); + } + void set_inData_t(int index, memaddr addr, int size) { +#ifdef EARLY_TOUCH + if ((unsigned long)addr&0xf) { + printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", + command, index, (unsigned long)addr, size); + } + char *p = (char *)addr; char b = *p; + p = (char *)(addr+size-1); b += *p; +#endif + Task *t = (Task*)rbuf; + t->set_inData_t(index, addr,size); + } + void set_outData_t(int index, memaddr addr, int size) { +#ifdef EARLY_TOUCH + if ((unsigned long)addr&0xf) { + printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n", + command, index, (unsigned long)addr, size); + } + char *p = (char *)addr; char b = *p; + p = (char *)(addr+size-1); b += *p; +#endif + Task *t = (Task*)rbuf; + t->set_outData_t(index, addr,size); + } + void add_param_t(memaddr param) { + Task *t = (Task*)rbuf; + t->set_param_t(param_index++, param); + } + void set_param_t(int index, memaddr param) { + if (command==TaskArray1) { + Task *t = (Task*)rbuf; + t->set_param_t(index, param); + } else { + this->param = param; + } + } + + void no_auto_free() { + flag.no_auto_free = 1; + } + void auto_free() { + flag.no_auto_free = 0; + } + + void init() { + next = prev = NULL; + waiter = NULL; + } + + void init(int cmd) { + command = cmd; + param_index = 0; + in_index = 0; + out_index = 0; + flag.no_auto_free = 0; + self = (memaddr) this; + + post_func = NULL; + mimpl = NULL; + cpu_type = CPU_PPE; + } +#define add_param(param) add_param_t((memaddr)(param)) +#define set_param(index,param) set_param_t(index, (memaddr) (param)) + +#define add_inData(addr, size) \ + add_inData_t((memaddr)(addr), (size)); +#define add_outData(addr, size) \ + add_outData_t((memaddr)(addr), (size)); + + +} __attribute__ ((aligned (DEFAULT_ALIGNMENT))); + +typedef HTask* HTaskPtr; + +#endif