問題タブ [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.
c - リアルタイム Linux でプロセス間で通信する方法は?
FSMLabs による RT-Linux 用のリアルタイム コードの記述例は多数ありますが、このディストリビューションは何年も前に放棄されています。現在、vanilla カーネル用の PREEMPT_RT パッチが活発に開発されていますが、公式 Wiki にはわずかなコード例しかありません。最初に私の問題を紹介させてください。
私は2つのプログラムを含むプロジェクトを書いています:
- バイト コードの仮想マシン - リアルタイム アプリケーションとして動作する必要があります。64 KB の I/O メモリと 64 KB のバイト コードを備えています。
- クライアント プログラム - I/O メモリの読み取りと書き込み、マシンの起動/一時停止、新しいプログラムのロード、パラメーターの設定などを行います。リアルタイムである必要はありません。
これらのプロセス間で通信して、プロセス (1) をリアルタイムに保ち、リアルタイム アプリを妨害する可能性のあるページ フォールトやその他の動作を回避する方法は?
アプローチ 1. スレッドのみを使用する
2 つのスレッドがあります。
優先度が最も高い仮想マシン スレッド
ユーザーおよびマシンと通信する、通常の優先順位のクライアント スレッド 両方のスレッドが、すべてのグローバル変数に名前でアクセスできます。各マシン サイクルの後に、受信/送信データ用に追加のバッファーを作成できます。ただし、クライアント スレッドがアプリケーション クラッシュを引き起こすと、マシン スレッドも終了します。また、リモート アクセスの実装もより困難になります。
アプローチ 2. 共有メモリ
古い FSMLabs では、プロセス間で共有グローバル メモリを使用することをお勧めします。最新の PREEMPT_RT の Wiki ページでは、プロセス データの共有に mmap() を使用することを推奨していますが、同じ記事では、ページ フォールトのために mmap() を推奨していません。
アプローチ 3. 名前付きパイプ
プロセス間で通信するためのより柔軟な方法です。ただし、Linuxでのプログラミングは初めてです。マシンとクライアントの間でメモリを共有したいのですが、新しいプログラム (ファイル パスまたはプログラム コード) をロードしたり、マシンを停止/起動したりする方法も提供する必要があります。 古い FSMLabs RT-Linux は、独自の FIFO キュー (名前付きパイプ) を実装していました。現代の PREEMPT_RT はそうではありません。名前パイプを使用すると、リアルタイムの動作が中断される可能性がありますか? 適切に行う方法は?O_NONBLOCK フラグを使用してデータを読み取るか、パイプとの間でデータを読み書きするための別のスレッドを作成する必要がありますか?
1 つのプロセスがリアルタイムでなければならないプロセス間で通信する他の方法を知っていますか? 多分私はスレッドだけが必要です。ただし、より多くのクライアントが仮想マシン プロセスに接続されているシナリオを考えてみましょう。
linux - RT-PREEMPT カーネルで BCM2835 を使用する
アンテナから 40khz 信号を送信するプロジェクトを作成しています。信号があまり正確ではないことがわかったので、リアルタイム カーネルを試すことにしました。
Raspberry-Pi 2B で Raspbian Jessie を実行しています。クリーン インストール後、スクリプトは問題なく実行されます。bcm2835_delayMicroseconds を実行できます。
このチュートリアルhttp://www.frank-durr.de/?p=203に従ってコンパイルし、RT カーネルをインストールしました。ただし、スクリプトを正常に実行できなくなりました。「HIGH SLEEP」を見せた後、持ちこたえられる。
これはコード スニペットです。
カーネルをコンパイルするときに何か見落としがありますか?
real-time - PREEMPT_RT を使用して RT アプリケーションを構築する
リアルタイム PREEMPT_RT を使用しながら、リアルタイム Linux プログラムを作成したいと考えています。公式 Wiki ( https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application ) を見つけました。いくつかのコード例がありますが、可能な RT 機能の説明が欲しいです。
ありがとうございました、
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
。スポーンされたアクター (切り離されたアクターの子) は同じスレッド上にありますか?
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 を HT で実行したいのですが、もう 1 つ助けが必要です。RTカーネルを何度もコンパイルしたため、「古い」として多くのemtriesがあります。これらも削除するのを手伝ってください。
c - Linux カーネルがリアルタイムかどうかを確認する
rt パッチを使用して Linux カーネル 4.6 をインストールしました。 uname -a の後に rt と PREEMPT が表示されますが、アプリケーションを作成して証明する必要があるため、以下のようなアイデアが浮かびました。5 ミリ秒間スリープさせて、起動してハードウェア時間をチェックし、配列に格納して、ハードウェア時間の差を確認した後、50 回ほど実行します。そのため、正しい方法とそれを実装するためのヒントを知る必要があります。事前に感謝します。
これは私のコードです /* "gcc -o swave swave.c -lrt -Wall" を使用してコンパイルします */
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
次の結果につながりました。
- の場合
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
- の場合
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-rt
2 つの間の最大遅延に圧倒的な違いがあるため、結果は明らかにカーネルを使用するように誘惑しました。
これが 2 つのどちらかを決定するのに十分なベンチマーク基準であるかどうかを知りたいですか? 前もって感謝します!