comparison TaskManager/kernel/schedule/Scheduler.h @ 0:04e28d8d3c6f

first commit
author Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
date Mon, 08 Nov 2010 01:23:25 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:04e28d8d3c6f
1 #ifndef INCLUDED_SCHEDULER
2 #define INCLUDED_SCHEDULER
3
4 #include <stdlib.h>
5 #include <stdarg.h>
6 #include "base.h"
7 #include "TaskList.h"
8 #include "ListData.h"
9 #include "DmaManager.h"
10 #include "SchedTaskBase.h"
11 #include "MemList.h"
12 #include "MemHash.h"
13
14
15 #define MAX_USER_TASK 32
16 #define MAX_SYSTEM_TASK 2
17 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK
18 #define MAX_GLOBAL_AREA 32
19 #define MAX_MAINMEM_AREA 32
20
21 class SchedTaskBase;
22 class SchedTask;
23 class SchedTaskList;
24 class TaskManagerImpl;
25 class HTask;
26
27 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w);
28
29 // Task Object Table
30 // this is named TaskObjectRun but it is not an object.
31 // It is a pointer to an object creation function
32 // 大きいので、SPEには置かない方が本当は良い...
33 // get_segment で取って来るのが、おそらくは正しい。
34 typedef struct task_object {
35 TaskObjectRun run;
36 memaddr location; // location address in a.out
37 memaddr end;
38 uint32 entry_offset; // offset for create();
39 MemorySegment *segment;
40 void (*load)(Scheduler *,int);
41 void (*wait)(Scheduler *,int);
42 } __attribute__ ((aligned (DEFAULT_ALIGNMENT)))
43 TaskObject, *TaskObjectPtr;
44
45 extern "C" {
46 extern long random();
47 }
48
49 class Scheduler {
50 private:
51 TaskManagerImpl* manager_tmp;
52
53 public:
54 virtual ~Scheduler();
55 BASE_NEW_DELETE(Scheduler);
56
57 /* variables */
58 int id;
59 MemHash *hash;
60
61 // double buffering
62 TaskListPtr buff_taskList[2];
63
64 int buffFlag_taskList;
65
66 /* GlobalMemoryList */
67 /* global among Tasks in the same CPU */
68 void* globalList[MAX_GLOBAL_AREA];
69
70 /* MainMemory Allocate Command List */
71 memaddr mainMemList[MAX_MAINMEM_AREA];
72
73 /* Code Area */
74 MemList *code_segment_pool;
75
76 DmaManager* connector;
77 TaskManagerImpl* manager;
78
79
80 /* functions */
81 void init(TaskManagerImpl *m);
82 void run(SchedTaskBase* task1);
83
84 virtual void init_impl() {};
85 void finish();
86
87 TaskListPtr get_curListBuf();
88 TaskListPtr get_renewListBuf();
89
90 void set_backupTaskList(TaskListPtr cur_taskList);
91 void set_backupTaskListIndex(int cur_index);
92 SchedTaskList* get_nextRenewTaskList();
93 TaskListPtr get_backupTaskList();
94 int get_backupTaskListIndex();
95
96
97 /* GlobalMemory */
98 void* global_alloc(int id, int size);
99 void* global_get(int id);
100 void global_set(int id, void *addr);
101 void global_free(int id);
102 //MemList* createMemList(int size, int count);
103 MemList* createMemList(int size, int count);
104 void free_(void *p) { free(p); }
105
106 virtual void mainMem_alloc(int id, int size) {};
107 virtual void mainMem_wait() {};
108 memaddr mainMem_get(int id);
109
110 MemorySegment * get_segment(memaddr addr, MemList *m);
111 MemorySegment * get_segment(memaddr addr, MemList *m, int size);
112 void allocate_code_segment(int size, int count,struct tbl *table);
113
114 virtual uint32 get_tag();
115 void put_segment(MemorySegment *s);
116 void wait_segment(MemorySegment *s);
117
118 /* DMA Transfer */
119 void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask);
120 void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask);
121 void dma_wait(uint32 mask);
122 void dma_wait(uint32 mask, int cmd);
123 void show_dma_wait() { connector->show_dma_wait(this, id); };
124 void start_profile() { connector->start_profile(); };
125 void mail_write(memaddr data);
126 memaddr mail_read();
127 void dma_loadList(ListDataPtr list, void *, uint32 mask);
128 void dma_storeList(ListDataPtr list, void *, uint32 mask);
129
130 /* manager */
131
132 void set_manager(TaskManagerImpl *m) {
133 manager = m;
134 };
135
136 /* user */
137
138 long get_random() ;
139 Scheduler *get_scheduler() { return this; };
140 int printf(const char *format, ...);
141 int vprintf0(const char *format, va_list ap);
142
143 } ;
144
145 extern void register_task(int cmd, TaskObjectRun run);
146 extern void register_dynamic_task(int cmd,
147 memaddr start, int size, TaskObjectRun run,
148 int entry_offset);
149
150 struct tbl {
151 unsigned int vma;
152 unsigned int size;
153 unsigned int file_offset;
154 unsigned int buf;
155 };
156
157 extern TaskObject task_list[MAX_TASK_OBJECT];
158
159 inline void
160 loadSchedTask(Scheduler *scheduler,int command)
161 {
162 task_list[command].load(scheduler,command);
163 }
164
165 #endif
166
167
168
169 #define SchedConstructor(str) \
170 str() {} \
171 BASE_NEW_DELETE(str) \
172
173 #define SchedDefineTask(str) SchedDefineTask1(str,run) \
174
175 #define SchedDefineTask1(str,run) \
176 static int run(SchedTask *smanager, void *rbuf, void *wbuf); \
177 extern "C" { \
178 int runTask_##str(SchedTask *smanager, void *rbuf, void *wbuf) \
179 { \
180 return run(smanager, rbuf, wbuf); \
181 } \
182 }
183
184 #define SchedExternTask(str) \
185 extern "C" { \
186 extern int runTask_##str(SchedTask *manager, void *rbuf, void *wbuf) ; \
187 }
188
189 #define SchedRegisterTask(cmd, str) \
190 register_task(cmd, runTask_##str);
191
192 #define SchedRegister(str) \
193 register_task(str, runTask_##str);
194
195 #define SchedDefineDynamicTask(str,segment) \
196 SchedDefineTask(str)
197
198 #ifndef NO_OVERLAY
199 #define SchedExternDynamicTask(str,segment) \
200 extern "C" { \
201 extern unsigned long long _EAR_; \
202 extern struct tbl _ovly_table[]; \
203 extern int runTask_##str(SchedTask *manager, void *rbuf, void *wbuf) ; \
204 }
205 #else
206 #define SchedExternDynamicTask(str,segment) SchedExternTask(str)
207 #endif
208
209
210 #ifndef NO_OVERLAY
211 #define SchedRegisterDynamicTask(cmd, str, segment) \
212 register_dynamic_task(cmd, (memaddr)(_EAR_+_ovly_table[segment].file_offset), \
213 _ovly_table[segment].size, \
214 runTask_##str, \
215 runTask_##str##_offset);
216 #define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment)
217 #else
218 #define SchedRegisterDynamicTask(cmd, str, segment) SchedRegisterTask(cmd, str)
219 #define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment)
220 #endif
221
222
223 /* end */