問題タブ [rtai]
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.
linux - 関数の呼び出しスレッドが既に RTAI リアルタイムであるかどうかをどのように検出しますか?
カーネル空間とユーザー空間の両方で RTAI を使用する大きなプロジェクトに取り組んでいます。プロジェクトの詳細には触れませんが、問題が発生する場所を簡単に説明します。
ユーザー空間では、私のプロジェクトは、他の人がソフトウェアを作成するために使用するライブラリを提供します。これらのプログラム自体が RTAI リアルタイム スレッドを持っている場合があります。
現在、RTAI の一部の関数では、呼び出しスレッドが既にrt_thread_init
ed である必要があるため、ライブラリ内の関数でそれらを使用する場合は、呼び出しスレッドを一時的にリアルタイムにする必要がありrt_thread_init
ますrt_task_delete
。
ここに問題があります:
私の関数の呼び出しスレッドがすでにリアルタイムでrt_thread_init
ある場合、私は単純に失敗すると想定していますが、rt_task_delete
そのスレッドを非リアルタイムにします (スレッド自体が (何も変更されていないと仮定して)再びrt_task_delete
、RTAI がクラッシュします。
関数の呼び出しスレッドがリアルタイムでない場合、すべて問題ありません。
今のところ、呼び出し元の関数がリアルタイムかどうかをライブラリに通知できるように、関数内でパラメーターを取得することにしました。ただし、現在のスレッドがリアルタイムであるかどうかを自動的に検出するために使用できる関数または何かがあるかどうかを知りたかったのです。
ここに RTAI ユーザーがいるかどうかはわかりませんが (確かに RTAI タグは見ていません)、いることを願っています。
c++ - 殺されたスレッドに参加する必要がありますか?
ある時点ですべてを停止する必要がある結合可能なスレッドが多数あります。スレッドは pthread ですが、RTAI のユーザー空間インターフェースを介して作成されます (ただし、RTAI は気にしないでください)。
スレッドごとに、終了するように設定できる変数があります。だから私がすることは次のとおりです。
- 各スレッドにその変数を設定して、停止するようにします
- 最大で 1 秒待ちます
- スレッドに参加する
問題は、カーネル空間のバディ スレッドを使用する RTAI を使用しているため、何か問題が発生した場合、スレッドが応答しなくなる可能性があることです (発生したことはありませんが、念のため注意する必要があります)。何かがうまくいかない)。そのような場合、スレッドを殺すだけです。
それで、私の質問は、スレッドが殺されたら、そのスレッドに参加するべきjoin
かどうかです。
linux-kernel - カーネルモジュールから/devデバイスにアクセス(開く/読み取る/など)するにはどうすればよいですか?
/ dev / pcan0を作成し、/ dev / pcan1をnetdevドライバーとしてコンパイルするドライバー(PCカード用のPCANドライバー、rtdmを使用)を受け取りました。
このドライバーには多くの機能が付属していますが、それらはすべて、CANメッセージを読み取るユーザーレベルのプログラムを対象としています。ただし、必要なのは、カーネルモジュールからこれらのメッセージを読み取ることです。PCANドライバーは変数/関数をエクスポートしません。つまり、使用するカーネルレベルのAPIを提供しません。
copy_from_user
コードを簡単に見て、/ devデバイスから読み取って、またはを使用せずに書き込みますcopy_to_user
。したがって、カーネルモジュールから/ dev / pcan0を開いて、そこから読み取るのは安全だと思いました。
今私の質問は、カーネルモジュールから/ devデバイスを開く/読み取るにはどうすればよいですか?
PS RTAIリアルタイムスレッドからCANバスから読み取りたいのですが、それが問題を引き起こすと思いますか(たとえば、すべての読み取りがLinuxカーネルを通過し、リアルタイム条件を壊しますか?)
c - 浮動小数点数が与えられたときにFPUを回避する方法は?
まあ、これは最適化の問題ではありません。
私は(今のところ)いくつかの位置の平均を見つける必要がある単純なLinuxカーネルモジュールを書いています。これらの位置は、浮動小数点(つまりfloat
)変数として格納されます。(私はすべての作者なので、それを変更することはできますが、フロートの精度を維持し、回避できる場合はそれに関与しないようにします)。
現在、これらの位置の値は、単に保存するためにカーネルに保存されます(または少なくとも使用されます)。1つのユーザーアプリケーションがこれらのデータを書き込み(共有メモリを介して(私はRTAIを使用しているので、カーネルとユーザースペース間で共有メモリを使用しています))、他のアプリケーションはそこから読み取ります。float変数からの読み取りと書き込みはFPUを使用しないので、これは安全だと思います。
安全とは、カーネルでFPUを回避することを意味します。言うまでもなく、一部のシステムにはFPUさえありません。kernel_fpu_begin / endを使用するつもりはありません。これは、タスクのリアルタイム性を損なう可能性があるためです。
カーネルモジュールでは、(位置はとにかく平均化されているので)実際にはそれほど精度は必要ありませんが、0.001までは必要です。私の質問は、FPUを使用せずに、浮動小数点数を整数(元の数の1000倍)に移植可能に変換するにはどうすればよいですか?
フロートのビットパターンから手動で数値を抽出することを考えましたが、エンディアンがどのように影響するかわからないため、またはすべてのアーキテクチャのフローティングポイントが標準である場合でも、それが良いアイデアかどうかはわかりません。
linux - POSIXリアルタイム信号はソフトリアルタイムになりますか?
差出人:https ://mail.rtai.org/pipermail/rtai/2012-April/024968.html
何が起こるかというと、真のリアルタイムRTAIタスクがLinuxによって通知されると、未定義の期間、リアルタイムが失われます。
POSIX APIは、一般的にRTAIではサポートされていません。
では、POSIXリアルタイム信号がRTAIのリアルタイムタスクに送信されると、制御はユーザースペースに移されますか?しかし、POSIXシグナルもリアルタイムのものであり、カーネルモジュール(?)に書き込むことができるので、どうしてソフトリアルタイムになると言えるのでしょうか。
引用の理由がよくわかりませんが、欠けている点を説明してください。
c - ユーザー空間のコードをカーネル空間に移植する
これまでユーザー空間で実行されていた大部分が C で書かれた大きなシステムがあります。次に、コードをカーネル モジュールとしてコンパイルする必要があります。そのためには、少なくともコードを書き直してmalloc
、calloc
、 、free
などの関数をprintf
カーネルの同等のものに置き換える必要があります。これらはユーザー空間の関数のみであるためです。ただし、問題は、システムで使用されるカスタムメイドのライブラリのソース コードがなく、それらのライブラリmalloc
が関数内で呼び出しなどを行っていることです。したがって、基本的に、ライブラリ全体を再実装する必要があるかもしれません。
malloc
ここで質問: の独自の実装をラッパーとして次のkmalloc
ように記述した場合、それは本当に汚いハックになりますか?
次に、この実装をシステム コードにリンクします。これにより、モジュールエラーのすべての不明なシンボルが排除されます。
実際、これは一般的な問題であり、誰かがすでにそのような kmalloc ラッパーを作成しているだろうと思っていましたが、数日間グーグルで調べてみましたが、何も役に立ちませんでした。
編集: これを行う理由は、私が話しているシステムが VxWorks リアルタイム OS で実行されているリアルタイム アプリケーションであり、現在、アプリがほとんどカーネル空間で実行される Linux RTAI で使用されるように移植したいからです。しかし、ユーザー空間でもリアルタイムを持つ可能性があると思うので、マイクが提案したように、コードをカーネルとユーザー空間の部分に分離し、それらの間で共有メモリを使用して通信する必要があります。
serial-port - シリアルポートはライタースレッドの人質です
私は2つのリアルタイムスレッドを持っています(Linux)
最初の 1 つは、シリアル ポート (カーネル空間) 経由でバイトを送信することです。
2 つ目は、シリアル ポートから同じバイトを読み取ることです (ループバック デバイスを使用したため)。
ただし、最初のスレッドは連続的かつ非同期的にデータを送信します。
2 番目のスレッドはシリアル ポートを開いて読み取ることができません。
私はセマフォを使用しましたが、私の問題は同期の問題ではなく、シリアルポートがまだ最初のスレッドの手にあることだと思います。
どうすればこの問題を克服できますか..
私はあなたの提案を受け入れます。
よろしくお願いします
linux - シリアルポート ; 書いたものが読めない
データをランダムに生成すると、シリアルポートに送信したものを読み取ることができず、COM1 経由で送信し、RTAI 関数を使用した 2 つの異なるリアルタイムスレッドで COM2 から読み取りたいのですが、
たとえば、「H」「E」「L」「L」「O」のランダムなバイトと 0x01 を送信します。ただし、「H」「E」「L」「L」「O」の一部のバイトと 0x01 を読み取ることができません。シリアルポート経由で送信した値とは異なる値を読み取りました。その理由は何ですか?1-) COM1 と COM2 の間でヌル モデム ケーブルを使用しています。 2-) ライター スクリプトとリーダー スクリプトを順番に投稿しました。3-) シリアル ポート送信 (書き込み側) で rt_sperr のエラーが発生します。おそらくオーバーランまたはバッファ フル エラーです。4-) ユーザー スペースでこのプロジェクトのレプリカを作成したところ、RESOURCE TEMPORARY UNAVAILABLE メッセージが表示されました。これはシリアル ポートのサイズに関連していますか? もしそうなら、シリアル ポートのバッファー サイズの調整について読む場所を教えてください。私に取るべき行動はありますか?一番
linux - シリアル ポート: カーネル空間でシリアル ポートのバッファー サイズを調整する方法
カーネル空間でシリアル ポートのバッファ サイズを調整する方法を知る必要があります。ioctl および同様のコマンドは、カーネル空間では機能しません。RTAI関数を使用しています。rt_spopen, rt_spwrite else.. 私の希望の理由は、ヌル モデム ケーブルによってシリアル ポート (COM1) 経由で大きなパケット (367 バイト) を送信することに依存しています。
一番
c - 統合共有メモリ システム
Linux の RTAI 拡張機能を使用して記述された古いリアルタイム制御システム コードを使用しています。プロセスの境界を越えてメモリを作成および共有するために、4 つの異なるメカニズムが使用されています。
1) RTAI 共有メモリ (rt_shm_alloc & rt_shm_free): これは、共有メモリにアクセスするためのキーとして unsigned long グローバルに一意の値を使用します。舞台裏で(少なくともユーザー空間から)、キャラクターデバイスでioctlを使用してメモリを生成し、次にmmapを使用して使用可能にします。
2) System V (ftok、shmget、shmat、shmctl など): ftok を使用して、インデックス値と共に使用されるキーを生成し、メモリ ブロックを検索してマップします。これが実際にどのように実装されているかを確認しようとはしていませんが、カーテンの後ろのどこかで mmap を使用していると想定しています。
3) Posix 共有メモリ (shm_open、mmap、shm_unlink など): これは文字列 (内容にいくつかの制限あり) を取り、リンクされたメモリ ブロックを mmap するために使用できるファイル ハンドルを提供します。これは、仮想ファイルシステムを使用してサポートされているようです。
4) mmap および文字ドライバ ioctl 呼び出しの直接使用 特定のカーネル モジュールは、mmap を使用してメモリ ブロックを作成および共有することを直接サポートするインターフェイスを提供します。
これらのメカニズムはすべて、mmap を明示的または暗黙的に使用して、仮想メモリ サブシステムを変更し、共有メモリをセットアップおよび管理しているようです。
問題は、メモリのブロックがこれらのシステムのいずれかを使用して共有されている場合、他のシステムで同じメモリにアクセスするエイリアスを設定する方法はありますかということです。
ユースケース:
2 つの I/O サブシステムがあります。1 つ目は、Linux カーネル ドライバーを使用して実装され、RTAI 共有メモリ メカニズムを使用して作成された共有メモリの 1 つのチャンクに現在の I/O 状態をエクスポートします。2 つ目は、カスタム カーネル モジュールを使用し、ioctl と mmap を直接使用して共有メモリ ブロックを作成する、etherlab のethercat マスターに基づいています。
特定の I/O フィールドへのアクセスを必要とする 40 ほどの他のシステムがありますが、データがどの I/O サブシステムから来たかを知る必要はありません。
私が必要としているのは、さまざまなタイプの共有メモリを開いてアクセスする方法です。一貫した単一の方法で、基礎となる実装の詳細をユーザーから分離します。 そのようなメカニズムは存在しますか?
この問題を解決するために RTAI 共有メモリ メカニズムを使用するように ethercat スタックを変更しましたが、これは一時的な解決策にすぎません (読む: ハック)。