2

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をログに記録したり、デバッグしたりするときに使用する一般的に適切な方法/関数は何ですか?

4

1 に答える 1

0

についてsprintf()。たとえば、ここで、任意のLXRサイトで検索を実行します。

Freetext search: sprintf (4096 estimated hits)
drivers/video/mbx/mbxdebugfs.c, line 100 (100%)
drivers/isdn/hisax/q931.c, line 1207 (100%)
drivers/scsi/aic7xxx_old/aic7xxx_proc.c, line 141

これで疑問がなくなると思います。

についてはprintk()printk.h言う:

/ *ドライバーを作成している場合は、代わりにdev_dbgを使用してください* /

于 2012-10-06T01:53:51.310 に答える