前回の記事
mcommit.hatenadiary.com
ではどういった言語や開発環境でVxWorksのアプリケーションを開発するのかについて触れましたが、今回はVxWorksのC/C++言語プログラミングに関して、ライブラリや移植性といった点でまとめてみたいと思います。
利用できるライブラリについて
VxWorksのライブラリは機能毎に50近いライブラリが提供されています。
VxWorksが提供するライブラリはxxLibのようにUnix系OSではあまり聞きなれない名前がついています。しかし利用するに当たって必要なのはヘッダファイルを適切にインクルードするだけでAPIを呼び出すことができます。gccの -lxxx のようにライブラリを明示的にリンクする必要はありません。
ライブラリ関数について
各ライブラリではC言語の関数として多くのAPIが提供されています。VxWorksではANSI C言語標準ライブラリて規定されている関数群はサポートされています。具体的には
- printf,fopen,fclose,fprintfなど標準出力やファイル操作に関する関数
- time,localtime,sleepといった時刻やタイマーに関わる関数
- malloc,freeといったメモリ操作に関わる関数
などはVxWorksで利用できる関数です。
スレッドの扱い
VxWorksではpthreadLibという文字通りpthreadを扱うためのAPIが提供されています。
pthread_create,pthread_cond_waitといったpthreadを利用するためのAPIが利用できます。
従ってpthredを使っているプログラミングであればそのままVxWorksでも動かすことが可能です。
ネットワークについて
ネットワークについてはどうでしょうか。
ターゲットがインターフェースを実装していることが前提ですが、TCP,UDPを扱ういわゆるソケットプログラミングはUnix系OSと同様に可能です。
サーバとしての機能を実装する場合はlisten,bind,acceptといった関数が利用できますし、クライアント側を実装する場合はconnect,sento,send,recvといった関数が利用できます。
ネットワークプログラミングはLinuxで書いたコードがほぼそのまま流用できるといってよいでしょう。
移植性について
ANSI Cとの互換性やPOSIXへの準拠を踏まえると、UnixやLinux向けに書かれたプログラムをVxWorksに移植するのは比較的容易でした。Linuxからの移植ですと一部ライブラリ関数のオプションなどで違いがあり若干の手直しは必要になりますが、概ね流用できると考えてよいでしょう。
移植に関する注意点
移植性が高いといってもUnix,Linuxのプログラムが何もしなくても100%流用できるかというと実はそうではありません。
移植に当たって変更が必要になるであろうポイントや、注意すべきポイントを挙げておきます。
ヘッダファイルのインクルード
VxWorksとUnix系OSのプログラムは関数レベルでは高い互換性がありますが、実はヘッダファイル名やヘッダファイルのパスが微妙に異なっていることがあります。移植時はコンパイルエラーが発生するのでAPIのリファレンスを参考にインクルードするファイル名をコツコツと変更していく作業が発生するでしょう。とはいってもファイル名ですのでエディタの一括置換や変換のためのスクリプト等を書くことでそれほど時間をかけずに対応できると考えられます。
モジュールの形式
VxWorksでは、実行モジュールは大きく「カーネルモジュール」と「Real Time Process(RTP)」の2つが存在します。
モジュールのタイプについて前回の記事を参照してください。