Я использую ядро Linux с патчем preempt-rt, я провел простой тест для измерения времени между прерыванием и уведомлением о прерывании в пространстве пользователя. Идея довольно проста, у меня есть модуль, который реализует чтение:
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;
}
, затем из процедуры прерывания я запускаю чтение:
static 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
Мой ЦП является 4-ядерным:
название модели: ARMv7 Processor rev 10 (v7l) BogoMIPS: 7.54
и частота
cat / sys / devices / system / cpu/ cpu0 / cpufreq / scaling_cur_freq 996000
Я думаю, что 65-70 нас - это в значительной степени для пробуждения процесса.
Я пытался изменить irq и приоритет процесса с помощью chrt и вынести внизIRQ для конкретного ядра с smp_affinity и процесс на том же ядре или другом ядре с набором задач, но результаты в основном не меняются.
Что я делаю не так?