(toppers-users 1293) Re: フルセット版カーネルサービスコールの実装について
Takayuki WAKABAYASHI
takayuki @ ertl.jp
2003年 12月 2日 (火) 14:12:44 JST
豊橋技術科学大学の若林です.
okazaki.futoshi @ renesas.com さんは書きました:
> slp_tsk()のあるtask_sync.cを見てみましたら、slp_tsk()の直前に#ifdefがあり、
> 生成されたtask_sync.objにも含まれていないことから、この#ifdefでコンパイルで除か
> れてるようです。
(中略)
> フルセット版に入っていたドキュメントやソースコードを一通り目を通しましたが、この
> #ifdefを外す(必要なサービスコールを組み込む?)「正しい方法(手順)」のような記
> 述が見つかりませんでした。
この話題をusersでして良いのかどうかの判断がつかないのですが...
# フルセットの話題ならipa-oss,1.4の話題ならdev辺りが相当かと
既に一部公開されているTOPPERS/JSP (Windows) 1.4 prerelease β4に
付属のカーネルの場合で話をします.
JSP1.4β4の各APIは
#ifdef __slp_tsk
SYSCALL ER slp_tak() { ... }
#endif
といったようにサービスコール毎にifdefされています.
多分岡崎さんが知りたいのは,このifdefを通過させる方法
と理解しています.
まず,JSP1.4から何がどう変わっているかについてから.
JSP1.4から,これまでslp_tskやwup_tskなどの全てのAPIを
一つのオブジェクトファイルにしていたものを,
slp_tsk.o, wup_tsk.o のようにAPI毎のオブジェクトファイルを
生成するようになっています.そして,カーネルに必要な全ての
ファイルをまとめたライブラリ,libkernel.aを作成します.
ifdefに使う定義は,実際にはMakefile中に記述されています.
正確には,jsp/obj/Makefileから,jsp/kernel/Makefile.kernelという
ファイルが参照されていて,その中に定義されています.
このMakefileは,libkernel.aを作成するための定義の一部を持っています.
定義はgccのコマンドラインオプション経由で直接指定されます.
slp_tsk.o というファイルを作成するときは,
gcc -D__slp_tsk -O2 -wall -c -O slp_tsk.o task_sync.c
といったコマンドを実行します.
全てのAPIはlibkernel.aに含まれています.
APIはどこかで使用すればリンカによって引っ張られ,
勝手にリンクされます.使わなければ,リンクされません.
使用するに当たって,ユーザが特別の記述をする必要もありません.
次に,ifdefを通過させる方法です.
最初にMakefileが正しく1.4のものなのかを確認する必要がありそうです.
1.4対応のMakefileであれば,task_sync.oは生成されません.
libkernel.aが存在するか,または nm libkernel.a でslp_tskが存在するか
を確認してみてください.
存在しない場合,もう一度configureを実行し,生成されたMakefile中に
libkernel.a や Makefile.kernel といった文字列があるか確認してください.
また強制的に通過させるには,Windows(VC)依存部のapi.hのように,
全てのAPIを前のifdefを外すヘッダファイルを用意し,includeする手があります.
そのヘッダを,全てのファイルが参照するヘッダからincludeすれば
これまでと同じような結果を得ることが出来ます.
ただし,この場合Makefileは1.4対応のものを使用してはなりません.
以上,何かの参考になれば幸いです.
--------
豊橋技術科学大学 工学研究科 電子情報工学専攻
若林 隆行 (mailto:takayuki @ ertl.jp)