comparison TaskManager/kernel/schedule/Scheduler.h @ 366:09f33c51a204

rename include/TaskManager/* and add memory
author aaa
date Mon, 27 Jul 2009 15:51:18 +0900
parents include/TaskManager/Scheduler.h@b89ba1d96fff
children eab18aa0c7f6
comparison
equal deleted inserted replaced
365:f8769040a5df 366:09f33c51a204
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);