tl; dr - 私が無限に長いファイルの猫をしているとき、すべてが素晴らしいですが、同じファイルを読み込まなくてもCの "open"を使うと、すべてが失敗します。なぜそれが起こりますか?どうすればそれが起こらないようにすることができますか?catとreadonlyのファイルを開くのとの比較
私は小さな組み込みLinux O/Sを主演が、SPIドライバのような他の有用なものを持っているのDigi ME9210、上で開発しています。
最終的には、一貫して10kサンプル/秒でSPIデバイスを読み取ることをお勧めします。デバイスに付属のサンプルSPIドライバは、ioctl関数を使用してSPIをユーザーランドから読み取る機能を提供します。残念なことに、タイミングを見ると、読書は一貫していませんでした。私書箱やその他の遅延機能は一貫性のない結果をもたらしました。ちょうどwhile (true) { sample_spi(); }
のようなタイトなループを使用したとしても、間隔は矛盾していました。
私はカーネルドライバを編集することにしました。私は適切なレジスタを編集することによって非常に信頼性の高い定期的な割り込みを得ることができます。ルーチンを設定することができますので、すべての割り込みで甘いSPIの読み取りを取得できます。すばらしいです。デバッグのために、私は自分のタイミングを確認するために、シェルで「私もちょうどそれも1kHzで実行することができるかどうかではなく、完全な10kHzのを期待します」
、私は
cat /dev/spidev1.0
無限の読み取りを行います。 SPIの読み取りは、主に定期的に見られ、時折スリップします(1 msではなく3または5 ms)。これは、catユーティリティーが定期的にストリームにダンプする方法と関係があります。だから私はこのようになり、小さなCプログラムを書いた:
int f = open("/dev/spidev1.0", O_RDONLY); // some time-wasting logic here close(f);
私がいることを実行すると、私は多分10 SPI読み込み取得し、私はリセットを行うまで、全体のLinuxマシンが応答を停止します。
これは何ですか? cat
ファイルを開くとフリーズ状態になるのはなぜですか?猫とは違ったやり方は何ですか?私は、猫が "ファイルを開いて読み、印刷して閉じる"のように見えたと思っていたでしょう。 Cコードはその50%を実行していますが、ハードな50%もしません。私はちょうど読んカウンタを更新する代わりに、SPIを実行した場合、割り込みは非常に元気に永遠に行く、 - 私は
- を見てきました
物事はたぶんあなたの割り込みが実際には持続可能ではありません。
- おそらくCはちょうど猫のようには動作しません - 割り込み速度を20Hzに落とすと、Cコードとcatはちょうど同じように動作します。
- おそらく猫はちょうど完璧です - 割り込み速度を10kHzに上げると、猫は凍ってしまう前に約5ms読み込みます。 Cコードは、フリーズする前に、大きく異なる間隔でいくつかの読み込みを行います。
catのソースコードが表示されます。あるいは少なくともここのGNU catのバージョン - http://git.savannah.gnu.org/cgit/coreutils.git/plain/src/cat.c。もちろん、あなたのLinuxバージョンの特定のバージョンの 'cat'のソースを調べることができれば最高です。彼らは 'fdadvise(input_desc、0、0、FADVISE_SEQUENTIAL);'を使うことに注意してください。おそらくそれは重要です。 – sashoalm
あなたのコードを使ってカーネル全体をロックすることができる場合は、間違った側から問題を見ていると思います。 'cat'のように動作するようにアプリケーションを修正する必要はありません。マシンをロックしないでください。 – tofro
あなたのコードがどのように読んでいるのか、そしてドライバーが何をしているのか(オープン、読書、投票などの扱い)を知らなければ、助けが難しいでしょう。 @tofroが述べたように、ユーザランドプログラムはカーネルをロックできないはずです。 – Hasturkun