linux 模块之间 数据传输,基于Linux系统的雷达数据传输模块设计

本文探讨了航管雷达数据处理中的实时性和稳定性问题。通过使用存储器直接存取技术和紧凑型外设组件互连标准总线(CPCI),实现了高速数据传输。在中断处理上,采用了工作队列机制的底半部处理来避免中断丢失。同时,介绍了设备驱动的接口函数设计,确保了数据处理软件的阻塞和非阻塞操作。这些技术提高了雷达数据处理的效率和系统的稳定性。
摘要由CSDN通过智能技术生成

在航管雷达中,信号处理向数据处理实时发送大量的雷达目标数据。而数据处理需要完成大量的运算工作。如何既保证运算任务实时完成,又实现数据快速稳定的传输,是迫切需要解决的问题。存储器直接存取是一种允许外围设备直接从内存存取数据而无需CPU全程参与的硬件机制,常用在需要高速大批量数据传输的系统中[1]。紧凑型外设组件互连标准总线是基于标准的PCI电气规范上的一个高性能总线,是一种新的开放式工业计算机标准,其可靠性优于PCI总线。与PCI总线一样,它能够被Linux系统支持、不依赖于处理器架构、支持总线控制技术。1模块设计数据传输模块嵌入Linux内核,通过系统标准接口向用户层数据处理软件提供接口函数,包括读、写和控制设备等功能。在Linux系统中CPCI设备被归类为字符设备,因此它具有PCI设备和字符设备的特性,在设计设备的数据结构时应包含PCI设备结构体和字符设备结构体2模块实现2.1CPCI设备的加载与卸载CPCI驱动程序通过创建structpci_driver结构体进行注册,向PCI核心描述CPCI驱动程序。在模块的入口函数staticint__initcpcidev_init(void)中,使用函数pci_register_driver,向系统注册上述结构体。设备的实际加载过程在函数cpcidev_probe中进行,该函数按照设备列表cpcidev_pci_tbl中所列设备进行逐个检测和初始化。2.2中断处理。信号处理将雷达扫描周期等分为64个扇区。每接收一次数据包都将产生中断。频繁的中断、耗时的数据包拷贝操作,如果在中断处理中完成所有工作,将造成中断的丢失。Linux将中断处理程序分解成两个半部:顶半部(tophalf)和底半部(bottomhalf)[2]。底半部机制包括:软中断(Softirq)、Tasklet、工作队列(Workqueues)。本文采用工作队列机制实现底半部工作。在设备结构体中已经定义了工作队列结构体structwork_structbh_task,设备初始化时通过函数INIT_WORK()初始化工作队列并与底半部处理函数voidbh_handler(unsignedlong)挂接。在中断处理顶半部中,对中断进行类型判断、关闭该类型中断允许位、释放该类型中断的信号量、调度工作队列。其它工作在中断底半部完成。中断的顶半部和底半部处理流程如图1和图2所示。图1中断顶半部处理流程图2中断底半部处理流程2.3接口函数。设备的接口函数在注册字符设备时与设备挂接,为数据处理软件提供与设备进行交互的各功能接口,主要完成对设备的读、写和控制等访问功能。

在设备读、写函数中,实现数据处理软件对设备的阻塞式操作。非阻塞操作的进程在不能进行设备操作。如果不阻塞,则用户想获取设备资源只能不停地查询,这会无谓地耗费CPU资源;而阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源“礼让”给其他进程。在Linux系统中,可以采用等待队列来实现阻塞进程的唤醒[3]。waitqueue以队列为基础数据结构,与进程调度机制紧密结合,用于实现内核中的异步事件通知机制,用来同步对系统资源的访问。数据传输模块提供这样的能力:当数据处理进行read、write等系统调用时,若设备的接收缓区为空或者发送缓区未空,模块在函数cpcidev_read、cpcidev_write中将进程阻塞直到接收缓区不空或发送缓区为空,数据处理的read、write等调用成功才返回。在设备控制函数cpcidev_ioctl中,主要完理的控制和状态的获取。3结束语高效、稳定的雷达数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值