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