无线虚拟仪器系统中高速无线数据通信
2020-09-29王广君谢巧灵
王广君,谢巧灵
(1. 中国地质大学(武汉)自动化学院,湖北 武汉 430074;2. 复杂系统先进控制与智能自动化湖北省重点实验室,湖北 武汉 430074;3. 中国地质大学(武汉)机械与电子信息学院,湖北 武汉 430074)
虚拟仪器(virtual instruments)是一种集计算机技术、微电子技术、嵌入式技术和数字信号处理技术于一体的新型仪器[1-2]。其系统采用软件控制硬件的工作模式,在仪器工业中占有重要的地位。
随着技术的不断发展,虚拟仪器对数据传输速率提出了更高的要求[3]。以100 kHz 最小频率分辨率、100 帧/s处理速率的频谱分析仪为例,如果要求在8 位1 GHz采样速率AD 的硬件条件下实现,那么根据奈奎斯特采样定理的要求,每帧数据的个数需达到104。每帧数据大小则需达到8×104位。数据传输速率则要求高达8 Mbit/s 以上。若需进一步提高频率分辨率或是显示帧率,数据传输速率还需进一步提高。目前,采用蓝牙[4]、ZigBee[5]进行通信的无线虚拟仪器只能进行低速数据传输。Wi-Fi 通信技术虽然占用空间资源少、数据传输速率高,并在测量仪器的数据传输中有广泛的应用[6],但是通过Wi-Fi 连接的前端硬件大多采用串口方式[7],传输速率仍难以满足高速数据传输的要求。
为此,笔者利用µC/OS-II 多任务编程接口,设计了一种结合缓冲池机制和多任务机制的Socket 通信方法,实现无线虚拟仪器的高速无线数据通信。
1 无线虚拟仪器的基本架构
无线虚拟仪器系统主要由数据采集与预处理模块、无线控制模块、Wi-Fi 通信模块、虚拟仪器上位机模块组成,如图1 所示。数据采集与预处理模块由现场可编程逻辑门阵列(FPGA)控制,用于数据的采集与处理,并根据接收的指令将数据通过串行外设接口(SPI)传出;无线控制模块由ARM 处理器控制,用于协调虚拟仪器模块和Wi-Fi 通信模块的数据传输;Wi-Fi 通信模块完成数据链路层和物理层的工作,对封包好的无线数据进行收发;虚拟仪器上位机模块由计算机控制,对接收到的无线数据分别进行存储、分析、显示等处理。无线控制模块和Wi-Fi 通信模块是设计的重点。
图1 系统总体设计框图
2 高速无线数据通信
无线控制模块采用意法半导体公司的STM32F407VET6 作为主控芯片;Wi-Fi 芯片选用Marvell 公司的88W8801 芯片。高速数据传输采用传输控制协议(TCP),通过µC/OS-II 实时操作系统实现。控制软件包含系统任务、网卡任务、TCP/IP 协议栈任务、传输控制任务,借助于µC/OS-II 实时操作系统可裁剪的、抢占式的实时多任务内核,软件部分得以在实时性和小型化之间得以均衡[8],既能保证4 项任务间的实时切换,又能保证整个系统的高效运转。
控制软件设计包括Wi-Fi 驱动移植和传输控制两部分。
2.1 驱动移植
Wi-Fi 驱动移植分为TCP/IP 协议栈移植、无线网卡驱动移植。
2.1.1 TCP/IP 协议栈移植
选用lwIP 协议栈实现TCP/IP 协议栈移植。lwIP为了适应不同的操作系统,在lwIP 和操作系统之间增加了一个操作系统仿真层[9]。操作系统仿真层为操作系统的定时、进程同步和消息传递提供了一个统一的接口。
将lwIP 移植到µC/OS-II,需要对以下几个文件进行编写:
(1)cc.h:该文件需要定义平台无关的数据类型、临界保护区和编译器特定符号,并调试输出。
(2)perf.h:该文件定义与性能测量相关的内容,但本设计未涉及,故为空。
(3)sys_arch.c:该文件需要为协议栈提供µC/OS-II 多任务相关机制,主要包括消息邮箱机制、同步机制(信号量)、内核任务创建、时间管理机制(延时、获取运行时间)。
(4)sys_arch.h:该文件与sys_arch.c 配套使用,除需要对sys_arch.c 中函数进行声明外,还需定义消息邮箱的参数。
2.1.2 无线网卡驱动移植
无线网卡驱动移植涉及大量的寄存器操作。为了编写的方便,通过移植Linux 下的驱动实现无线网卡驱动程序的编写。这一过程主要是修改Linux 驱动以适应µC/OS-II 的要求,具体工作如下:
(1)为了节省空间,对无线网卡驱动中不常用的缓冲区(如事件缓冲区、扫描得到的信标信息缓冲区等)进行了缩减;
(2)将驱动程序里的时间管理代码替换为µC/OS-II 的形式;
(3)将驱动程序里的信号量代码替换为µC/OS-II的形式;
(4)网卡采用安全数字输入输出(secure digital input and output,SDIO)接口,所以需编写SDIO 驱动;
(5)Linux 中使用sk_buff 结构体管理TCP/IP 中的数据[10],而lwIP 使用pbuf 结构体来管理[11],所以需编写sk_buffer.c 文件完成两者之间的转换。
2.2 传输控制
传输控制部分借助µC/OS-II 实时操作系统的多任务实现。数据的接收和发送之间公用一个缓冲池,利用直接内存存取(DMA)传输数据时不占用CPU 时间的特点[12],再结合缓冲池机制和多任务机制,即可有效提升数据传输速率。
通过SPI 接收数据的速率较快,在STM32F407上可达42 MHz,而通过TCP 发送数据的速率因为要处理协议栈相关内容则相对较慢。为了协调高速与低速接口,常采用缓冲池的方法。大多数嵌入式系统通常采用静态内存块池的方法[13],将系统空余的内存统一管理,生成一系列的大小固定的内存块池,在实际操作中对这一整个内存块进行操作。高速无线数据通信方案中的缓冲池也采用类似的结构。
缓冲池由N 个相同大小的缓冲区组成,每个缓冲区包含缓冲区编号、状态位和数据字段3 部分,如图2所示。缓冲区编号具有唯一性,用来标识当前缓冲区在缓冲池中的位置;状态位为0 表示对应数据字段为空,状态位为1 表示对应数据字段为满。操作系统每次传输完成后,记录下上一次读写操作完成的缓冲池编号。数据的接收从上一次操作的缓冲池开始,依次向下检索接下来的缓冲区,满足条件即进行对应的读写操作。
图2 缓冲池设计框图
无线数据传输流程如图3 和4 所示。
图3 数据接收任务
图4 数据发送任务
接收数据时,依次检索缓冲池,当检测到缓冲区为空时,通过SPI 发送DMA 请求。当数据接收完成时,将其存入缓冲区,并更新缓冲池状态。
发送数据时,依次检索缓冲池,当检测到缓冲区为满时,通过Wi-Fi 接口将缓冲区的数据发送至上位机,并更新缓冲池状态。
在操作SPI 或Wi-Fi 收发数据时,采用了DMA技术。此时,数据传输只占用数据总线而不占用CPU。利用这一特性,在此时切换至另一任务进行数据处理,可以有效提高CPU 的利用率,从而提高数据传输速率。
3 测试结果
利用由数据采集与预处理模块、无线控制模块、Wi-Fi 通信模块搭建的测试平台(如图5 所示)进行了数据传输测试,考察数据传输的正确性、稳定性和传输速率。测试情况通过Wireshark 抓包得到。
图5 测试平台实物图
3.1 传输正确性测试
对于无线数据传输而言,传输正确是最基本的要求。测试时,发送内容在0~255 之间循环递增的数据包,上位机进行接收并统计。表1 是数据正确性测试结果。数据传输中虽有少量丢包,但TCP 丢包后的重传确保了数据传输的正确性。
表1 传输正确性测试
3.2 稳定性测试
因为采用多任务和公用缓冲池的设计为系统引入了竞争冒险,所以进行数据传输稳定性测试尤为重要。测试时,由数据采集与预处理模块产生测试数据,无线控制模块控制Wi-Fi 通信模块进行数据转发,上位机进行接收并统计。稳定性测试时间为3 600 s,在测试过程中,数据传输速率稳定在16.0 Mbit/s,如图6 所示。
图6 稳定性测试速率图
3.3 速率对比
对采用顺序设计和本文提出的多任务设计的数据传输速率进行了比较测试。测试时,由数据采集与预处理模块产生测试数据,无线控制模块控制Wi-Fi 通信模块进行数据转发,上位机进行接收并统计。测试时间约600 s,测试结果如图7 所示。
图7 顺序设计和多任务设计的速率对比
从图7 可以看到,采用顺序设计的数据传输平均速率为12.4 Mbit/s;而采用多任务设计的数据传输平均速率为16.0 Mbit/s。多任务设计方案较前者传输速率提高了约29%。
4 结语
本文设计了结合缓冲池机制和多任务机制的无线数据传输控制方案,很好地满足了无线虚拟仪器系统对高速无线数据通信的要求。测试表明,该方案正确可行、控制软件稳定可靠。