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