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
|
|
28 #ifndef INCLUDED_TASK_GROUP
|
|
29 # include "TaskGroup.h"
|
|
30 #endif
|
|
31
|
|
32 #define MAX_USER_TASK 32
|
|
33 #define MAX_SYSTEM_TASK 2
|
|
34 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK
|
|
35 #define MAX_GLOBAL_AREA 32
|
|
36 #define MAX_MAINMEM_AREA 32
|
|
37
|
42
|
38 class SchedTaskBase;
|
109
|
39 class SchedTask;
|
42
|
40
|
|
41 class Scheduler {
|
|
42 public:
|
109
|
43 virtual ~Scheduler(void);
|
|
44
|
|
45 BASE_NEW_DELETE(Scheduler);
|
42
|
46
|
|
47 /* variables */
|
109
|
48
|
|
49 // double buffering
|
|
50 TaskListPtr buff_taskList[2];
|
|
51 ListDataPtr buff_inListData[2];
|
|
52 ListDataPtr buff_outListData[2];
|
|
53
|
|
54 int buffFlag_taskList;
|
|
55 int buffFlag_inListData;
|
|
56 int buffFlag_outListData;
|
|
57
|
|
58 /* TaskList 関連 */
|
|
59
|
|
60 /**
|
|
61 * 実行中 TaskList の現在の位置 (list->tasks[index])
|
|
62 */
|
|
63 int curIndex_taskList;
|
|
64
|
|
65 /**
|
|
66 * タスク内で生成されたタスクを入れる
|
|
67 * Linked List で管理
|
|
68 */
|
|
69 TaskListPtr renewCur_taskList;
|
|
70 TaskListPtr renewTop_taskList;
|
|
71
|
|
72 /**
|
|
73 * 実行中 TaskList が Renew されたものかどうかのフラグ
|
|
74 * Renew の場合、ListData は DMA する必要ないとか
|
|
75 * いろいろな判定に使えるかもしれん
|
|
76 * if (flag == 1) taskList is Renew
|
|
77 */
|
|
78 int flag_renewTaskList;
|
|
79
|
|
80 /**
|
|
81 * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、
|
|
82 * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。
|
|
83 * なので、Tc を process group として記憶しておく。
|
|
84 *
|
|
85 * Tc が taskGroup のアドレスを持つので
|
|
86 * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk
|
|
87 */
|
|
88 TaskGroupPtr taskGroup;
|
|
89
|
|
90 /* GlobalMemoryList */
|
|
91 void* globalList[MAX_GLOBAL_AREA];
|
|
92
|
|
93 /* MainMemory Allocate Command List */
|
|
94 void* mainMemList[MAX_MAINMEM_AREA];
|
|
95
|
|
96 // Task Object Table
|
|
97 typedef SchedTask* (*TaskObject)(TaskListPtr, TaskPtr, ListDataPtr,
|
|
98 ListDataPtr, Scheduler*);
|
42
|
99
|
|
100 DmaManager* connector;
|
109
|
101
|
|
102 // Pipeline Stage
|
42
|
103 SchedTaskBase* task1;
|
|
104 SchedTaskBase* task2;
|
|
105 SchedTaskBase* task3;
|
|
106
|
|
107 /* functions */
|
|
108 void init(void);
|
|
109 void run(void);
|
109
|
110 virtual void init_impl(void) {};
|
50
|
111 void finish(void);
|
42
|
112
|
|
113 TaskListPtr get_curListBuf(void);
|
109
|
114 ListDataPtr get_curReadBuf(void);
|
|
115 ListDataPtr get_curWriteBuf(void);
|
|
116 TaskListPtr get_renewListBuf(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 mail_write(uint32 data);
|
|
142 uint32 mail_read(void);
|
|
143 void dma_loadList(ListDataPtr list, void *, uint32 mask);
|
|
144 void dma_storeList(ListDataPtr list, void *, uint32 mask);
|
42
|
145 };
|
|
146
|
|
147 #endif
|
109
|
148
|
|
149 extern void register_task(int cmd, Scheduler::TaskObject task);
|
|
150
|
|
151 #define SchedConstructor(str) \
|
|
152 str(TaskListPtr _tlist, TaskPtr _task, \
|
|
153 ListDataPtr _rbuf, ListDataPtr _wbuf, Scheduler* _con) \
|
|
154 :SchedTask(_tlist, _task, _rbuf, _wbuf, _con) {} \
|
|
155 \
|
|
156 BASE_NEW_DELETE(str) \
|
|
157
|
|
158 #define SchedDefineTask(str) \
|
|
159 SchedTask* createTask_##str(TaskListPtr list, TaskPtr task, \
|
|
160 ListDataPtr rbuf, ListDataPtr wbuf, \
|
|
161 Scheduler *sched) \
|
|
162 { \
|
|
163 return new str(list, task, rbuf, wbuf, sched); \
|
|
164 }
|
|
165
|
|
166 #define SchedExternTask(str) \
|
|
167 extern \
|
|
168 SchedTask* createTask_##str(TaskListPtr list, TaskPtr task, \
|
|
169 ListDataPtr, ListDataPtr, Scheduler*);
|
|
170
|
|
171 #define SchedRegisterTask(cmd, str) \
|
|
172 register_task(cmd, createTask_##str);
|