Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux设备驱动程序缓冲策略大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

让我们假设我有一个外部设备,不断将数据推送到我的驱动程序中的小缓冲区.我正在使用等待队列,其中中断处理程序唤醒等待的用户进程(类似于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设备驱动程序缓冲策略所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。