Mercurial > hg > Members > kono > Cerium
annotate TaskManager/kernel/schedule/Scheduler.h @ 388:82cb9368e3ff
MemHash (OS X version)
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 06 Aug 2009 23:30:26 +0900 |
parents | 5e2d30bfbf23 |
children | 016d45583994 |
rev | line source |
---|---|
42 | 1 #ifndef INCLUDED_SCHEDULER |
2 #define INCLUDED_SCHEDULER | |
3 | |
301
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
4 #include "base.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
5 #include "TaskList.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
6 #include "ListData.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
7 #include "DmaManager.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
8 #include "SchedTaskBase.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
9 #include "SchedTaskList.h" |
bcb81858aa62
remove deprecated source. not work.
tkaito@localhost.localdomain
parents:
298
diff
changeset
|
10 #include "TaskGroup.h" |
373 | 11 #include "MemList.h" |
387
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
12 #include "MemHash.h" |
109 | 13 |
14 #define MAX_USER_TASK 32 | |
15 #define MAX_SYSTEM_TASK 2 | |
16 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK | |
17 #define MAX_GLOBAL_AREA 32 | |
18 #define MAX_MAINMEM_AREA 32 | |
19 | |
42 | 20 class SchedTaskBase; |
109 | 21 class SchedTask; |
184 | 22 class SchedTaskList; |
42 | 23 |
24 class Scheduler { | |
25 public: | |
109 | 26 virtual ~Scheduler(void); |
27 | |
28 BASE_NEW_DELETE(Scheduler); | |
42 | 29 |
30 /* variables */ | |
194 | 31 int id; |
387
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
32 MemHash *hash; |
109 | 33 |
34 // double buffering | |
35 TaskListPtr buff_taskList[2]; | |
36 ListDataPtr buff_inListData[2]; | |
37 ListDataPtr buff_outListData[2]; | |
38 | |
39 int buffFlag_taskList; | |
40 int buffFlag_inListData; | |
41 int buffFlag_outListData; | |
42 | |
298 | 43 /* TaskList 関連 */ |
109 | 44 |
45 /** | |
298 | 46 * 実行中 TaskList の現在の位置 (list->tasks[index]) |
373 | 47 * |
298 | 48 * bakIndex_taskList がある理由 |
49 * taskList の途中で renew task が作られたとき、 | |
50 * 即座に実行するため、TaskList -> RenewTaskList と移って処理する。 | |
51 * RenewTaskList が終了したとき、再び TaskList に戻ってくるが | |
52 * Renew Task を生成した所から再スタートするため、 | |
53 * taskList の index を覚えておく (backup) | |
54 * 同様に TaskList も覚えておく | |
109 | 55 */ |
184 | 56 int bakIndex_taskList; |
57 TaskListPtr bak_curTaskList; | |
373 | 58 |
109 | 59 |
60 /** | |
298 | 61 * タスク内で生成されたタスクを入れる |
62 * Linked List で管理 | |
109 | 63 */ |
64 TaskListPtr renewCur_taskList; | |
65 TaskListPtr renewTop_taskList; | |
66 | |
67 /** | |
298 | 68 * 実行中 TaskList が Renew されたものかどうかのフラグ |
69 * Renew の場合、ListData は DMA する必要ないとか | |
70 * いろいろな判定に使えるかもしれん | |
109 | 71 * if (flag == 1) taskList is Renew |
72 */ | |
73 int flag_renewTaskList; | |
74 | |
75 /** | |
298 | 76 * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、 |
77 * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。 | |
78 * なので、Tc を process group として記憶しておく。 | |
109 | 79 * |
298 | 80 * Tc が taskGroup のアドレスを持つので |
81 * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk | |
109 | 82 */ |
83 TaskGroupPtr taskGroup; | |
84 | |
85 /* GlobalMemoryList */ | |
86 void* globalList[MAX_GLOBAL_AREA]; | |
87 | |
88 /* MainMemory Allocate Command List */ | |
89 void* mainMemList[MAX_MAINMEM_AREA]; | |
90 | |
91 // Task Object Table | |
291 | 92 // this is named TaskObject but it is not an object. |
93 // It is a pointer to an object creation function | |
184 | 94 typedef SchedTask* (*TaskObject)(void); |
42 | 95 |
96 DmaManager* connector; | |
109 | 97 |
98 // Pipeline Stage | |
42 | 99 SchedTaskBase* task1; |
100 SchedTaskBase* task2; | |
101 SchedTaskBase* task3; | |
102 | |
103 /* functions */ | |
104 void init(void); | |
105 void run(void); | |
109 | 106 virtual void init_impl(void) {}; |
50 | 107 void finish(void); |
42 | 108 |
109 TaskListPtr get_curListBuf(void); | |
109 | 110 ListDataPtr get_curReadBuf(void); |
111 ListDataPtr get_curWriteBuf(void); | |
112 TaskListPtr get_renewListBuf(void); | |
113 | |
187 | 114 void set_backupTaskList(TaskListPtr cur_taskList); |
115 void set_backupTaskListIndex(int cur_index); | |
116 SchedTaskList* get_nextRenewTaskList(void); | |
184 | 117 TaskListPtr get_backupTaskList(void); |
187 | 118 int get_backupTaskListIndex(void); |
184 | 119 |
298 | 120 // なんか名前が変だが。。。 |
109 | 121 /* TaskGroup */ |
122 TaskGroupPtr set_groupTask(uint32 command); | |
123 void add_groupTask(TaskGroupPtr group, TaskPtr task); | |
124 void remove_groupTask(TaskGroupPtr group, TaskPtr task); | |
125 void reload_groupTask(void); | |
126 uint32 status_groupTask(TaskGroupPtr group); | |
127 | |
128 /* GlobalMemory */ | |
129 void* global_alloc(int id, int size); | |
130 void* global_get(int id); | |
373 | 131 void global_set(int id, void *addr); |
109 | 132 void global_free(int id); |
373 | 133 MemList* createMemList(int size, int count); |
109 | 134 virtual void *allocate(int size) { return NULL; }; |
135 | |
136 virtual void mainMem_alloc(int id, int size) {}; | |
137 virtual void mainMem_wait(void) {}; | |
138 void *mainMem_get(int id); | |
139 | |
387
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
140 MemorySegment * Scheduler::get_segment(memaddr addr, MemList *m); |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
387
diff
changeset
|
141 virtual uint32 Scheduler::get_tag(); |
387
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
142 void Scheduler::put_segment(MemorySegment *s); |
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
143 void Scheduler::wait_segment(MemorySegment *s); |
5e2d30bfbf23
no compile error but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
144 |
109 | 145 /* DMA Transfer */ |
146 void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask); | |
147 void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask); | |
148 void dma_wait(uint32 mask); | |
255 | 149 void show_dma_wait() { connector->show_dma_wait(id); }; |
334
20f2459041cb
[in test_render] push L key , call show_dma_wait, but incomplete.
e065746@localhost.localdomain
parents:
302
diff
changeset
|
150 void show_dma_wait(int id) { connector->show_dma_wait(id); }; |
109 | 151 void mail_write(uint32 data); |
152 uint32 mail_read(void); | |
153 void dma_loadList(ListDataPtr list, void *, uint32 mask); | |
154 void dma_storeList(ListDataPtr list, void *, uint32 mask); | |
42 | 155 }; |
156 | |
302 | 157 extern void register_task(int cmd, Scheduler::TaskObject task); |
42 | 158 #endif |
109 | 159 |
160 | |
373 | 161 #define SchedConstructor(str) \ |
162 str(void) {} \ | |
163 BASE_NEW_DELETE(str) \ | |
109 | 164 |
373 | 165 #define SchedDefineTask(str) \ |
166 SchedTask* createTask_##str(void) \ | |
167 { \ | |
168 return new str(); \ | |
109 | 169 } |
170 | |
373 | 171 #define SchedExternTask(str) \ |
172 extern \ | |
184 | 173 SchedTask* createTask_##str(void); |
109 | 174 |
373 | 175 #define SchedRegisterTask(cmd, str) \ |
109 | 176 register_task(cmd, createTask_##str); |