ISRをログに記録/デバッグしようとすると、次のことがわかりました。
1)sprintf()
「O」ReillyLinuxデバイスドライバーの例として使用
irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct timeval tv;
int written;
do_gettimeofday(&tv);
/* Write a 16 byte record. Assume PAGE_SIZE is a multiple of 16 */
written = sprintf((char *)short_head,"%08u.%06u\n",
(int)(tv.tv_sec % 100000000), (int)(tv.tv_usec));
BUG_ON(written != 16);
short_incr_bp(&short_head, written);
wake_up_interruptible(&short_queue); /* awake any reading process */
return IRQ_HANDLED;
}
printf()とは異なり、sprintf()はコンソールではなくメモリに書き込み、再入可能またはブロッキングの問題はないようですが、正しいですか?しかし、私は他のフォーラムでsprintf()に反対する言葉を見てきました。パフォーマンスのオーバーヘッドだけが原因なのか、それともそうでないのかわかりません。
2)printk()
人々が使用しているのを見たが、これもパフォーマンスの問題であると非難されたもう1つの問題です(おそらく他に何もありませんか?)
最近のLinuxでISRをログに記録したり、デバッグしたりするときに使用する一般的に適切な方法/関数は何ですか?