comparison TaskManager/kernel/schedule/Scheduler.h @ 619:278db3ca751d draft

RenewTask removal
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 15 Nov 2009 02:02:30 +0900
parents 184d6d3f0cd9
children 64e05530e333
comparison
equal deleted inserted replaced
618:58417006268c 619:278db3ca751d
1 #ifndef INCLUDED_SCHEDULER 1 #ifndef INCLUDED_SCHEDULER
2 #define INCLUDED_SCHEDULER 2 #define INCLUDED_SCHEDULER
3 3
4 #include "stdlib.h"
4 #include "base.h" 5 #include "base.h"
5 #include "TaskList.h" 6 #include "TaskList.h"
6 #include "ListData.h" 7 #include "ListData.h"
7 #include "DmaManager.h" 8 #include "DmaManager.h"
8 #include "SchedTaskBase.h" 9 #include "SchedTaskBase.h"
9 #include "SchedTaskList.h" 10 #include "SchedTaskList.h"
10 #include "TaskGroup.h"
11 #include "MemList.h" 11 #include "MemList.h"
12 #include "MemHash.h" 12 #include "MemHash.h"
13 #include "TaskManagerImpl.h"
14
13 15
14 #define MAX_USER_TASK 32 16 #define MAX_USER_TASK 32
15 #define MAX_SYSTEM_TASK 2 17 #define MAX_SYSTEM_TASK 2
16 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK 18 #define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK
17 #define MAX_GLOBAL_AREA 32 19 #define MAX_GLOBAL_AREA 32
18 #define MAX_MAINMEM_AREA 32 20 #define MAX_MAINMEM_AREA 32
19 21
20 class SchedTaskBase; 22 class SchedTaskBase;
21 class SchedTask; 23 class SchedTask;
22 class SchedTaskList; 24 class SchedTaskList;
25 class TaskManager;
23 26
24 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w); 27 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w);
25 28
26 class Scheduler { 29 class Scheduler {
27 public: 30 public:
33 int id; 36 int id;
34 MemHash *hash; 37 MemHash *hash;
35 38
36 // double buffering 39 // double buffering
37 TaskListPtr buff_taskList[2]; 40 TaskListPtr buff_taskList[2];
38 // ListDataPtr buff_inListData[2];
39 // ListDataPtr buff_outListData[2];
40 41
41 int buffFlag_taskList; 42 int buffFlag_taskList;
42 // int buffFlag_inListData;
43 // int buffFlag_outListData;
44
45 /* TaskList 関連 */
46
47 /**
48 * 実行中 TaskList の現在の位置 (list->tasks[index])
49 *
50 * bakIndex_taskList がある理由
51 * taskList の途中で renew task が作られたとき、
52 * 即座に実行するため、TaskList -> RenewTaskList と移って処理する。
53 * RenewTaskList が終了したとき、再び TaskList に戻ってくるが
54 * Renew Task を生成した所から再スタートするため、
55 * taskList の index を覚えておく (backup)
56 * 同様に TaskList も覚えておく
57 */
58 int bakIndex_taskList;
59 TaskListPtr bak_curTaskList;
60
61
62 /**
63 * タスク内で生成されたタスクを入れる
64 * Linked List で管理
65 */
66 TaskListPtr renewCur_taskList;
67 TaskListPtr renewTop_taskList;
68
69 /**
70 * 実行中 TaskList が Renew されたものかどうかのフラグ
71 * Renew の場合、ListData は DMA する必要ないとか
72 * いろいろな判定に使えるかもしれん
73 * if (flag == 1) taskList is Renew
74 */
75 int flag_renewTaskList;
76
77 /**
78 * タスク内 (T1) でタスク (Tc = T2, T3, ..) が複数生成された場合、
79 * Tc が全て終わってから、T1 の終了コマンドを PPE に送る。
80 * なので、Tc を process group として記憶しておく。
81 *
82 * Tc が taskGroup のアドレスを持つので
83 * Scheduler が持つ taskGroup 変数は一つだけで(多分)おk
84 */
85 TaskGroupPtr taskGroup;
86 43
87 /* GlobalMemoryList */ 44 /* GlobalMemoryList */
88 void* globalList[MAX_GLOBAL_AREA]; 45 void* globalList[MAX_GLOBAL_AREA];
89 46
90 /* MainMemory Allocate Command List */ 47 /* MainMemory Allocate Command List */
106 void (*load)(Scheduler *,int); 63 void (*load)(Scheduler *,int);
107 void (*wait)(Scheduler *,int); 64 void (*wait)(Scheduler *,int);
108 } TaskObject, *TaskObjectPtr; 65 } TaskObject, *TaskObjectPtr;
109 66
110 DmaManager* connector; 67 DmaManager* connector;
68 TaskManagerImpl* manager;
111 69
112 // Pipeline Stage 70 // Pipeline Stage
113 SchedTaskBase* task1; 71 SchedTaskBase* task1;
114 SchedTaskBase* task2; 72 SchedTaskBase* task2;
115 SchedTaskBase* task3; 73 SchedTaskBase* task3;
119 void run(); 77 void run();
120 virtual void init_impl() {}; 78 virtual void init_impl() {};
121 void finish(); 79 void finish();
122 80
123 TaskListPtr get_curListBuf(); 81 TaskListPtr get_curListBuf();
124 // ListDataPtr get_curReadBuf();
125 // ListDataPtr get_curWriteBuf();
126 TaskListPtr get_renewListBuf(); 82 TaskListPtr get_renewListBuf();
127 83
128 void set_backupTaskList(TaskListPtr cur_taskList); 84 void set_backupTaskList(TaskListPtr cur_taskList);
129 void set_backupTaskListIndex(int cur_index); 85 void set_backupTaskListIndex(int cur_index);
130 SchedTaskList* get_nextRenewTaskList(); 86 SchedTaskList* get_nextRenewTaskList();
131 TaskListPtr get_backupTaskList(); 87 TaskListPtr get_backupTaskList();
132 int get_backupTaskListIndex(); 88 int get_backupTaskListIndex();
133 89
134 // なんか名前が変だが。。。
135 /* TaskGroup */
136 TaskGroupPtr set_groupTask(uint32 command);
137 void add_groupTask(TaskGroupPtr group, TaskPtr task);
138 void remove_groupTask(TaskGroupPtr group, TaskPtr task);
139 void reload_groupTask();
140 uint32 status_groupTask(TaskGroupPtr group);
141 90
142 /* GlobalMemory */ 91 /* GlobalMemory */
143 void* global_alloc(int id, int size); 92 void* global_alloc(int id, int size);
144 void* global_get(int id); 93 void* global_get(int id);
145 void global_set(int id, void *addr); 94 void global_set(int id, void *addr);
168 void show_dma_wait(int id) { connector->show_dma_wait(id); }; 117 void show_dma_wait(int id) { connector->show_dma_wait(id); };
169 void mail_write(uint32 data); 118 void mail_write(uint32 data);
170 uint32 mail_read(); 119 uint32 mail_read();
171 void dma_loadList(ListDataPtr list, void *, uint32 mask); 120 void dma_loadList(ListDataPtr list, void *, uint32 mask);
172 void dma_storeList(ListDataPtr list, void *, uint32 mask); 121 void dma_storeList(ListDataPtr list, void *, uint32 mask);
122
123 /* manager */
124
125 void set_manager(TaskManagerImpl *m) { manager = m; }
126
127 // user
128 HTaskPtr create_task(int cmd) { return manager->create_task(cmd); }
129 void set_task_depend(HTaskPtr master, HTaskPtr slave) {
130 manager->set_task_depend(master, slave) ;
131 }
132 void spawn_task(HTaskPtr t) { manager->spawn_task(t); }
133 void set_task_cpu(HTaskPtr t, CPU_TYPE cpu) { manager->set_task_cpu(t,cpu); }
134 void* allocate(int size,int align) { return manager->allocate(size,align); }
135 int get_random() { return random(); }
136 Scheduler *get_scheduler() { return this; }
137
138
173 }; 139 };
174 140
175 extern void register_task(int cmd, TaskObjectRun run); 141 extern void register_task(int cmd, TaskObjectRun run);
176 extern void register_dynamic_task(int cmd, 142 extern void register_dynamic_task(int cmd,
177 memaddr start, int size, TaskObjectRun run, 143 memaddr start, int size, TaskObjectRun run,