4

FSMLabs による RT-Linux 用のリアルタイム コードの記述例は多数ありますが、このディストリビューションは何年も前に放棄されています。現在、vanilla カーネル用の PREEMPT_RT パッチが活発に開発されていますが、公式 Wiki にはわずかなコード例しかありません。最初に私の問題を紹介させてください。

私は2つのプログラムを含むプロジェクトを書いています:

  1. バイト コードの仮想マシン - リアルタイム アプリケーションとして動作する必要があります。64 KB の I/O メモリと 64 KB のバイト コードを備えています。
  2. クライアント プログラム - I/O メモリの読み取りと書き込み、マシンの起動/一時停止、新しいプログラムのロード、パラメーターの設定などを行います。リアルタイムである必要はありません。

これらのプロセス間で通信して、プロセス (1) をリアルタイムに保ち、リアルタイム アプリを妨害する可能性のあるページ フォールトやその他の動作を回避する方法は?

アプローチ 1. スレッドのみを使用する

2 つのスレッドがあります。

  • 優先度が最も高い仮想マシン スレッド

  • ユーザーおよびマシンと通信する、通常の優先順位のクライアント スレッド 両方のスレッドが、すべてのグローバル変数に名前でアクセスできます。各マシン サイクルの後に、受信/送信データ用に追加のバッファーを作成できます。ただし、クライアント スレッドがアプリケーション クラッシュを引き起こすと、マシン スレッドも終了します。また、リモート アクセスの実装もより困難になります。

アプローチ 2. 共有メモリ

古い FSMLabs では、プロセス間で共有グローバル メモリを使用することをお勧めします。最新の PREEMPT_RT の Wiki ページでは、プロセス データの共有に mmap() を使用することを推奨していますが、同じ記事では、ページ フォールトのために mmap() を推奨していません。

アプローチ 3. 名前付きパイプ

プロセス間で通信するためのより柔軟な方法です。ただし、Linuxでのプログラミングは初めてです。マシンとクライアントの間でメモリを共有したいのですが、新しいプログラム (ファイル パスまたはプログラム コード) をロードしたり、マシンを停止/起動したりする方法も提供する必要があります。 古い FSMLabs RT-Linux は、独自の FIFO キュー (名前付きパイプ) を実装していました。現代の PREEMPT_RT はそうではありません。名前パイプを使用すると、リアルタイムの動作が中断される可能性がありますか? 適切に行う方法は?O_NONBLOCK フラグを使用してデータを読み取るか、パイプとの間でデータを読み書きするための別のスレッドを作成する必要がありますか?

1 つのプロセスがリアルタイムでなければならないプロセス間で通信する他の方法を知っていますか? 多分私はスレッドだけが必要です。ただし、より多くのクライアントが仮想マシン プロセスに接続されているシナリオを考えてみましょう。

4

1 に答える 1

1

同じホスト オペレーティング システム上で実行されているプロセス間でデータを交換するには、UNIX ドメイン ソケットを使用することもできます。

于 2017-11-24T09:12:26.773 に答える