Mercurial > hg > Game > Cerium
comparison TaskManager/kernel/schedule/Scheduler.h @ 619:278db3ca751d draft
RenewTask removal
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Nov 2009 02:02:30 +0900 |
parents | 184d6d3f0cd9 |
children | 64e05530e333 |
comparison
equal
deleted
inserted
replaced
618:58417006268c | 619:278db3ca751d |
---|---|
1 #ifndef INCLUDED_SCHEDULER | 1 #ifndef INCLUDED_SCHEDULER |
2 #define INCLUDED_SCHEDULER | 2 #define INCLUDED_SCHEDULER |
3 | 3 |
4 #include "stdlib.h" | |
4 #include "base.h" | 5 #include "base.h" |
5 #include "TaskList.h" | 6 #include "TaskList.h" |
6 #include "ListData.h" | 7 #include "ListData.h" |
7 #include "DmaManager.h" | 8 #include "DmaManager.h" |
8 #include "SchedTaskBase.h" | 9 #include "SchedTaskBase.h" |
9 #include "SchedTaskList.h" | 10 #include "SchedTaskList.h" |
10 #include "TaskGroup.h" | |
11 #include "MemList.h" | 11 #include "MemList.h" |
12 #include "MemHash.h" | 12 #include "MemHash.h" |
13 #include "TaskManagerImpl.h" | |
14 | |
13 | 15 |
14 #define MAX_USER_TASK 32 | 16 #define MAX_USER_TASK 32 |
15 #define MAX_SYSTEM_TASK 2 | 17 #define MAX_SYSTEM_TASK 2 |
16 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK | 18 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK |
17 #define MAX_GLOBAL_AREA 32 | 19 #define MAX_GLOBAL_AREA 32 |
18 #define MAX_MAINMEM_AREA 32 | 20 #define MAX_MAINMEM_AREA 32 |
19 | 21 |
20 class SchedTaskBase; | 22 class SchedTaskBase; |
21 class SchedTask; | 23 class SchedTask; |
22 class SchedTaskList; | 24 class SchedTaskList; |
25 class TaskManager; | |
23 | 26 |
24 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w); | 27 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w); |
25 | 28 |
26 class Scheduler { | 29 class Scheduler { |
27 public: | 30 public: |
33 int id; | 36 int id; |
34 MemHash *hash; | 37 MemHash *hash; |
35 | 38 |
36 // double buffering | 39 // double buffering |
37 TaskListPtr buff_taskList[2]; | 40 TaskListPtr buff_taskList[2]; |
38 // ListDataPtr buff_inListData[2]; | |
39 // ListDataPtr buff_outListData[2]; | |
40 | 41 |
41 int buffFlag_taskList; | 42 int buffFlag_taskList; |
42 // int buffFlag_inListData; | |
43 // int buffFlag_outListData; | |
44 | |
45 /* TaskList 関連 */ | |
46 | |
47 /** | |
48 * 実行中 TaskList の現在の位置 (list->tasks[index]) | |
49 * | |
50 * bakIndex_taskList がある理由 | |
51 * taskList の途中で renew task が作られたとき、 | |
52 * 即座に実行するため、TaskList -> RenewTaskList と移って処理する。 | |
53 * RenewTaskList が終了したとき、再び TaskList に戻ってくるが | |
54 * Renew Task を生成した所から再スタートするため、 | |
55 * taskList の index を覚えておく (backup) | |
56 * 同様に TaskList も覚えておく | |
57 */ | |
58 int bakIndex_taskList; | |
59 TaskListPtr bak_curTaskList; | |
60 | |
61 | |
62 /** | |
63 * タスク内で生成されたタスクを入れる | |
64 * Linked List で管理 | |
65 */ | |
66 TaskListPtr renewCur_taskList; | |
67 TaskListPtr renewTop_taskList; | |
68 | |
69 /** | |
70 * 実行中 TaskList が Renew されたものかどうかのフラグ | |
71 * Renew の場合、ListData は DMA する必要ないとか | |
72 * いろいろな判定に使えるかもしれん | |
73 * if (flag == 1) taskList is Renew | |
74 */ | |
75 int flag_renewTaskList; | |
76 | |
77 /** | |
78 * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、 | |
79 * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。 | |
80 * なので、Tc を process group として記憶しておく。 | |
81 * | |
82 * Tc が taskGroup のアドレスを持つので | |
83 * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk | |
84 */ | |
85 TaskGroupPtr taskGroup; | |
86 | 43 |
87 /* GlobalMemoryList */ | 44 /* GlobalMemoryList */ |
88 void* globalList[MAX_GLOBAL_AREA]; | 45 void* globalList[MAX_GLOBAL_AREA]; |
89 | 46 |
90 /* MainMemory Allocate Command List */ | 47 /* MainMemory Allocate Command List */ |
106 void (*load)(Scheduler *,int); | 63 void (*load)(Scheduler *,int); |
107 void (*wait)(Scheduler *,int); | 64 void (*wait)(Scheduler *,int); |
108 } TaskObject, *TaskObjectPtr; | 65 } TaskObject, *TaskObjectPtr; |
109 | 66 |
110 DmaManager* connector; | 67 DmaManager* connector; |
68 TaskManagerImpl* manager; | |
111 | 69 |
112 // Pipeline Stage | 70 // Pipeline Stage |
113 SchedTaskBase* task1; | 71 SchedTaskBase* task1; |
114 SchedTaskBase* task2; | 72 SchedTaskBase* task2; |
115 SchedTaskBase* task3; | 73 SchedTaskBase* task3; |
119 void run(); | 77 void run(); |
120 virtual void init_impl() {}; | 78 virtual void init_impl() {}; |
121 void finish(); | 79 void finish(); |
122 | 80 |
123 TaskListPtr get_curListBuf(); | 81 TaskListPtr get_curListBuf(); |
124 // ListDataPtr get_curReadBuf(); | |
125 // ListDataPtr get_curWriteBuf(); | |
126 TaskListPtr get_renewListBuf(); | 82 TaskListPtr get_renewListBuf(); |
127 | 83 |
128 void set_backupTaskList(TaskListPtr cur_taskList); | 84 void set_backupTaskList(TaskListPtr cur_taskList); |
129 void set_backupTaskListIndex(int cur_index); | 85 void set_backupTaskListIndex(int cur_index); |
130 SchedTaskList* get_nextRenewTaskList(); | 86 SchedTaskList* get_nextRenewTaskList(); |
131 TaskListPtr get_backupTaskList(); | 87 TaskListPtr get_backupTaskList(); |
132 int get_backupTaskListIndex(); | 88 int get_backupTaskListIndex(); |
133 | 89 |
134 // なんか名前が変だが。。。 | |
135 /* TaskGroup */ | |
136 TaskGroupPtr set_groupTask(uint32 command); | |
137 void add_groupTask(TaskGroupPtr group, TaskPtr task); | |
138 void remove_groupTask(TaskGroupPtr group, TaskPtr task); | |
139 void reload_groupTask(); | |
140 uint32 status_groupTask(TaskGroupPtr group); | |
141 | 90 |
142 /* GlobalMemory */ | 91 /* GlobalMemory */ |
143 void* global_alloc(int id, int size); | 92 void* global_alloc(int id, int size); |
144 void* global_get(int id); | 93 void* global_get(int id); |
145 void global_set(int id, void *addr); | 94 void global_set(int id, void *addr); |
168 void show_dma_wait(int id) { connector->show_dma_wait(id); }; | 117 void show_dma_wait(int id) { connector->show_dma_wait(id); }; |
169 void mail_write(uint32 data); | 118 void mail_write(uint32 data); |
170 uint32 mail_read(); | 119 uint32 mail_read(); |
171 void dma_loadList(ListDataPtr list, void *, uint32 mask); | 120 void dma_loadList(ListDataPtr list, void *, uint32 mask); |
172 void dma_storeList(ListDataPtr list, void *, uint32 mask); | 121 void dma_storeList(ListDataPtr list, void *, uint32 mask); |
122 | |
123 /* manager */ | |
124 | |
125 void set_manager(TaskManagerImpl *m) { manager = m; } | |
126 | |
127 // user | |
128 HTaskPtr create_task(int cmd) { return manager->create_task(cmd); } | |
129 void set_task_depend(HTaskPtr master, HTaskPtr slave) { | |
130 manager->set_task_depend(master, slave) ; | |
131 } | |
132 void spawn_task(HTaskPtr t) { manager->spawn_task(t); } | |
133 void set_task_cpu(HTaskPtr t, CPU_TYPE cpu) { manager->set_task_cpu(t,cpu); } | |
134 void* allocate(int size,int align) { return manager->allocate(size,align); } | |
135 int get_random() { return random(); } | |
136 Scheduler *get_scheduler() { return this; } | |
137 | |
138 | |
173 }; | 139 }; |
174 | 140 |
175 extern void register_task(int cmd, TaskObjectRun run); | 141 extern void register_task(int cmd, TaskObjectRun run); |
176 extern void register_dynamic_task(int cmd, | 142 extern void register_dynamic_task(int cmd, |
177 memaddr start, int size, TaskObjectRun run, | 143 memaddr start, int size, TaskObjectRun run, |