/** * 現在開発中なので、仕様やここに書いてる事も * すごい頻度で変わる可能性があります。 * なので、定期的に cvs update をしたり * Game_project/Cerium/TaskManager/Changelog を見たり * http://www.cr.ie.u-ryukyu.ac.jp/~game/pukiwiki/ を見てください。 */ Cerium の例題っぽいのを置いてあります。 ここにある書き方を参考に他にいろいろ作ってみてください。 例題の概要は、各ディレクトリの README に書いてあります。 使用方法や実行例も同じです。 ----------------- 最近の更新 ----------------- 2008/11/13 Makefile.macosx において、 `sdl-config --libs` を追加してあります。 例題の中で SDL を使うことはなくても書かれているのは、 ライブラリ側に main() を置いたためです。 http://d.hatena.ne.jp/hiratara/20080719/1216481600 上を見てもらえばわかると思いますが、 SDL では、ユーザが描いた main を SDL_main に置き換え、 libSDL の中の main() を起動時のエントリに使ってます。 なので、TaskManager/kernel/main.cc では #include とか やってますが、そのせいで、ユーザ側でも sdl-config --libs をしないと 「main() がないぞ」ってなリンカエラーが出るわけです。 これは、MacOSX だけの問題で、Linux や PS3 上では問題ないので Makefile.macosx だけに記述しています。 なので、MacOSX 上で例題を動かす場合、一瞬 SDL のウインドウが 起動する系の動作をすると思いますが、無視してください。それ以外は動きますので。 いずれはちゃんと切り分けたいところですが、今のところこんな感じで。 2008/11/01 main 関数はライブラリに閉じました。 というわけで、ユーザ側の main() は int cerium_main(int argc, char *argv[]); となります。引数は通常の main と同じものが渡されます cerium_main で ( < 0 ) を返す (例えば -1) と プログラムが終了するようにしています。 cerium_main を正常に抜けると、ライブラリ側で main loop が回り、全タスク終了と共にプログラムが終了します。 あと、Cerium の標準オプションとして -chelp Print this message -cpu Number of CPU (default 1) を実装しました。近々増やしていく予定です。 TaskManager へのアクセスですが、今までは TaskManager *manager = new TaskManager(CPU_NUM); とかやってたはずですが、現在はライブラリ側で生成しているので、 TaskManager.h を include すると、中で extern TaskManager *manager; とかしてるので、そのまま manager->create_task とかして使えます。 ----------------- 修正場所 ----------------- 今のところ、configure とかそういうのは無いので、 ライブラリのパスは手動で書き直さないといけないです。 各例題の Makefile.def ってところに、 TARGET = 例題の実行ファイル名 CERIUM = Cerium のパス を書くところがあるので、自分の環境にあう感じで書いてください。 ----------------- コンパイル方法 ----------------- MacOSX % make macosx Linux % make linux PS3 (spe/ 以下もコンパイルされます) % make ps3 clean するときは普通に % make clean でいいです。 -------------------- プログラムの書き方 -------------------- まだちゃんと仕様書みたいなものをは書いてないので、 ここで記述必須の所を書いておきます。 1. タスクの作り方 2. タスクの登録 (ID との対応付け) 3. 最後に ------------------- 1. タスクの作り方 ------------------- タスクは、一つのクラスとして扱います。 クラスの宣言 (.h) はこんな感じです。 ++++++++++++++++++++++++++++++++++ #ifndef INCLUDED_SCHED_TASK # include "SchedTask.h" #endif class Hello : public SchedTask { public: SchedConstructor(Hello); int run(void *r, void *w); }; ++++++++++++++++++++++++++++++++++ 以上の記述は必須です。 クラス名と、SchedConstructor() の中身は一緒にしてください。 run() がこのクラスの Task としての実装となります。 クラス変数、関数を加えるのはOKです。 次に実装 (.cc) です。 ++++++++++++++++++++++++++++++++++ #include "Hello.h" /* これは必須 */ SchedDefineTask(Hello); int Hello::run(void *rbuf, void *wbuf) { printf("Hello, World!!\n"); return 0; } ++++++++++++++++++++++++++++++++++ SchedDefineTask にもクラス名を入れてください。 rbuf, wbuf とかの使い方は 各例題を見ればわかります(basic とか)。 ------------------- 2 タスクの登録 ------------------- タスクは ID で管理するようにしています。 ppe で動くタスクは ppe/ 以下の task_init.cc で書きます。 ++++++++++++++++++++++++ #include "Func.h" #include "Scheduler.h" /* 必ずこの位置に書いて */ SchedExternTask(Hello); void task_init(void) { SchedRegisterTask(HELLO_TASK, Hello); } ++++++++++++++++++++++++ SchedExternTask と SchedRegisterTask は必須です。 RegisterTask では、クラス名の他に、対応する ID を入れてください。 ID は 整数で、現在は 0〜31 まで設定できます。 上の場合は、Func.h で HELLO_TASK を enum でやってます。 SPE で動かすタスクも、spe/spe-main.cc に書いてください。 書き方は ppe と同じです。 ------------------- 3. 最後に ------------------- 「もう書く事ねーのかよ」って意見もあるかもしれない。すまん。 一番上にあるように、まだまだ開発の初期っつーかなんつーか、なので これからどんどん追加していきますので。