109
|
1 /**
|
|
2 * 現在開発中なので、仕様やここに書いてる事も
|
|
3 * すごい頻度で変わる可能性があります。
|
|
4 * なので、定期的に cvs update をしたり
|
|
5 * Game_project/Cerium/TaskManager/Changelog を見たり
|
|
6 * http://www.cr.ie.u-ryukyu.ac.jp/~game/pukiwiki/ を見てください。
|
|
7 */
|
|
8
|
|
9 Cerium の例題っぽいのを置いてあります。
|
|
10 ここにある書き方を参考に他にいろいろ作ってみてください。
|
|
11
|
|
12 例題の概要は、各ディレクトリの README に書いてあります。
|
|
13 使用方法や実行例も同じです。
|
|
14
|
|
15 -----------------
|
|
16 最近の更新
|
|
17 -----------------
|
|
18
|
115
|
19 2008/11/13
|
|
20
|
|
21 Makefile.macosx において、
|
|
22 `sdl-config --libs` を追加してあります。
|
|
23 例題の中で SDL を使うことはなくても書かれているのは、
|
|
24 ライブラリ側に main() を置いたためです。
|
|
25
|
|
26 http://d.hatena.ne.jp/hiratara/20080719/1216481600
|
|
27
|
|
28 上を見てもらえばわかると思いますが、
|
|
29 SDL では、ユーザが描いた main を SDL_main に置き換え、
|
|
30 libSDL の中の main() を起動時のエントリに使ってます。
|
|
31 なので、TaskManager/kernel/main.cc では #include <SDL.h> とか
|
|
32 やってますが、そのせいで、ユーザ側でも sdl-config --libs をしないと
|
|
33 「main() がないぞ」ってなリンカエラーが出るわけです。
|
|
34 これは、MacOSX だけの問題で、Linux や PS3 上では問題ないので
|
|
35 Makefile.macosx だけに記述しています。
|
|
36
|
|
37 なので、MacOSX 上で例題を動かす場合、一瞬 SDL のウインドウが
|
|
38 起動する系の動作をすると思いますが、無視してください。それ以外は動きますので。
|
|
39
|
|
40 いずれはちゃんと切り分けたいところですが、今のところこんな感じで。
|
|
41
|
|
42
|
|
43
|
109
|
44 2008/11/01
|
|
45
|
|
46 main 関数はライブラリに閉じました。
|
|
47 というわけで、ユーザ側の main() は
|
|
48
|
|
49 int cerium_main(int argc, char *argv[]);
|
|
50
|
|
51 となります。引数は通常の main と同じものが渡されます
|
|
52 cerium_main で ( < 0 ) を返す (例えば -1) と
|
|
53 プログラムが終了するようにしています。
|
|
54 cerium_main を正常に抜けると、ライブラリ側で
|
|
55 main loop が回り、全タスク終了と共にプログラムが終了します。
|
|
56
|
|
57 あと、Cerium の標準オプションとして
|
|
58
|
|
59 -chelp Print this message
|
|
60 -cpu Number of CPU (default 1)
|
|
61
|
|
62 を実装しました。近々増やしていく予定です。
|
|
63
|
|
64 TaskManager へのアクセスですが、今までは
|
|
65
|
|
66 TaskManager *manager = new TaskManager(CPU_NUM);
|
|
67
|
|
68 とかやってたはずですが、現在はライブラリ側で生成しているので、
|
|
69 TaskManager.h を include すると、中で
|
|
70
|
|
71 extern TaskManager *manager;
|
|
72
|
|
73 とかしてるので、そのまま manager->create_task とかして使えます。
|
|
74
|
|
75
|
|
76
|
|
77 -----------------
|
|
78 修正場所
|
|
79 -----------------
|
|
80
|
|
81 今のところ、configure とかそういうのは無いので、
|
|
82 ライブラリのパスは手動で書き直さないといけないです。
|
|
83 各例題の Makefile.def ってところに、
|
|
84
|
|
85 TARGET = 例題の実行ファイル名
|
|
86 CERIUM = Cerium のパス
|
|
87
|
|
88 を書くところがあるので、自分の環境にあう感じで書いてください。
|
|
89
|
|
90 -----------------
|
|
91 コンパイル方法
|
|
92 -----------------
|
|
93 MacOSX
|
|
94 % make macosx
|
|
95
|
|
96 Linux
|
|
97 % make linux
|
|
98
|
|
99 PS3 (spe/ 以下もコンパイルされます)
|
|
100 % make ps3
|
|
101
|
|
102
|
|
103 clean するときは普通に
|
|
104
|
|
105 % make clean でいいです。
|
|
106
|
|
107
|
|
108
|
|
109 --------------------
|
|
110 プログラムの書き方
|
|
111 --------------------
|
|
112
|
|
113 まだちゃんと仕様書みたいなものをは書いてないので、
|
|
114 ここで記述必須の所を書いておきます。
|
|
115
|
|
116 1. タスクの作り方
|
|
117 2. タスクの登録 (ID との対応付け)
|
|
118 3. 最後に
|
|
119
|
|
120 -------------------
|
|
121 1. タスクの作り方
|
|
122 -------------------
|
|
123
|
|
124 タスクは、一つのクラスとして扱います。
|
|
125 クラスの宣言 (.h) はこんな感じです。
|
|
126
|
|
127 ++++++++++++++++++++++++++++++++++
|
|
128 #ifndef INCLUDED_SCHED_TASK
|
|
129 # include "SchedTask.h"
|
|
130 #endif
|
|
131
|
|
132 class Hello : public SchedTask {
|
|
133 public:
|
|
134 SchedConstructor(Hello);
|
|
135
|
|
136 int run(void *r, void *w);
|
|
137 };
|
|
138 ++++++++++++++++++++++++++++++++++
|
|
139
|
|
140 以上の記述は必須です。
|
|
141 クラス名と、SchedConstructor() の中身は一緒にしてください。
|
|
142 run() がこのクラスの Task としての実装となります。
|
|
143 クラス変数、関数を加えるのはOKです。
|
|
144
|
|
145
|
|
146 次に実装 (.cc) です。
|
|
147
|
|
148 ++++++++++++++++++++++++++++++++++
|
|
149 #include "Hello.h"
|
|
150
|
|
151 /* これは必須 */
|
|
152 SchedDefineTask(Hello);
|
|
153
|
|
154 int
|
|
155 Hello::run(void *rbuf, void *wbuf)
|
|
156 {
|
|
157 printf("Hello, World!!\n");
|
|
158
|
|
159 return 0;
|
|
160 }
|
|
161 ++++++++++++++++++++++++++++++++++
|
|
162
|
|
163 SchedDefineTask にもクラス名を入れてください。
|
|
164 rbuf, wbuf とかの使い方は 各例題を見ればわかります(basic とか)。
|
|
165
|
|
166
|
|
167
|
|
168 -------------------
|
|
169 2 タスクの登録
|
|
170 -------------------
|
|
171
|
|
172 タスクは ID で管理するようにしています。
|
|
173 ppe で動くタスクは ppe/ 以下の task_init.cc で書きます。
|
|
174
|
|
175 ++++++++++++++++++++++++
|
|
176 #include "Func.h"
|
|
177 #include "Scheduler.h"
|
|
178
|
|
179 /* 必ずこの位置に書いて */
|
|
180 SchedExternTask(Hello);
|
|
181
|
|
182 void
|
|
183 task_init(void)
|
|
184 {
|
|
185 SchedRegisterTask(HELLO_TASK, Hello);
|
|
186 }
|
|
187 ++++++++++++++++++++++++
|
|
188
|
|
189 SchedExternTask と SchedRegisterTask は必須です。
|
|
190 RegisterTask では、クラス名の他に、対応する ID を入れてください。
|
|
191 ID は 整数で、現在は 0〜31 まで設定できます。
|
|
192 上の場合は、Func.h で HELLO_TASK を enum でやってます。
|
|
193
|
|
194 SPE で動かすタスクも、spe/spe-main.cc に書いてください。
|
|
195 書き方は ppe と同じです。
|
|
196
|
|
197
|
|
198 -------------------
|
|
199 3. 最後に
|
|
200 -------------------
|
|
201 「もう書く事ねーのかよ」って意見もあるかもしれない。すまん。
|
|
202 一番上にあるように、まだまだ開発の初期っつーかなんつーか、なので
|
|
203 これからどんどん追加していきますので。 |