プログラム専用のプロセッサコアを1つ持つことはできますか?


12

GPIOピンの高->低と低->高信号エッジ間の時間差を計る必要があります。これを行う簡単なプログラムを作成しました。しばらく実行した後、結果に非常に満足しました(0.01のバリエーション)。しかし、時々0.5秒のエラーがありました。これは、その時点で実行されている他のシステムプロセスが原因であると考えていました。だから私の質問は:

プログラム用に1つのプロセッサコアを予約し、他の3つのコアをシステム用にできますか?

Raspbian Jessie Liteを使用しているので、実行するには3コアで十分だと思います。


4
GPIOピンのステータスをループでポーリングしていると思います。これは、オペレーティングシステムがプログラムの実行を決定する方法の影響を非常に受けやすく、ほとんどの時間を費やしてCPUをビジーに保ちながら、実際には何の役にも立ちません。特定のGPIOピンに割り込みを設定する方法を検討すると、GPIOピンの信号エッジ間でプログラムをスリープさせることができます。
フロリアンカステラーヌ

4
プロジェクトの内容はわかりませんが、特にリアルタイムのようなシステムが必要な場合は、マイクロコントローラーの方が適している場合があります。Arduinoには多くのオプションがあり、C / C ++でプログラムを作成できます。
SnakeDoc

@Florian RPi.GPIOには、割り込みに似た関数があります。エッジが検出されるまでプログラムをブロックします(ソース:sourceforge.net/p/raspberry-gpio-python/wiki/Inputs)。
非標準モデル

@SnakeDoc私はマイクロコントローラーが優れていることを知っています。マイクロ秒の精度は必要ないので、それを避けたいと思っていました。1/100秒で十分です。また、時間の差分だけが必要なので、遅延がある場合は、開始と停止で同じになることを望んでいました。これでうまくいかない場合は、RPiに接続されたマイクロコントローラーを使用してデータを保存する必要があります。
非標準モデル

1
または、PIで実行されているリアルタイムOSを取得します。セットアップの問題は、OSによる「ベストエフォート」に依存することです。プログラムがGPIOへの特権アクセスを要求するのと同時に行われる他の処理によっては、OSがその瞬間に実行している他のタスクの背後でキューに入れられる場合があります。ユーザーランドプログラムは、システムタスクよりも優先度が低くなります。それは歪んだかもしれないあなたのタイミング観測を意味し、実行するために他のプロセスのためのOSで、 『取っておく「一時停止とする』ことができるあなたのプログラムの実行時に手段プリエンプションは、もあります。
SnakeDoc

回答:


13

コアの専任はおそらく過剰です。

私のpigpioライブラリを試してみることをお勧めします。デフォルトでは、GPIOレベルの変更は10µs以内になります。

簡単なテストとして、このPythonの例を参照することをお勧めします。これは、GPIOレベルの遷移と、そのGPIOでの最後の遷移以降の時間をマイクロ秒単位で出力します。

Jessie Liteでは、pigpioはデフォルトではインストールされません。リンクされたサイトから最新のものをインストールするか、リポジトリに古いバージョンをインストールします。

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)

あなたのpigpioライブラリを試します。今は別のプロジェクトを終了する必要がありますが、これに戻ります。数週間後に報告します。ありがとうございました!
非標準モデル

4

このCyber​​citiの記事でschedutils説明されているように、プログラムを1つのコアにロックできます。

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

ただし、他のプロセスは同じコアでスケジュールできます。したがって、2番目に行うことは、niceコマンドを使用して、コマンドが最高の優先度で実行されるようにすることです(これにより、必要に応じて他のプロセスをプリエンプトする必要があることがLinuxカーネルに通知されます)。この方法でプログラムを開始します。

nice -n -20 your-program

タイミングの問題には、他にも考えられる理由がいくつかあります。これらは何もするのが簡単ではありません:

  • Pythonでプログラミングしている場合は、プログラムを一時停止して未使用のメモリを解放するガベージコレクタがあります。
  • 割り込みにより、CPUは必要なもの以外を処理します。たとえば、ネットワークパケットまたはその他の入出力。
  • プログラムが頻繁にスリープしている場合、CPUキャッシュ(L1 / L2キャッシュ)をいっぱいにする他のプロセスが存在する可能性があります。これにより、RAMアクセスを待機する必要があります。
    • RAMがいっぱいで、SDカードが遅いためにプロセスがディスクにスワップアウトされるとさらに悪化します。

プロセスをリアルタイムにする方法があります。つまり、特定のタイミング保証で実行されます。これに関する問題は、他のすべてが遅くなる可能性があることであり、それは複雑なトピックです。このうさぎの穴を掘り下げたい場合は、Linuxのリアルタイムプロセスを読み始めることをお勧めします。


2
プロセスをリアルタイムではなく、非リアルタイムプロセスよりも優先して実行することを確実にする優先順位を与える方が良いでしょう。
ジョアン

良い点は、それについてのメモを追加します。
エミルヴィクストローム

1
「gc.disable()」ガベージコレクターを無効にするとどうなりますか?
ケイン

@Keineメモリリークが発生する可能性があります。Bを指す変数を持つオブジェクトAがあるとします。Pythonはこの参照を数値として追跡し、Bが1つのオブジェクトを指していることを知っています。不要になったらAを削除します。Bの参照カウントは減少し、0に達すると、PythonもBを解放できます。これは参照カウントと呼ばれます。しかし、ここで、BがAに戻る参照を持っていると言います。これで、相互を指すオブジェクトのクラスターができました。それらのどれも0にヒットして解放されません。メインプログラムがクラスターを「ポイント」していない場合、GCはそのようなクラスターを見つけて削除できます。
エミルヴィクストローム

1
あなたの提案を私のプロジェクトに追加します。しかし、あまりにも複雑なトピックを避けたいと思っています。その場合、データを保存するためだけにマイクロコントローラーの割り込み検出を行い、RPiに接続する方が良いと思います。ありがとうございました!
非標準モデル

2

タイミング要件があるため、Raspberry Piはこれに適したプラットフォームではなくなりました。これはリアルタイムのプラットフォームではなく、さまざまな干渉源によってタイミングがずれる可能性があります。

代わりに、マイクロコントローラを使用して、できれば割り込みを使用してこの時間を測定し、その情報を後でPiに渡す必要があります。


1
Raspberry PiのGPIOピンで割り込みを取得することはできませんか?
フロリアンカステラーヌ

確かにこれは、MCUよりもLinuxマシンをより適切にする設計要件の他の部分があるかどうかに依存します。RPiは、10 MHzでクロック制御されるMCUと同様に、このタスクを適切に処理できます。
ショーンフーリハネ

1

あなたの要件に従って、シングルコアプロセッサを使用する必要はないと思います。必要なのは、プログラムが常に実行されるようにすることです。これを実現するには、プログラムの優先度を非常に高く設定し、他のプロセスに邪魔されないようにします。

私が知っている限り、私たちが使用しているOS(汎用OS)はリアルタイムシステムで使用するように設計されていないため、他のプロセスが邪魔しないようにリアルタイムでプロセスを実行したい場合は、リアルタイムOS(RTOS)用。たぶん、彼らはコア選択を思い付くでしょう。:)


1
無料のRTOSはありますか?
ケイン

RTLinuxとVxworksはRTOSの例であり、同様に優れています。ただし、インストールする前にOS(作成の焦点)について勉強する必要があります。
ビシュワジートビシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.