view example/README @ 638:671fca057ad3

hmmmm
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Nov 2009 18:18:20 +0900
parents 60a4449d6575
children
line wrap: on
line source

/**
 * 現在開発中なので、仕様やここに書いてる事も
 * すごい頻度で変わる可能性があります。
 * なので、定期的に 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.h> とか
やってますが、そのせいで、ユーザ側でも 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. 最後に
-------------------
「もう書く事ねーのかよ」って意見もあるかもしれない。すまん。
一番上にあるように、まだまだ開発の初期っつーかなんつーか、なので
これからどんどん追加していきますので。