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}
用户程序调用read并等待,直到中断从外部设备获取新数据.由于外部设备可能以比此代码可执行的更快的速度推送数据,因此我可以使用哪些机制来确保在用户程序复制数据之前不会覆盖数据?像这样的环状缓冲区会在这里工作吗?目前尚不清楚如何实施它.
谢谢
解决方法 是的,环形缓冲区可以工作.您只需要从中断处理程序填充缓冲区,您将从my_read回调中读取它.
一个真正天真且非常低效的实现可能是(未经测试的):
static irqreturn_t irq_handler(int irq,voID *dev_ID){ struct my_dev *dev = dev_ID; buf[buf_wr] = read_device(dev); buf_wr++; if (buf_wr >= BUFSIZE) buf_wr = 0; wake_up(&wq); return IRQ_HANDLED;}static ssize_t my_read(struct file *file,char __user *ubuf,size_t sz,loff_t *ppos){ int n,ret; ret = wait_event_interruptible(wq,buf_wr != buf_rd); if (ret) return ret; n = buf_wr - buf_rd; if (n < 0) n += BUFSIZE; n = min(count,n); ret = copy_to_user(ubuf,buf,n); buf_rd += n; if (buf_rd >= BUFSIZE) buf_rd -= BUFSIZE; if (ret) return ret; *ppos += n; return 1;}
您可能还想使用DMA或mmap或两者来提高效率.
总结以上是内存溢出为你收集整理的Linux设备驱动程序缓冲策略全部内容,希望文章能够帮你解决Linux设备驱动程序缓冲策略所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)