annotate TaskManager/Cell/spe/SchedTask.cc @ 143:9588726193e1 draft

add xml
author gongo@charles.cr.ie.u-ryukyu.ac.jp
date Sat, 29 Nov 2008 03:36:11 +0900
parents 028ffc9c0375
children e3b7776b1420
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
1 #include <stdlib.h>
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
2 #include <string.h>
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
3 #include "SchedTask.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
4 #include "SchedTaskList.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
5 #include "SchedNop2Ready.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
6 #include "DmaManager.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
7 #include "error.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
8 #include "TaskManager.h"
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
9
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
10 extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
88
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
11
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
12 SchedTask*
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
13 CreateSchedTask(TaskListPtr taskList, Scheduler *sched)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
14 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
15 TaskPtr task = &taskList->tasks[sched->curIndex_taskList++];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
16
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
17 return task_list[task->command](taskList, task, sched->get_curReadBuf(),
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
18 sched->get_curWriteBuf(), sched);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
19 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
20
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
21 SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, ListDataPtr rbuf,
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
22 ListDataPtr wbuf, Scheduler* sc)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
23 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
24 __list = _list;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
25 __task = _task;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
26 __inListData = rbuf;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
27 __outListData = wbuf;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
28 __readbuf = NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
29 __writebuf = NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
30 __scheduler = sc;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
31 __taskGroup = NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
32 __renew_flag = 0;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
33
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
34 smanager = new STaskManager(this);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
35 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
36
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
37 SchedTask::~SchedTask(void)
88
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
38 {
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
39 if (__flag_renewTask) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
40 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
41 * __inListData と __outListData はタスク自身のものなので
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
42 * 終わったら即 free する。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
43 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
44 free(__inListData);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
45 free(__outListData);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
46
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
47 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
48 * __list != NULL の場合、
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
49 * この Task が __list の最後の Task になるので (SchedTask::next 参照)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
50 * このタイミングで __list を解放する
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
51 * (free に渡されるアドレスが正しいものとなる)。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
52 * それ以外の Task では当然解放しない。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
53 * __list == NULL なので、free に渡しても無問題
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
54 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
55 free(__list);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
56 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
57
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
58 delete smanager;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
59 }
88
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
60
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
61 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
62 SchedTask::__init__(void)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
63 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
64 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
65 * task->inData や task->outData が
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
66 * PPE のものか、SPE のものかって
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
67 * アドレスで判定できれば楽になると思うんだが。。。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
68 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
69 if (__flag_renewTask == 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
70 __scheduler->dma_load(__inListData, (uint32)__task->inData,
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
71 sizeof(ListData), DMA_READ_IN_LIST);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
72 __scheduler->dma_load(__outListData, (uint32)__task->outData,
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
73 sizeof(ListData), DMA_READ_OUT_LIST);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
74
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
75 __taskGroup = new TaskGroup;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
76 __taskGroup->command = __task->self;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
77 } else {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
78 __inListData = __task->inData;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
79 __outListData = __task->outData;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
80 __taskGroup = (TaskGroupPtr)__task->self;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
81 }
88
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
82 }
504899860e66 *** empty log message ***
gongo
parents: 81
diff changeset
83
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
84
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
85 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
86 * [Todo]
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
87 * データの読み込み場所を readbuf ではなく、
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
88 * ユーザ自身で決めれるようになるといいかもしれない。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
89 *
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
90 * # TaskManager が勝手に消すことなく、
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
91 * # ユーザが SPE 上に持ち続けることができるため。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
92 * # もちろん管理はユーザに任せるわけだ。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
93 */
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
94 void
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
95 SchedTask::read(void)
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
96 {
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
97 __debug("[SchedTask:%s]\n", __FUNCTION__);
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
98
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
99 // wait for load inListData
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
100 __scheduler->dma_wait(DMA_READ_IN_LIST);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
101
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
102 // 読むデータが一つもなければ無視
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
103 if (__inListData->length < 1 || __inListData->size == 0) return;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
104
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
105 // load Input Data
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
106 __readbuf = __scheduler->allocate(__inListData->size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
107 __scheduler->dma_loadList(__inListData, __readbuf, DMA_READ);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
108 }
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
109
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
110 void
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
111 SchedTask::exec(void)
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
112 {
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
113 __debug("[SchedTask:%s]\n", __FUNCTION__);
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
114
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
115 // wait for load outListData
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
116 __scheduler->dma_wait(DMA_READ_OUT_LIST);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
117
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
118 __writebuf = __scheduler->allocate(__outListData->size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
119
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
120 __debug(" task->command = %d\n", __task->command);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
121 __debug(" task->in_size = %d\n", __task->in_size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
122 __debug(" task->in_addr = 0x%x\n", __task->in_addr);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
123 __debug(" task->out_addr = 0x%x\n", __task->out_addr);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
124 __debug(" list->next = 0x%x\n", (unsigned int)__list->next);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
125 __debug(" list->length = 0x%x\n", (unsigned int)__list->length);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
126
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
127 __scheduler->dma_wait(DMA_READ);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
128
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
129 run(__readbuf, __writebuf);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
130
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
131 free(__readbuf);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
132
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
133 // 書き込む領域が要らなければ無視
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
134 if (__outListData->size > 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
135 __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
136 __scheduler->dma_wait(DMA_WRITE);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
137 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
138
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
139 if (__taskGroup->status() != 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
140 __task->self = __taskGroup->command;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
141 delete __taskGroup;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
142 __taskGroup = NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
143 }
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
144 }
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
145
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
146 void
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
147 SchedTask::write(void)
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
148 {
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
149 __debug("[SchedTask:%s]\n", __FUNCTION__);
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
150
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
151 __scheduler->dma_wait(DMA_WRITE);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
152
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
153 free(__writebuf);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
154
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
155 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
156 * タスクが生成されている場合、
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
157 * そのタスクが終わってからこのタスク終了コマンドを送る。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
158 * # コマンドは生成されたタスクに引き継がれる
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
159 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
160 if (__task->self == MY_SPE_NOP) return;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
161
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
162 if (__flag_renewTask) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
163 uint32 cmd;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
164
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
165 __taskGroup->remove(__task);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
166 cmd = __taskGroup->status();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
167
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
168 if (cmd != 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
169 delete __taskGroup;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
170 __scheduler->mail_write(cmd);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
171 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
172 } else {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
173 if (__renew_flag == 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
174 __scheduler->mail_write(__task->self);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
175 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
176 }
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
177 }
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
178
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
179 SchedTaskBase*
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
180 SchedTask::next(Scheduler *m, SchedTaskBase *p)
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
181 {
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
182 __debug("[SchedTask:%s]\n", __FUNCTION__);
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
183
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
184 delete p;
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
185
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
186 if (__scheduler->curIndex_taskList < __list->length) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
187 SchedTask* schedTask = CreateSchedTask(__list, __scheduler);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
188 schedTask->__flag_renewTask = this->__flag_renewTask;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
189 schedTask->__init__();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
190
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
191 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
192 * この理由は SchedTask:~SchedTask() で
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
193 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
194 __list = NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
195
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
196 return schedTask;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
197 } else {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
198 uint32 nextList = (uint32)__list->next;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
199
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
200 if (nextList == 0) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
201 return new SchedNop2Ready(__scheduler);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
202 } else {
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
203 return new SchedTaskList(nextList, __scheduler);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
204 }
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
205 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
206 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
207
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
208 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
209 * task->add_input で与えられた順番に対応する index (0〜n-1) で、
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
210 * buffer から対応するデータを返す。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
211 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
212 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
213 SchedTask::get_input(void *buff, int index)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
214 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
215 if (buff != NULL) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
216 return (void*)((int)buff + __inListData->bound[index]);
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
217 } else {
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
218 return NULL;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
219 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
220 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
221
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
222 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
223 * write buffer の領域を返す。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
224 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
225 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
226 SchedTask::get_output(void *buff, int index)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
227 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
228 if (buff != NULL) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
229 return (void*)((int)buff + __outListData->bound[index]);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
230 } else {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
231 return NULL;
81
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
232 }
b03a4d3565c0 *** empty log message ***
gongo
parents:
diff changeset
233 }
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
234
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
235 int
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
236 SchedTask::get_param(int index)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
237 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
238 return __task->param[index];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
239 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
240
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
241 TaskPtr
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
242 SchedTask::create_task(int cmd)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
243 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
244 TaskListPtr taskList = __scheduler->get_renewListBuf();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
245 TaskPtr p = &taskList->tasks[taskList->length++];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
246 p->command = cmd;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
247
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
248 p->inData = (ListData*)__scheduler->allocate(sizeof(ListData));
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
249 p->outData = (ListData*)__scheduler->allocate(sizeof(ListData));
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
250
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
251 p->inData->clear();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
252 p->outData->clear();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
253
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
254 p->self = MY_SPE_NOP;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
255 p->param_size = 0;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
256
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
257 return p;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
258 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
259
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
260 /**
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
261 * 名前が。。。
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
262 */
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
263 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
264 SchedTask::wait_task(TaskPtr waitTask)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
265 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
266 waitTask->self = (uint32)__taskGroup;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
267
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
268 __scheduler->add_groupTask(__taskGroup, waitTask);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
269
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
270 __renew_flag++;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
271 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
272
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
273 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
274 SchedTask::global_alloc(int id, int size) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
275 return __scheduler->global_alloc(id, size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
276 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
277
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
278 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
279 SchedTask::global_get(int id) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
280 return __scheduler->global_get(id);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
281 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
282
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
283 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
284 SchedTask::global_free(int id) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
285 __scheduler->global_free(id);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
286 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
287
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
288 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
289 SchedTask::mainMem_alloc(int id, int size) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
290 __scheduler->mainMem_alloc(id, size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
291 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
292
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
293 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
294 SchedTask::mainMem_wait(void) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
295 __scheduler->mainMem_wait();
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
296 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
297
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
298 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
299 SchedTask::mainMem_get(int id) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
300 return __scheduler->mainMem_get(id);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
301 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
302
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
303 void*
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
304 SchedTask::allocate(int size) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
305 return __scheduler->allocate(size);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
306 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
307
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
308 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
309 SchedTask::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
310 __scheduler->dma_load(buf, addr, size, mask);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
311 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
312
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
313 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
314 SchedTask::dma_store(void *buf,uint32 addr, uint32 size, uint32 mask) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
315 __scheduler->dma_store(buf, addr, size, mask);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
316 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
317
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
318 void
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
319 SchedTask::dma_wait(uint32 mask) {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
320 __scheduler->dma_wait(mask);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents: 88
diff changeset
321 }