2016-11-02 11 views
2

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を実行した場合、割り込みは非常に元気に永遠に行く、 - 私は

  1. を見てきました

    物事はたぶんあなたの割り込みが実際には持続可能ではありません。

  2. おそらくCはちょうど猫のようには動作しません - 割り込み速度を20Hzに落とすと、Cコードとcatはちょうど同じように動作します。
  3. おそらく猫はちょうど完璧です - 割り込み速度を10kHzに上げると、猫は凍ってしまう前に約5ms読み込みます。 Cコードは、フリーズする前に、大きく異なる間隔でいくつかの読み込みを行います。
+1

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

+6

あなたのコードを使ってカーネル全体をロックすることができる場合は、間違った側から問題を見ていると思います。 'cat'のように動作するようにアプリケーションを修正する必要はありません。マシンをロックしないでください。 – tofro

+0

あなたのコードがどのように読んでいるのか、そしてドライバーが何をしているのか(オープン、読書、投票などの扱い)を知らなければ、助けが難しいでしょう。 @tofroが述べたように、ユーザランドプログラムはカーネルをロックできないはずです。 – Hasturkun

答えて

0

開封済み、読み取り済み、終了コードをテストするために、独自のcatプログラムを作成してください。次に、何かが壊れるまで、そのプログラムに他の処理を追加します。

あなたcat様のプログラムは、コマンドラインのタイプから、その後

動作しないことが判明した場合:

strace -o spi_cat_trace.txt cat /dev/spidev1.0 
less spi_cat_trace.txt 

してからcat様のプログラムがどのように異なるか動作するようにしようとするものcatはファイルを読み取る際に行います。

+0

実際の 'cat(1)'ソースコードを見る方が良いでしょうか? –

+0

'cat'のソースコードを見ると、実際には実行できないたくさんのコードが表示されます。そのコードが実際に何をしているのかを知るためには、そのコードの決定を並べ替える必要があります。 'strace'を使うと' cat'が起こることをどう決めたのか心配することなく、実際に何が起こるのか見ることができます。 'strace'を見た後で、困惑しているものがいくつか見えて、コードを調べることができます。 – nategoose

+0

...しかし、あまりにも複雑すぎるgnu猫を見ないでください。おそらくもっと鮮明なBSDの猫を見てください。 FreeBSDのcatは362行のソースファイルしかありません。 –

関連する問題