annotate TaskManager/kernel/schedule/SchedTask.cc @ 109:5c194c71eca8

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