2011-08-09 8 views
1

Linux上でAdaに簡単なC++ツールを移植することでAdaを学習しようとしています。Ada IO Multiplexing on Linux

今、私は、モデムコマンドを送信し、選択された呼び出しを使用して、信号処理されたファイル記述子を待つ単純なシリアルコミュニケーションプログラムを作成しようとしています。

私は選択呼び出しを含むパッケージを見つけることができない - 私はいくつかのプラットフォーム固有のパッケージをここで探す必要がありますか?私はどこでこれを見つけるだろうか?私はここでも正しいものを探していますか?

+0

答えは、あなたが話そうとしているシリアル通信インターフェイスの性質によって決まると思います。 TCP/IPソケットの場合、GNAT.Socketsは必要なものを提供します(コンパイラ固有のものですが)。私たちがシリアルポートの性質を知るまでは、シグナルが記録されたファイル記述子に何が必要かを言うのは難しいです。 –

+0

私はちょうどモデムコマンドを送信して、そのファイル記述子での応答を待ちます。しかし、T.E.D.以下に言及してください。これをやめてタスキングを検討するほうが良いかもしれません。私はそれを "Ada"のやり方でしたいと思っていますが、どこを見なければならないのか分かりませんでした。 – zeroc8

答えて

1

select()は、Unix特有のOSコールであり、したがって、Adaの標準ライブラリの一部ではありません。

Unixシステムコールインターフェイスを提供する(標準ではない)パッケージを見つけるか、インターフェイスプラグマを使用して自分でラップするか、別の方法をとる必要があります。

私はUnixシステムを手に入れていないので、最初の選択肢として少しだけ助けることができます。 Posixのパッケージになるはずです。私はあなたがそのようなpackage (Florist) for Gnat hereを見つけることができると信じています。私はその品質について話すことができません。

独自のバインディングを作成するには、これに付属の施設をAppendix B of the LRMでチェックしてください。これは高度なトピックですが、あなたのOSがサブルーチンリンケージをどのようにしているのか、あるいは学習する準備ができていないかを知っていない限り試行してはなりません。

「別のアプローチ」では、Adaのタスクや保護されたオブジェクト(C++のprotectedキーワードと混同しないでください)について使用しているリファレンスガイドを調べてください。たとえば、シリアルポートから受信データを読み取るタスクが1つのタスクを持つことができます。ランデブーを使用して読み取り間で同期をとることも、保護されたオブジェクトを介して実装されたキューを使って実際にセクシーにすることもできます。

+0

ありがとう、私はその2番目のアプローチを見てみましょう、より多くのAda'ishようです。 – zeroc8

+0

低レベルのOSインターフェイスを使ってタスクを実行すると、Adaのような醜いコードがたくさん残ってしまうことになります。私はどのように低レベルの花屋であるか分かりません。 OTOH、Adaは低レベルのシステムプログラミング言語として使用できます。 –

+0

この[Q&A](http://stackoverflow.com/questions/6928285/how-to-bind-to-opencv-for-gnat)も参照してください。 – trashgod