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