Mercurial > hg > Members > kono > Cerium
annotate TaskManager/kernel/schedule/SchedTaskArray.cc @ 838:41302b72c895
Draw Span Task -> Task Array
author | Yutaka_Kinjyo |
---|---|
date | Fri, 28 May 2010 01:47:42 +0900 |
parents | c7905ead974f |
children | ab3cd3aeacff |
rev | line source |
---|---|
695 | 1 #include "SchedTaskArray.h" |
786
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
2 #include "SchedTaskArrayNop.h" |
698
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
3 #include "Scheduler.h" |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
4 #include "TaskManagerImpl.h" |
695 | 5 |
6 | |
699 | 7 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array) |
695 | 8 { |
9 savedTask = savedTask_; | |
708 | 10 atask = curTask_; |
695 | 11 array = _array; |
699 | 12 scheduler = s; |
695 | 13 |
696 | 14 inListData.bound = 0; |
15 inListData.size = 0; | |
16 inListData.length = 0; | |
17 inListData.element = 0; | |
18 outListData.bound = 0; | |
19 outListData.size = 0; | |
20 outListData.length = 0; | |
21 outListData.element = 0; | |
22 } | |
23 | |
697 | 24 /** |
703 | 25 Constructor for old Task with ListData |
26 next TaskList entry contains Task object. | |
27 savedTask->rbuf is 0, it has only one Task. | |
28 */ | |
29 | |
30 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_) | |
31 { | |
32 savedTask = savedTask_; | |
33 scheduler = s; | |
34 | |
35 inListData.bound = 0; | |
36 inListData.size = 0; | |
37 inListData.length = 0; | |
38 inListData.element = 0; | |
39 outListData.bound = 0; | |
40 outListData.size = 0; | |
41 outListData.length = 0; | |
42 outListData.element = 0; | |
43 | |
808 | 44 SimpleTaskPtr st = &savedTask->list->tasks[savedTask->cur_index]; |
45 atask = (TaskPtr)st; | |
704
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
46 array = 0; |
708 | 47 savedTask->cur_index += (atask->size()+sizeof(SimpleTask))/sizeof(SimpleTask); |
703 | 48 |
49 } | |
50 | |
51 /** | |
697 | 52 */ |
53 SchedTaskArray::~SchedTaskArray() | |
696 | 54 { |
697 | 55 } |
56 | |
708 | 57 /** |
58 * DMA buffer offset in rbuf | |
59 */ | |
697 | 60 static void |
61 bound(ListData *list) | |
62 { | |
63 ListElement *elm = list->element; | |
64 int *bound = list->bound; | |
65 int offset=0; | |
696 | 66 for(int i=0;i<list->length;i++) { |
697 | 67 bound[i] = offset; |
68 offset += elm[i].size; | |
696 | 69 } |
695 | 70 } |
71 | |
708 | 72 /** |
73 * Task data / code read | |
74 */ | |
695 | 75 void |
76 SchedTaskArray::read() | |
77 { | |
78 | |
79 // object creation をSchedTaskArray生成時にやらないので、 | |
80 // exec の直前のread で十分に間に合う | |
708 | 81 loadSchedTask(scheduler, atask->command); |
695 | 82 |
83 // 読むデータが一つもなければ無視 | |
708 | 84 if (atask->inData_count == 0) return; |
696 | 85 |
708 | 86 inListData.length = atask->inData_count; |
87 inListData.size = atask->inData_total_size(); | |
88 inListData.element = atask->inData(0); | |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
89 inListData.bound = (int*)manager->allocate(inListData.length*sizeof(int)); |
695 | 90 |
91 // load Input Data | |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
92 readbuf = manager->allocate(inListData.size); |
701
226d95fa2691
Bulk task worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
700
diff
changeset
|
93 // inListData.print(); |
696 | 94 scheduler->dma_loadList(&inListData, readbuf, DMA_READ); |
697 | 95 bound(&inListData); |
695 | 96 |
97 } | |
98 | |
708 | 99 /** |
100 * Wait read data and execute task | |
101 * Start write DMA | |
102 */ | |
695 | 103 void |
104 SchedTaskArray::exec() | |
105 { | |
106 | |
708 | 107 if (atask->outData_count > 0) { |
108 outListData.length = atask->outData_count; | |
109 outListData.size = atask->outData_total_size(); | |
110 outListData.element = atask->outData(0); | |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
111 outListData.bound = (int*)manager->allocate(outListData.length*sizeof(int)); |
699 | 112 bound(&outListData); |
113 | |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
114 writebuf = manager->allocate(outListData.size); |
699 | 115 } |
116 | |
695 | 117 scheduler->dma_wait(DMA_READ); |
708 | 118 task_list[atask->command].wait(scheduler,atask->command); |
119 task_list[atask->command].run(this, readbuf, writebuf); | |
695 | 120 free(readbuf); |
121 // 書き込む領域がなければ無視 | |
697 | 122 |
123 // User 側で作る方法が必要... | |
124 | |
708 | 125 if (atask->outData_count > 0) { |
701
226d95fa2691
Bulk task worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
700
diff
changeset
|
126 // outListData.print(); |
696 | 127 scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); |
695 | 128 } |
129 } | |
130 | |
708 | 131 /** |
132 * Wait write DMA | |
133 * send finish mail | |
134 */ | |
695 | 135 void |
136 SchedTaskArray::write() | |
137 { | |
138 | |
139 scheduler->dma_wait(DMA_WRITE); | |
140 free(writebuf); | |
698
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
141 free(inListData.bound); |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
142 free(outListData.bound); |
695 | 143 } |
144 | |
145 Task *SchedTaskArray::last() | |
146 { | |
697 | 147 SchedTask *s = (SchedTask *)savedTask; |
148 return (Task*)(((char*)array)+ s->read_size()); | |
695 | 149 } |
150 | |
151 SchedTaskBase* | |
697 | 152 SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p) |
695 | 153 { |
154 | |
708 | 155 Task *next = atask->next(); |
697 | 156 if (next < last()) { |
695 | 157 // Task List が残っているので、次を準備 |
708 | 158 return new SchedTaskArray(scheduler, savedTask, next, array); |
695 | 159 } else { |
786
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
160 |
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
161 //このTaskArrayは終わったが、Pipeline 上にread の TaskArray が残っているので |
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
162 //1ステージを稼ぐ必要がある |
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
163 |
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
164 return new SchedTaskArrayNop(scheduler, savedTask, next, array); |
ccf78a465459
fix early free of TaskArray, add SchedTaskArrayNop stage.
yutaka@localhost.localdomain
parents:
781
diff
changeset
|
165 |
695 | 166 } |
167 } | |
168 | |
169 | |
170 | |
698
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
171 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
172 * task->add_inData で与えられた順番に対応する index (0〜n-1) で、 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
173 * buffer から対応するデータを返す。 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
174 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
175 void* |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
176 SchedTaskArray::get_input(void *buff, int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
177 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
178 return (void*)((char*)readbuf + inListData.bound[index]); |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
179 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
180 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
181 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
182 * get_input(index) のアドレスを返す |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
183 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
184 memaddr |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
185 SchedTaskArray::get_inputAddr(int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
186 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
187 #ifdef __CERIUM_CELL__ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
188 return (memaddr)inListData.element[index].addr; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
189 #else |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
190 return inListData.element[index].addr; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
191 #endif |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
192 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
193 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
194 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
195 * get_input(index) のサイズを返す |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
196 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
197 int |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
198 SchedTaskArray::get_inputSize(int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
199 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
200 return inListData.element[index].size; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
201 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
202 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
203 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
204 * write buffer の領域を返す。 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
205 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
206 void* |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
207 SchedTaskArray::get_output(void *buff, int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
208 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
209 return (void*)((char *)writebuf + outListData.bound[index]); |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
210 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
211 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
212 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
213 * get_output(index) のアドレスを返す |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
214 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
215 memaddr |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
216 SchedTaskArray::get_outputAddr(int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
217 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
218 #ifdef __CERIUM_CELL__ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
219 return (memaddr)outListData.element[index].addr; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
220 #else |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
221 return outListData.element[index].addr; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
222 #endif |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
223 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
224 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
225 /** |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
226 * get_output(index) のサイズを返す |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
227 */ |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
228 int |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
229 SchedTaskArray::get_outputSize(int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
230 { |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
231 return outListData.element[index].size; |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
232 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
233 |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
234 memaddr |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
235 SchedTaskArray::get_param(int index) |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
236 { |
708 | 237 return *atask->param(index); |
698
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
238 } |
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
239 |
800
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
240 int |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
241 SchedTaskArray::read_size() |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
242 { |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
243 printf("Don't use read_size() in TaskArray, use get_inputSize(index)\n"); |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
244 return 0; |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
245 } |
2708c4a7bade
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
786
diff
changeset
|
246 |
698
dcaa40ec963d
no compile error for Task Array
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
697
diff
changeset
|
247 |
695 | 248 /* end */ |