C 登录ISR、sprintf()、printk()和其他?

C 登录ISR、sprintf()、printk()和其他?,c,embedded,isr,C,Embedded,Isr,尝试记录/调试ISR时,我看到: 1) sprintf()在“O'Reilly Linux设备驱动程序”中用作示例 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

尝试记录/调试ISR时,我看到:

1)
sprintf()
在“O'Reilly Linux设备驱动程序”中用作示例

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()
是我见过的另一个被人们使用但又被归咎于性能问题的例子(也许没有其他原因?)

现在,在Linux中记录或调试ISR时,通常使用什么好方法/函数?

关于
sprintf()
。在任何LXR站点中进行搜索,例如:

我认为这消除了任何疑虑

至于
printk()
printk.h
说:

/*如果您正在编写驱动程序,请改用dev_dbg*/

关于
sprintf()
。在任何LXR站点中进行搜索,例如:

我认为这消除了任何疑虑

至于
printk()
printk.h
说:

/*如果您正在编写驱动程序,请改用dev_dbg*/


printk
-不要使用标准IO内容,因为您是在内核空间,而不是在用户空间。。。。不要过多地阅读其他人关于性能损失的说法,在这种情况下,它是您唯一能够在驱动程序上进行一些正常工作的调试工具…只是说…
printk
-不要使用标准IO,因为您是在内核空间,而不是在用户空间。。。。不要过多地阅读其他人关于性能损失的说法,在这种情况下,它是您唯一能够对驱动程序进行合理操作的调试工具…只是说。。。
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