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