在尝试记录/调试 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 时,通常使用什么好的方法/功能?