Linux设备驱动程序缓冲策略

Linux设备驱动程序缓冲策略,第1张

概述让我们假设我有一个外部设备,不断将数据推送到我的驱动程序中的小缓冲区.我正在使用等待队列,其中中断处理程序唤醒等待的用户进程(类似于LDD(第3版) – 实现处理程序). irq_handler_t irq_handler(int irq, void *dev_id, struct pt_regs *regs){ flag = 1; wake_up_interruptible(&wq); 让我们假设我有一个外部设备,不断将数据推送到我的驱动程序中的小缓冲区.我正在使用等待队列,其中中断处理程序唤醒等待的用户进程(类似于LDD(第3版) – 实现处理程序).

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设备驱动程序缓冲策略所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1030874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存