0

我正在使用带有 preempt-rt 补丁的 Linux 内核,我做了一个简单的测试来测量中断和向用户空间通知中断之间的时间。这个想法很简单,我有一个模块,它实现了读取:

static ssize_t my_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
{
   atomic_set(&intflag, 0);
   if (wait_event_interruptible(my_hack, atomic_read(&intflag) != 0))
        return -ERESTARTSYS;
   do_gettimeofday(&tv2);
   trace_printk("wait_event_interruptible% d\n",(int) (tv2.tv_usec - tv1.tv_usec));
    return 0;
}

然后从中断例程中唤醒读取:

静态 irqreturn_t

my_interrupt(int irq, void *dev_id)
{
 ...
 atomic_set(&intflag,1);
 do_gettimeofday(&tv1);
 wake_up_interruptible(&mm_fec_hack);

return IRQ_HANDLED;
}

打印的值约为 65 和 70,例如

myproc-532 [002] ....... 8049.789350:0xbf0c81f0:wake_up_interruptible 65

我的CPU是4核:

型号名称:ARMv7 处理器 rev 10 (v7l) BogoMIPS:7.54

和频率是

猫 /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 996000

我认为 65-70 我们几乎可以唤醒一个过程。

我尝试使用 chrt 更改 irq 和进程优先级,并使用 smp_affinity 将 irq 降级到特定的核心,并使用 taskset 处理到相同的核心或不同的核心,但结果基本上没有改变。

我究竟做错了什么?

4

0 回答 0