comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:04e28d8d3c6f
1 #ifndef INCLUDED_TASK
2 #define INCLUDED_TASK
3
4 #include "base.h"
5 #include "types.h"
6 #include "ListData.h"
7 #include "SimpleTask.h"
8
9 class SchedTask;
10 class Scheduler;
11
12 class Task {
13 public: // variables
14 int task_size;
15 int command;
16 int param_count;
17 int inData_count;
18 int outData_count;
19 int inData_offset;
20 int outData_offset;
21 void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
22
23 public: // functions
24
25 void print(Scheduler *s);
26
27 memaddr *param(int index) {
28 memaddr p = (memaddr)data + sizeof(memaddr)*index;
29 return (memaddr *)p;
30 }
31
32 ListElement *inData(int index) {
33 memaddr p = (memaddr)data + inData_offset;
34 p += sizeof(ListElement)*index;
35 return (ListElement*)p;
36 }
37
38 ListElement *outData(int index) {
39 memaddr p = (memaddr)data + outData_offset;
40 p += sizeof(ListElement)* index;
41 return (ListElement*)p;
42 }
43
44 static int calc_size(int params, int ins, int outs) {
45 int size = round_up16(sizeof(Task))
46 + round_up16(sizeof(memaddr)*params)
47 + round_up16(sizeof(ListElement)*ins)
48 + round_up16(sizeof(ListElement)*outs);
49 return size;
50 }
51
52 void init(int task_id, int params, int ins, int outs) {
53 set_task_id(task_id);
54 param_count = params;
55 inData_count = ins;
56 outData_count = outs;
57 inData_offset = round_up16(sizeof(memaddr)*params);
58 outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins);
59 //task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs);
60
61 task_size = round_up16(sizeof(Task))
62 + round_up16(sizeof(memaddr)*params)
63 + round_up16(sizeof(ListElement)*ins)
64 + round_up16(sizeof(ListElement)*outs);
65
66 }
67
68 int size() {
69 return task_size;
70 }
71
72 int inData_total_size() {
73 int size = 0;
74 ListElement *in= inData(0);
75 for(int i=0; i< inData_count; i++) {
76 size += in[i].size;
77 }
78 return size;
79 }
80 int outData_total_size() {
81 int size = 0;
82 ListElement *out= outData(0);
83 for(int i=0; i< outData_count; i++) {
84 size += out[i].size;
85 }
86 return size;
87 }
88
89 void set_inData_t( int index, memaddr addr, int size) {
90 ListElement *list = inData(index);
91 #ifdef EARLY_TOUCH
92 if ((unsigned long)addr&0xf) {
93 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
94 command, index, (unsigned long)addr, size);
95 }
96 char *p = (char *)addr; int b = *p;
97 p = (char *)(addr+size-1); b += *p;
98 #endif
99 #ifdef __CERIUM_CELL__
100 list->addr = (uint32)addr;
101 #else
102 list->addr = addr;
103 #endif
104 list->size = size;
105 }
106
107 void set_outData_t(int index, memaddr addr, int size) {
108 ListElement *list = outData(index);
109 #ifdef EARLY_TOUCH
110 if ((unsigned long)addr&0xf) {
111 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
112 command, index, (unsigned long)addr, size);
113 }
114 char *p = (char *)addr; int b = *p;
115 p = (char *)(addr+size-1); b += *p;
116 #endif
117 #ifdef __CERIUM_CELL__
118 list->addr = (uint32)addr;
119 #else
120 list->addr = addr;
121 #endif
122 list->size = size;
123 }
124 void set_task_id(int id) { command = id; }
125 void set_param_t(int index, memaddr param) {
126 memaddr *p = (memaddr*)this->param(index);
127 *p = param;
128 }
129
130 Task * next()
131 {
132 char *p = (char*)this;
133 p += size();
134 return (Task*)p;
135 }
136
137
138 #define set_param(index,param) set_param_t(index, (memaddr) (param))
139
140 #define set_inData(index, addr, size) \
141 set_inData_t(index, (memaddr)(addr), (size));
142 #define set_outData(index, addr, size) \
143 set_outData_t(index, (memaddr)(addr), (size));
144 } __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ;
145
146 typedef Task* TaskPtr;
147
148 #endif