多线程技术在数据实时采集分析中的应用
时间:06-28
来源:EDN
点击:
引言
数字接口设备是实现标准422串行总线到自定义串行总线转换的专用通信设备。数字接口测试系统根据数字接口设备的工作原理,输出422串行数据和自定义串行总线的控制信号(YCK,YZM)给数字接口设备,并对其输出的串行数据(YDATA)进行采集、存储、分析和处理,从而达到对被测设备进行检测的目的。本数字接口测试系统共提供了八个测试通道,每个通道的422串行总线和自定义串行总线的相关参数都可由测试人员通过应用软件进行设置。为方便对数据进行分析,同时在软件上约定了发送的数据格式为:AA xx 01 23 45 67 89 AB CD EF 01 23… 10,其中帧头为0xAA,帧尾为0x10,xx为发送计数器值,每发送一次依次加1。应用软件通过相应的算法对自定义串行总线接收数据进行实时分析和处理,如:已经接收的字节数,共接收了多少帧数据,共出错有多少字节……并将结果在测试界面上动态显示,测试人员可以根据这些实时的测试结果来判断被测设备是否正常工作,一旦发现测试数据误码率太高,即可马上断电停止测试,防止被测设备烧坏。
系统实现方案
数字接口测试系统原理框图如图1所示。测试设备通过USB2.0总线与操作控制计算机进行连接,每台测试设备提供了八个通道的数据发送和接收单元,其中数据发送单元用于输出422异步串行数据,其波特率最高可达614.4 kbps,帧长可根据测试要求进行调整,每帧数据最高循环发送帧周期为5ms;数据接收单元用于产生自定义串行总线的控制信号YZM和YCK,并从YDATA读回数据,YCK和YZM最高分别可达1.6384MHz和25.6kHz。
由于测试过程中传输数据量大,且需要对采集回来的数据做实时分析,因此对数据的实时采集和分析采用多线程分别进行处理。应用软件中主界面线程主要负责完成人机界面操作,同时分别打开数据采集和数据分析两个线程来同步协调工作,为保证数据采集和分析过程的连续和数据完整,两个线程之间通过开辟高速内存缓冲区和内存映射文件的方式来实现高速数据流的一、二级缓冲。其中一级缓冲区实现对USB总线上传数据的缓存,用于实现接收的USB数据包按照各个通道进行数据分解;二级缓冲则按照通道号将分解输出的数据分别进行暂存,用于数据分析线程实现数据分析处理。整个方案中,数据包的上传、存储、数据分解、数据分析等操作均是在内存中完成,速度快,正确率高,再加上采用新的线程同步方法,既保证了数据采集线程高速数据吞吐量、数据分析线程的快速响应和实时分析,又保证了整个方案较高的性能和最低的系统开销。数据缓存处理如图2。
数据采集
为了实现USB返回数据的保存,在内存中构建了一个12k的高速内存缓冲区,12k的空间以512字节(一个USB数据包的大小)为单位平均分成24等份。多线程同步中常用信号量来控制访问某一共享资源的线程数,结合操作系统中生产者和消费者的思想可采用扩展信号量的方式来完成线程同步。数据采集线程操作时,12k高速缓冲区分别用读写两个信号量作为状态指示,对数据读入和输出进行控制。写信号量个数初始化为24个(表示有24个数据区间可写入),读信号量个数初始化为0个(表示有0个空间有数据需要读出),数据采集线程等效为生产者,数据分析线程等效为消费者。如图3所示。USB接口每返回一包数据,首先判断写信号量个数,为零则线程阻塞等待,不为零则实现数据写入操作,将USB数据包内容存入当前生产者指针(pWriteIndex)所指向地址的后512字节缓冲区中,完成后生产者指针加512,写信号量减1,读信号量加1,这是生产的过程。当线程切换到数据分析线程后开始消费(对采集回来的数据包分解处理),首先判断读信号量个数,为零(没有可消费的)则线程阻塞等待,不为零则由消费者指针(pReadIndex)来控制读取一包数据。一包数据读取完毕后消费者指针加512,读信号量减1,写信号量加1。由以上分析可知,整个12k的缓冲区在读写两个信号量的协调工作下不仅实现了数据采集和数据分析线程的同步,并且通过互锁机制保证了生产者指针和消费者指针不会指向同一块内存区域,使整个系统的可靠性得到显著提高。
数字接口设备是实现标准422串行总线到自定义串行总线转换的专用通信设备。数字接口测试系统根据数字接口设备的工作原理,输出422串行数据和自定义串行总线的控制信号(YCK,YZM)给数字接口设备,并对其输出的串行数据(YDATA)进行采集、存储、分析和处理,从而达到对被测设备进行检测的目的。本数字接口测试系统共提供了八个测试通道,每个通道的422串行总线和自定义串行总线的相关参数都可由测试人员通过应用软件进行设置。为方便对数据进行分析,同时在软件上约定了发送的数据格式为:AA xx 01 23 45 67 89 AB CD EF 01 23… 10,其中帧头为0xAA,帧尾为0x10,xx为发送计数器值,每发送一次依次加1。应用软件通过相应的算法对自定义串行总线接收数据进行实时分析和处理,如:已经接收的字节数,共接收了多少帧数据,共出错有多少字节……并将结果在测试界面上动态显示,测试人员可以根据这些实时的测试结果来判断被测设备是否正常工作,一旦发现测试数据误码率太高,即可马上断电停止测试,防止被测设备烧坏。
系统实现方案
数字接口测试系统原理框图如图1所示。测试设备通过USB2.0总线与操作控制计算机进行连接,每台测试设备提供了八个通道的数据发送和接收单元,其中数据发送单元用于输出422异步串行数据,其波特率最高可达614.4 kbps,帧长可根据测试要求进行调整,每帧数据最高循环发送帧周期为5ms;数据接收单元用于产生自定义串行总线的控制信号YZM和YCK,并从YDATA读回数据,YCK和YZM最高分别可达1.6384MHz和25.6kHz。
由于测试过程中传输数据量大,且需要对采集回来的数据做实时分析,因此对数据的实时采集和分析采用多线程分别进行处理。应用软件中主界面线程主要负责完成人机界面操作,同时分别打开数据采集和数据分析两个线程来同步协调工作,为保证数据采集和分析过程的连续和数据完整,两个线程之间通过开辟高速内存缓冲区和内存映射文件的方式来实现高速数据流的一、二级缓冲。其中一级缓冲区实现对USB总线上传数据的缓存,用于实现接收的USB数据包按照各个通道进行数据分解;二级缓冲则按照通道号将分解输出的数据分别进行暂存,用于数据分析线程实现数据分析处理。整个方案中,数据包的上传、存储、数据分解、数据分析等操作均是在内存中完成,速度快,正确率高,再加上采用新的线程同步方法,既保证了数据采集线程高速数据吞吐量、数据分析线程的快速响应和实时分析,又保证了整个方案较高的性能和最低的系统开销。数据缓存处理如图2。
数据采集
为了实现USB返回数据的保存,在内存中构建了一个12k的高速内存缓冲区,12k的空间以512字节(一个USB数据包的大小)为单位平均分成24等份。多线程同步中常用信号量来控制访问某一共享资源的线程数,结合操作系统中生产者和消费者的思想可采用扩展信号量的方式来完成线程同步。数据采集线程操作时,12k高速缓冲区分别用读写两个信号量作为状态指示,对数据读入和输出进行控制。写信号量个数初始化为24个(表示有24个数据区间可写入),读信号量个数初始化为0个(表示有0个空间有数据需要读出),数据采集线程等效为生产者,数据分析线程等效为消费者。如图3所示。USB接口每返回一包数据,首先判断写信号量个数,为零则线程阻塞等待,不为零则实现数据写入操作,将USB数据包内容存入当前生产者指针(pWriteIndex)所指向地址的后512字节缓冲区中,完成后生产者指针加512,写信号量减1,读信号量加1,这是生产的过程。当线程切换到数据分析线程后开始消费(对采集回来的数据包分解处理),首先判断读信号量个数,为零(没有可消费的)则线程阻塞等待,不为零则由消费者指针(pReadIndex)来控制读取一包数据。一包数据读取完毕后消费者指针加512,读信号量减1,写信号量加1。由以上分析可知,整个12k的缓冲区在读写两个信号量的协调工作下不仅实现了数据采集和数据分析线程的同步,并且通过互锁机制保证了生产者指针和消费者指针不会指向同一块内存区域,使整个系统的可靠性得到显著提高。
数据分析
由于数字接口测试设备八个通道可同时工作,为了区别USB总线上传的数据包中的数据分别对应哪一个通道的数据,并满足数据传输的实时性要求,每个通道以64字节为单位将测试数据送入USB接口的内部缓冲区,其第一个字节用于标识随后63字节是哪一个通道的数据,分别用01,02……07,08进行标识。当USB接口的内部缓冲区填满512字节后即通过USB总线上传到计算机内存中的高速缓冲区。所以在数据分析时首先需要从USB数据包中提取每个通道回传的测试数据,然后与标准格式数据进行对比分析。可见若在长时间测试时,数据分析线程数据处理量大,任务繁重。为保证整个系统的实时性和数据分析准确性,测试接收回来的数据按照通道号不同分别保存在不同的内存映射文件中。