Mercurial > hg > Game > Cerium
annotate TaskManager/kernel/schedule/SchedTaskArray.cc @ 698:72b2da99e875 draft
no compile error for Task Array
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 13 Dec 2009 20:14:18 +0900 |
parents | 4b6242d03512 |
children | 8ece2ac85149 |
rev | line source |
---|---|
695 | 1 #include "SchedTaskArray.h" |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
2 #include "Scheduler.h" |
695 | 3 |
4 | |
5 SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array) | |
6 { | |
7 savedTask = savedTask_; | |
8 task = curTask_; | |
9 array = _array; | |
10 | |
696 | 11 inListData.bound = 0; |
12 inListData.size = 0; | |
13 inListData.length = 0; | |
14 inListData.element = 0; | |
15 outListData.bound = 0; | |
16 outListData.size = 0; | |
17 outListData.length = 0; | |
18 outListData.element = 0; | |
19 } | |
20 | |
697 | 21 /** |
22 */ | |
23 SchedTaskArray::~SchedTaskArray() | |
696 | 24 { |
697 | 25 } |
26 | |
27 static void | |
28 bound(ListData *list) | |
29 { | |
30 ListElement *elm = list->element; | |
31 int *bound = list->bound; | |
32 int offset=0; | |
696 | 33 for(int i=0;i<list->length;i++) { |
697 | 34 bound[i] = offset; |
35 offset += elm[i].size; | |
696 | 36 } |
695 | 37 } |
38 | |
39 void | |
40 SchedTaskArray::read() | |
41 { | |
42 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
43 | |
44 // object creation をSchedTaskArray生成時にやらないので、 | |
45 // exec の直前のread で十分に間に合う | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
46 loadSchedTask(scheduler, task->command); |
695 | 47 |
48 // 読むデータが一つもなければ無視 | |
696 | 49 if (task->inData_count == 0) return; |
50 | |
51 inListData.length = task->inData_count; | |
52 inListData.size = task->inData_total_size(); | |
697 | 53 inListData.element = task->inListData(); |
54 inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int)); | |
695 | 55 |
56 // load Input Data | |
696 | 57 readbuf = scheduler->allocate(inListData.size); |
58 scheduler->dma_loadList(&inListData, readbuf, DMA_READ); | |
697 | 59 bound(&inListData); |
695 | 60 |
61 } | |
62 | |
63 | |
64 void | |
65 SchedTaskArray::exec() | |
66 { | |
67 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
68 | |
69 scheduler->dma_wait(DMA_READ); | |
70 task_list[task->command].wait(scheduler,task->command); | |
71 task_list[task->command].run(this, readbuf, writebuf); | |
72 free(readbuf); | |
73 // 書き込む領域がなければ無視 | |
697 | 74 |
75 // User 側で作る方法が必要... | |
76 | |
696 | 77 if (task->outData_count > 0) { |
78 outListData.length = task->outData_count; | |
79 outListData.size = task->outData_total_size(); | |
697 | 80 outListData.element = task->outListData(); |
81 outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int)); | |
696 | 82 |
83 writebuf = scheduler->allocate(outListData.size); | |
84 scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); | |
697 | 85 bound(&outListData); |
695 | 86 } |
87 } | |
88 | |
89 void | |
90 SchedTaskArray::write() | |
91 { | |
92 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
93 | |
94 scheduler->dma_wait(DMA_WRITE); | |
95 free(writebuf); | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
96 free(inListData.bound); |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
97 free(outListData.bound); |
695 | 98 |
99 // このTaskArrayは終り。終了を知らせる。 | |
100 if (task->next() >= last()) { | |
697 | 101 SchedTask *s = (SchedTask *)savedTask; |
102 scheduler->mail_write((memaddr)s->task->self); | |
695 | 103 free(array); |
104 } | |
105 | |
106 } | |
107 | |
108 Task *SchedTaskArray::last() | |
109 { | |
697 | 110 SchedTask *s = (SchedTask *)savedTask; |
111 return (Task*)(((char*)array)+ s->read_size()); | |
695 | 112 } |
113 | |
114 SchedTaskBase* | |
697 | 115 SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p) |
695 | 116 { |
117 __debug("[SchedTaskArray:%s]\n", __FUNCTION__); | |
118 | |
697 | 119 Task *next = task->next(); |
120 if (next < last()) { | |
695 | 121 // Task List が残っているので、次を準備 |
122 return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array); | |
123 } else { | |
124 // このTaskArrayは終り。save していた Task の次を返す。 | |
125 // savedTask の read/exec は実行されない (command = TaskArray) | |
697 | 126 return savedTask->next(scheduler, savedTask); |
695 | 127 } |
128 } | |
129 | |
130 | |
131 | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
132 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
133 * task->add_inData で与えられた順番に対応する index (0〜n-1) で、 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
134 * buffer から対応するデータを返す。 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
135 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
136 void* |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
137 SchedTaskArray::get_input(void *buff, int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
138 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
139 return (void*)((char*)readbuf + inListData.bound[index]); |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
140 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
141 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
142 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
143 * get_input(index) のアドレスを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
144 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
145 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
146 SchedTaskArray::get_inputAddr(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
147 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
148 #ifdef __CERIUM_CELL__ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
149 return (memaddr)inListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
150 #else |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
151 return inListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
152 #endif |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
153 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
154 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
155 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
156 * get_input(index) のサイズを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
157 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
158 int |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
159 SchedTaskArray::get_inputSize(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
160 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
161 return inListData.element[index].size; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
162 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
163 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
164 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
165 * write buffer の領域を返す。 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
166 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
167 void* |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
168 SchedTaskArray::get_output(void *buff, int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
169 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
170 return (void*)((char *)writebuf + outListData.bound[index]); |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
171 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
172 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
173 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
174 * get_output(index) のアドレスを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
175 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
176 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
177 SchedTaskArray::get_outputAddr(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
178 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
179 #ifdef __CERIUM_CELL__ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
180 return (memaddr)outListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
181 #else |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
182 return outListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
183 #endif |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
184 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
185 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
186 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
187 * get_output(index) のサイズを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
188 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
189 int |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
190 SchedTaskArray::get_outputSize(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
191 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
192 return outListData.element[index].size; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
193 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
194 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
195 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
196 SchedTaskArray::get_param(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
197 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
198 memaddr *param = (memaddr*)task->param(index); |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
199 return *param; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
200 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
201 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
202 |
695 | 203 /* end */ |