Mercurial > hg > Members > e085722 > Cerium
diff TaskManager/kernel/ppe/Task.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/Task.h Mon Nov 08 01:23:25 2010 +0900 @@ -0,0 +1,148 @@ +#ifndef INCLUDED_TASK +#define INCLUDED_TASK + +#include "base.h" +#include "types.h" +#include "ListData.h" +#include "SimpleTask.h" + +class SchedTask; +class Scheduler; + +class Task { +public: // variables + int task_size; + int command; + int param_count; + int inData_count; + int outData_count; + int inData_offset; + int outData_offset; + void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); + +public: // functions + + void print(Scheduler *s); + + memaddr *param(int index) { + memaddr p = (memaddr)data + sizeof(memaddr)*index; + return (memaddr *)p; + } + + ListElement *inData(int index) { + memaddr p = (memaddr)data + inData_offset; + p += sizeof(ListElement)*index; + return (ListElement*)p; + } + + ListElement *outData(int index) { + memaddr p = (memaddr)data + outData_offset; + p += sizeof(ListElement)* index; + return (ListElement*)p; + } + + static int calc_size(int params, int ins, int outs) { + int size = round_up16(sizeof(Task)) + + round_up16(sizeof(memaddr)*params) + + round_up16(sizeof(ListElement)*ins) + + round_up16(sizeof(ListElement)*outs); + return size; + } + + void init(int task_id, int params, int ins, int outs) { + set_task_id(task_id); + param_count = params; + inData_count = ins; + outData_count = outs; + inData_offset = round_up16(sizeof(memaddr)*params); + outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins); + //task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs); + + task_size = round_up16(sizeof(Task)) + + round_up16(sizeof(memaddr)*params) + + round_up16(sizeof(ListElement)*ins) + + round_up16(sizeof(ListElement)*outs); + + } + + int size() { + return task_size; + } + + int inData_total_size() { + int size = 0; + ListElement *in= inData(0); + for(int i=0; i< inData_count; i++) { + size += in[i].size; + } + return size; + } + int outData_total_size() { + int size = 0; + ListElement *out= outData(0); + for(int i=0; i< outData_count; i++) { + size += out[i].size; + } + return size; + } + + void set_inData_t( int index, memaddr addr, int size) { + ListElement *list = inData(index); +#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; int b = *p; + p = (char *)(addr+size-1); b += *p; +#endif +#ifdef __CERIUM_CELL__ + list->addr = (uint32)addr; +#else + list->addr = addr; +#endif + list->size = size; + } + + void set_outData_t(int index, memaddr addr, int size) { + ListElement *list = outData(index); +#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; int b = *p; + p = (char *)(addr+size-1); b += *p; +#endif +#ifdef __CERIUM_CELL__ + list->addr = (uint32)addr; +#else + list->addr = addr; +#endif + list->size = size; + } + void set_task_id(int id) { command = id; } + void set_param_t(int index, memaddr param) { + memaddr *p = (memaddr*)this->param(index); + *p = param; + } + + Task * next() + { + char *p = (char*)this; + p += size(); + return (Task*)p; + } + + +#define set_param(index,param) set_param_t(index, (memaddr) (param)) + +#define set_inData(index, addr, size) \ + set_inData_t(index, (memaddr)(addr), (size)); +#define set_outData(index, addr, size) \ + set_outData_t(index, (memaddr)(addr), (size)); +} __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ; + +typedef Task* TaskPtr; + +#endif