16

割り込みハンドラはできるだけ短くする必要があることは誰もが知っています。また、割り込みハンドラ内でのデバッグなどの関数の追加printkは、行うべきではありません。実際、私が書いた割り込み駆動の char デバイスの Linux カーネルをデバッグしていたときに試してみたところ、ドライバーのタイミングが台無しになりました。

私が持っている質問は、なぜこれが起こっているのですか? printk関数はバッファリングされます! これは、データがキューに挿入され、後で処理されることを理解している限り、おそらく割り込みハンドラーが終了した後に処理されることを意味します。

では、なぜ機能しないのでしょうか。

4

2 に答える 2

33

このprintk関数は、キュー/バッファに挿入するだけではありません。ログ レベルが十分に高いと仮定すると、 からの出力はprintk、 への呼び出しの一部として、すぐにコンソールに出力されprintkます。これは、コンソールがシリアル ポート上にある場合に特に遅くなります。ただし、いずれにせよ、printkかなりのオーバーヘッドが発生し、タイミングに影響を与える可能性があります。

デバッグ出力を取得したいタイミングが重要な場所がある場合はtrace_printk、最新のカーネルで関数を使用することを検討できます。これは実際には入力をトレースリングバッファーに入れるだけで、後で読み取ることができます。詳細については、この記事をご覧ください。

于 2012-01-05T21:00:18.370 に答える
-9

はい、printfほとんどの場合、再入可能ではないため、非常に悪いです。発生する可能性があるのは、メインプログラムがprintfを呼び出し、実行中に割り込みが到着しprintf、IRQハンドラーがprintf再度呼び出すことです。非常に悪いことが起こる可能性があります(デッドロック、内部バッファーの破損など)。

于 2012-01-05T07:59:39.297 に答える