カーネル空間とユーザー空間の両方で 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 タグは見ていません)、いることを願っています。