問題タブ [preempt-rt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1268 参照

c - リアルタイム Linux でプロセス間で通信する方法は?

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

0 投票する
2 に答える
731 参照

linux - RT-PREEMPT カーネルで BCM2835 を使用する

アンテナから 40khz 信号を送信するプロジェクトを作成しています。信号があまり正確ではないことがわかったので、リアルタイム カーネルを試すことにしました。

Raspberry-Pi 2B で Raspbian Jessie を実行しています。クリーン インストール後、スクリプトは問題なく実行されます。bcm2835_delayMicroseconds を実行できます。

このチュートリアルhttp://www.frank-durr.de/?p=203に従ってコンパイルし、RT カーネルをインストールしました。ただし、スクリプトを正常に実行できなくなりました。「HIGH SLEEP」を見せた後、持ちこたえられる。

これはコード スニペットです。

カーネルをコンパイルするときに何か見落としがありますか?

0 投票する
1 に答える
3427 参照

real-time - PREEMPT_RT を使用して RT アプリケーションを構築する

リアルタイム PREEMPT_RT を使用しながら、リアルタイム Linux プログラムを作成したいと考えています。公式 Wiki ( https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application ) を見つけました。いくつかのコード例がありますが、可能な RT 機能の説明が欲しいです。

ありがとうございました、

0 投票する
1 に答える
188 参照

c++ - 手芸システムを libcaf に移植

私は現在、手作りのアクターを使用するアプリケーションを持っています。私の計画は、libcaf に移植することです。

現在の状態は次のとおりです。システム (別名アクター) がサブスクライブしてメッセージを取得する 1 つの大きなグローバル メッセージ キューがあります。それらは、そのグローバル キューへのメッセージで応答します。

システム全体は、Linux rt-preempt カーネルで実行されるリアルタイム アプリケーションです。GUI スレッドはシステム (アクター) そのものですが、RT 優先ではありません。

現時点では、私のシステムはメッセージの受信者を知る必要はありません。

私の移植のアイデアは次のとおりです。1 つのグローバル アクターをグローバル メッセージ キューの代わりとして使用し、それがメッセージの登録を処理します。このようにして、デバッグ目的でメッセージのログを簡単に取得でき、すべてのアクターに考えられるすべてのターゲットを知らせる必要はありません。

現実世界への連絡を処理する IO システム (canbus) があります。

現在のシステムでは、GUI スレッド + システムを生成します。RT が初期化されるのを待ちます。GUI スレッドが生成された後、RT Preempt 優先順位に切り替えて、他のシステムを作成し、スタックを事前にフォールトします。すべての設定が完了したら、RT が起動していることを GUI に通知します。これでシステムが初期化されました。

致命的なことが発生したり、システムをシャットダウンする必要がある場合は、メッセージを送信すると、すべてのシステムがシャットダウンし、すべてのスレッドが参加します。

私の質問は次のとおりです。libcaf の RT スレッドから GUI アクター/スレッドを分離するにはどうすればよいですか? 別のプロセスで GUI をフォークすることをお勧めしますか? 異なる RT 優先スレッドでアクターをスポーンできますか?

編集:spawnオプションが見つかりましたdetached。スポーンされたアクター (切り離されたアクターの子) は同じスレッド上にありますか?

0 投票する
0 に答える
176 参照

linux - PREEMPT RT カーネル 3.10.103-rt114 でのハイパー スレッディングのオフ

カーネルのコンパイルに関連する問題があり、コンパイルが成功して再起動すると、HyperThreading オプションが失われます。Cent OS 7 バニラ カーネルを PREEMPT RT カーネルで更新しようとしています。

これは、カーネルを使用した最初の試行または実験です。

デフォルトのカーネルのバージョンは次のとおりです:- 3.10.0-123.el7.x86_64 で置き換えます:- 3.10.103-rt114

下のデフォルト カーネルの画像では、i7z ツールを使用して HT が有効になっていることがわかります。lscpu は、ノード 2 とコア = 16 を示しています。

デフォルトのカーネル

しかし、RT カーネル HT では lscpu はオフで、ノード 1 とコア 8 が表示されます。

RT カーネル

助けてください RT を HT で実行したいのですが、もう 1 つ助けが必要です。RTカーネルを何度もコンパイルしたため、「古い」として多くのemtriesがあります。これらも削除するのを手伝ってください。

0 投票する
0 に答える
1063 参照

c - Linux カーネルがリアルタイムかどうかを確認する

rt パッチを使用して Linux カーネル 4.6 をインストールしました。 uname -a の後に rt と PREEMPT が表示されますが、アプリケーションを作成して証明する必要があるため、以下のようなアイデアが浮かびました。5 ミリ秒間スリープさせて、起動してハードウェア時間をチェックし、配列に格納して、ハードウェア時間の差を確認した後、50 回ほど実行します。そのため、正しい方法とそれを実装するためのヒントを知る必要があります。事前に感謝します。

これは私のコードです /* "gcc -o swave swave.c -lrt -Wall" を使用してコンパイルします */

0 投票する
0 に答える
470 参照

linux-kernel - IoT アプリケーション用の preempt-rt と non-preempt-rt Linux カーネルのどちらを選択するか?

私は IoT プロジェクトに取り組んでおり、そのプロジェクトについて、linux kernel 4.8 preempt-rtまたは のどちらかを決定する必要がありnon-preempt-rtます。Linux RT ベンチマーク テストをすばやく実行します。

cd /usr/lib/rt-tests/ptest/rt_bmark.py

これは本質的に実行されます

cyclictest -S -p 99 -q -i 100 -d 20 -l 30000

次の結果につながりました。

  1. の場合preempt-rt:

6:12:51: Cyclictest completed. Actual execution time:0:01:38 Min: 3 us Avg: 6.0 us Max: 61 us Max list: [12, 13, 15, 22, 22, 61] PASS

  1. の場合non-preempt-rt:

5:56:42: Cyclictest completed. Actual execution time:0:01:38 Min: 3 us Avg: 5.0 us Max: 2025 us Max list: [11, 16, 22, 46, 207, 2025] PASS

prempt-rt2 つの間の最大遅延に圧倒的な違いがあるため、結果は明らかにカーネルを使用するように誘惑しました。

これが 2 つのどちらかを決定するのに十分なベンチマーク基準であるかどうかを知りたいですか? 前もって感謝します!