繁体   English   中英

如何为数据采集硬件实现Linux设备驱动程序?

[英]How to implement a Linux Device Driver for Data Acquisition Hardware?

我正在开发一种采集设备,该设备需要DMA操作才能将大数据帧传输到主存储器。 现在,我假设目标是一个连续的内存区域,因此我正在引导时对其进行分配(例如1 MB),如ldd2-ch13的 “自己动手分配”部分所述。 然后,驱动程序可以通过调用ioremap()来访问该区域。

当前系统的工作方式如下:

  1. 内存映射控制寄存器使用户空间应用程序可以启动/停止设备

  2. 启动后,设备开始以约8MB / s的速度(连续)(连续)将获取的数据传输到分配的存储区域。

  3. 保留的存储器区域具有两个帧的大小,以便采用双缓冲技术
  4. 传输完完整帧后,设备将触发中断。

我已经开发了一个简单的char驱动程序,该驱动程序提供了阻塞的read()函数,以便每次接收到中断时用户空间都可以读取新的数据帧。

运行一些测试之后,我意识到运行以下代码时用户空间应用程序会丢失一些帧:

    for(i=0;i<NUM_FRAMES;i++) {

       read(dev_d,buf,FRAME_SIZE);/*Read frame*/

       for(j=0;j<FRAME_SIZE;j++) /*File dump*/
          fprintf(fp,"%d",buf[j]);

        fprintf(fp,"\n");
    }

我怀疑应用程序的进程在两次后续读取之间进入休眠状态,从而使设备可以重写应该已经读取的内存位置。

由于我没有内核开发经验,因此我想知道如何为此类设备实现驱动程序以确保同步的正确方法。 基本上,我试图为实时采集设备实现简单的共享内存通信,并且我需要保证操作系统能够读取所有采集的数据帧。

您正在读一本非常古老的书。 这里是本书最新版本的链接(该版本很旧): Linux Device Driver 3-Memory Mapping 您也可以从内核文档中阅读DMA-API

要进行某种同步,请阅读“ 时间,延迟和延期工作”一章。 您可以使用等待队列 您需要等待 read()并在新帧可用时“唤醒” *。

关于您的代码,仅仅了解您的问题还不够。 但是,如果您认为需要睡眠/等待,则可以在驱动程序中实现poll file_operation并在用户空间中使用select()询问是否有需要读取的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM