Предположим, что у меня есть внешнее устройство, которое постоянно толкает данные в небольшой буфер в моем драйвере. Я использую очередь ожидания, где обработчик прерываний пробуждает ожидающий пользовательский процесс (аналогично LDD (3-е издание) - Реализация обработчика).Стратегия буферизации драйвера устройства Linux
irq_handler_t irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
flag = 1;
wake_up_interruptible(&wq);
return IRQ_HANDLED;
}
ssize_t my_read(struct file *dev, char __user *buf, size_t count, loff_t *f_pos)
{
wait_event_interruptible(wq, flag != 0);
flag = 0;
copy_to_user(usr_buf, drv_buf, count);
}
/***********************User program***********************/
while(1)
{
read(fid, buffer, size);
//do stuff with data
}
Пользовательская программа вызывает чтение и ожидает, пока прерывание не получит новые данные с внешнего устройства. Поскольку внешнее устройство может подталкивать данные быстрее, чем это может выполнить код, какие механизмы я могу использовать для обеспечения того, чтобы данные не перезаписывались до того, как программа пользователя скопирует его? Будет ли кольцевой буфер, такой как структура, работать здесь? Неясно, как его реализовать.
Thanks
Как ваши данные drv_buf получают данные? copy_to_user (usr_buf, drv_buf, count) должен быть copy_to_user (buf, drv_buf, count). –
* «Какие механизмы я могу использовать для обеспечения того, чтобы данные не перезаписывались до того, как программа пользователя скопировала его?» * - По сути, драйвер может только буферизировать столько, сколько может, пока не произойдет переполнение буфера. A (статически выделенный) кольцевой буфер (как предлагается в ответе) может только отложить перерасход, если буфер (кольцевой) не имеет размера. Хорошо написанный драйвер сможет обнаружить и сообщить о таком состоянии. Даже динамически распределенные буферы могут оказаться недостаточными, чтобы справиться с «медленным» считывателем. IOW, вы должны убедиться, что пользовательское пространство может не отставать от поступающих данных, по крайней мере, для некоторой усредненной ставки. – sawdust