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