Mercurial > hg > Game > Cerium
annotate TaskManager/kernel/schedule/SchedTaskArray.cc @ 704:ec6c897448ca draft
Compatibility mode works.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Dec 2009 19:54:00 +0900 (2009-12-14) |
parents | 0c8ad8d99656 |
children | b2b4a1243961 |
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 | |
699 | 5 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array) |
695 | 6 { |
7 savedTask = savedTask_; | |
8 task = curTask_; | |
9 array = _array; | |
699 | 10 scheduler = s; |
695 | 11 |
696 | 12 inListData.bound = 0; |
13 inListData.size = 0; | |
14 inListData.length = 0; | |
15 inListData.element = 0; | |
16 outListData.bound = 0; | |
17 outListData.size = 0; | |
18 outListData.length = 0; | |
19 outListData.element = 0; | |
20 } | |
21 | |
697 | 22 /** |
703 | 23 Constructor for old Task with ListData |
24 next TaskList entry contains Task object. | |
25 savedTask->rbuf is 0, it has only one Task. | |
26 */ | |
27 | |
28 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_) | |
29 { | |
30 savedTask = savedTask_; | |
31 SchedTask *sv = (SchedTask*)savedTask_; | |
32 scheduler = s; | |
33 | |
34 inListData.bound = 0; | |
35 inListData.size = 0; | |
36 inListData.length = 0; | |
37 inListData.element = 0; | |
38 outListData.bound = 0; | |
39 outListData.size = 0; | |
40 outListData.length = 0; | |
41 outListData.element = 0; | |
42 | |
704
ec6c897448ca
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
43 task = (TaskPtr)&sv->list->tasks[sv->cur_index]; |
ec6c897448ca
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
44 array = 0; |
ec6c897448ca
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
45 sv->cur_index += (task->size()+sizeof(SimpleTask))/sizeof(SimpleTask); |
703 | 46 |
47 } | |
48 | |
49 /** | |
697 | 50 */ |
51 SchedTaskArray::~SchedTaskArray() | |
696 | 52 { |
697 | 53 } |
54 | |
55 static void | |
56 bound(ListData *list) | |
57 { | |
58 ListElement *elm = list->element; | |
59 int *bound = list->bound; | |
60 int offset=0; | |
696 | 61 for(int i=0;i<list->length;i++) { |
697 | 62 bound[i] = offset; |
63 offset += elm[i].size; | |
696 | 64 } |
695 | 65 } |
66 | |
67 void | |
68 SchedTaskArray::read() | |
69 { | |
70 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
71 | |
72 // object creation をSchedTaskArray生成時にやらないので、 | |
73 // exec の直前のread で十分に間に合う | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
74 loadSchedTask(scheduler, task->command); |
695 | 75 |
76 // 読むデータが一つもなければ無視 | |
696 | 77 if (task->inData_count == 0) return; |
78 | |
79 inListData.length = task->inData_count; | |
80 inListData.size = task->inData_total_size(); | |
700 | 81 inListData.element = task->inData(0); |
697 | 82 inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int)); |
695 | 83 |
84 // load Input Data | |
696 | 85 readbuf = scheduler->allocate(inListData.size); |
701
44095db8cb61
Bulk task worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
700
diff
changeset
|
86 // inListData.print(); |
696 | 87 scheduler->dma_loadList(&inListData, readbuf, DMA_READ); |
697 | 88 bound(&inListData); |
695 | 89 |
90 } | |
91 | |
92 | |
93 void | |
94 SchedTaskArray::exec() | |
95 { | |
96 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
97 | |
699 | 98 if (task->outData_count > 0) { |
99 outListData.length = task->outData_count; | |
100 outListData.size = task->outData_total_size(); | |
700 | 101 outListData.element = task->outData(0); |
699 | 102 outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int)); |
103 bound(&outListData); | |
104 | |
105 writebuf = scheduler->allocate(outListData.size); | |
106 } | |
107 | |
695 | 108 scheduler->dma_wait(DMA_READ); |
109 task_list[task->command].wait(scheduler,task->command); | |
110 task_list[task->command].run(this, readbuf, writebuf); | |
111 free(readbuf); | |
112 // 書き込む領域がなければ無視 | |
697 | 113 |
114 // User 側で作る方法が必要... | |
115 | |
696 | 116 if (task->outData_count > 0) { |
701
44095db8cb61
Bulk task worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
700
diff
changeset
|
117 // outListData.print(); |
696 | 118 scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); |
695 | 119 } |
120 } | |
121 | |
122 void | |
123 SchedTaskArray::write() | |
124 { | |
125 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); | |
126 | |
127 scheduler->dma_wait(DMA_WRITE); | |
128 free(writebuf); | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
129 free(inListData.bound); |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
130 free(outListData.bound); |
695 | 131 |
132 // このTaskArrayは終り。終了を知らせる。 | |
704
ec6c897448ca
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
133 if (!array || task->next() >= last()) { |
697 | 134 SchedTask *s = (SchedTask *)savedTask; |
135 scheduler->mail_write((memaddr)s->task->self); | |
695 | 136 free(array); |
137 } | |
138 | |
139 } | |
140 | |
141 Task *SchedTaskArray::last() | |
142 { | |
697 | 143 SchedTask *s = (SchedTask *)savedTask; |
144 return (Task*)(((char*)array)+ s->read_size()); | |
695 | 145 } |
146 | |
147 SchedTaskBase* | |
697 | 148 SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p) |
695 | 149 { |
150 __debug("[SchedTaskArray:%s]\n", __FUNCTION__); | |
151 | |
697 | 152 Task *next = task->next(); |
153 if (next < last()) { | |
695 | 154 // Task List が残っているので、次を準備 |
699 | 155 return (SchedTaskBase*)new SchedTaskArray(scheduler, savedTask, next, array); |
695 | 156 } else { |
157 // このTaskArrayは終り。save していた Task の次を返す。 | |
158 // savedTask の read/exec は実行されない (command = TaskArray) | |
697 | 159 return savedTask->next(scheduler, savedTask); |
695 | 160 } |
161 } | |
162 | |
163 | |
164 | |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
165 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
166 * 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
|
167 * buffer から対応するデータを返す。 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
168 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
169 void* |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
170 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
|
171 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
172 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
|
173 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
174 |
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 * get_input(index) のアドレスを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
177 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
178 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
179 SchedTaskArray::get_inputAddr(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
180 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
181 #ifdef __CERIUM_CELL__ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
182 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
|
183 #else |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
184 return inListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
185 #endif |
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 |
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 * get_input(index) のサイズを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
190 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
191 int |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
192 SchedTaskArray::get_inputSize(int index) |
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 return inListData.element[index].size; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
195 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
196 |
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 * write buffer の領域を返す。 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
199 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
200 void* |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
201 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
|
202 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
203 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
|
204 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
205 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
206 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
207 * get_output(index) のアドレスを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
208 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
209 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
210 SchedTaskArray::get_outputAddr(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
211 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
212 #ifdef __CERIUM_CELL__ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
213 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
|
214 #else |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
215 return outListData.element[index].addr; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
216 #endif |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
217 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
218 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
219 /** |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
220 * get_output(index) のサイズを返す |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
221 */ |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
222 int |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
223 SchedTaskArray::get_outputSize(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
224 { |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
225 return outListData.element[index].size; |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
226 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
227 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
228 memaddr |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
229 SchedTaskArray::get_param(int index) |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
230 { |
700 | 231 return *task->param(index); |
698
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
232 } |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
233 |
72b2da99e875
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
234 |
695 | 235 /* end */ |