正文:本文进行数据采集使用线程安全队列机制,线程安全队列是一种在线程间数据传输的机制。为此,CVI专门提供了一个在线程中进行数据通信的管道,数据管道是由设定阈值触发的先进先出队列,响应一定事件(如图四)
[11]。具体运行方式为:线程安全队列(TSQ)负责存储DMA传输数据进程传入的数据,同时向数据处理显示进程发送数据,TSQ读入数据和发送数据不会互相阻塞,在建立TSQ的同时,为其设定阈值,当达到阈值的时候,触发读取数据或者发送数据事件,采集数据或者将数据发送到处理端。
图四 多线程安全队列
Figur4 Multi thread safe queue
部分多线程程序如下:
CmtScheduleThreadPoolFunction(DEFAULT_THREAD_POOL_HANDLE,ThreadFunction,NULL,&threadID);//开启线程函数
DisplayPanel (panelHandle);//启动面板
RunUserInterface ();//启动用户界面
CmtWaitForThreadPoolFunctionCompletion(DEFAULT_THREAD_POOL_HANDLE,threadID,OPT_TP_PROCESS_EVENTS_WHILE_WAITING);//等待线程完成
……(采集数据)
if (CmtNewTSQ (QUEUE_SIZE, sizeof(DWORD), OPT_TSQ_AUTO_FwUSH_EXACT, &tsqHandle) < 0) //创建数据安全队列
return -1;
int CVICALLBACK ThreadFunction(void *functionData)
{
while(startflag)
{
CmtGetTSQAttribute (tsqHandle, ATTR_TSQ_ITEMS_IN_QUEUE, &nItems);//判断安全队列数据个数
……
CmtReadTSQData (tsqHandle, readBuffer, GESHU,TSQ_INFINITE_TIMEOUT, 0);//从安全队列读出数据
……(次线程分析数据)
}
4 消除windows消息的死锁
消息死锁是windows运行中经常出现的一个问题,形成具体原因多样,但基本为:线程A给线程B发消息,A等待线程B处理完消息后返回;B接收到A发来的消息,在B处理消息的过程中,也向A发送了消息,并等待A处理完消息返回。然而此时A正等待B处理完消息后返回,没法处理B发来的消息,A与B相互等待,发生死锁
[12]。
CVI中规定,每次创建了窗口的线程必须对windows消息进行处理避免死锁。第一种情况为线程创建窗口但没有运行用窗口时需要对windows消息处理;第二种情况为线程创建了窗口并且也调用了运行窗口函数,但是在返回到运行窗口函数前需要运行的回调函数占用了太长时间
[13]。本例中由于显示进程需要一直需要分析显示数据,对于用户的其他操作请求不能按时响应,也没法得到其他操作的返回值,因此造成了线程死锁。因此我们在分析显示数据程序后加入相应程序,消除消息死锁。
5 巧妙利用PCI-e链路配置过程发送控制命令
一般来讲,上位机PC端向外发送数据一般采取PIO或者DMA模式,DMA模式一般用在数据高速传输的情况下,本例中数据传递采取的就是DMA的传输方式,由于本文主要介绍上位机因此在这里不展开叙述;小数据则一般采用PIO的传输方式,例如外端口控制命令等则需要PIO的方式来传递。一般PIO模式逻辑如下:设计需要PIO设计组件和PCI-e端点模块IP核,而PIO设计组件主要分为发送模块,接收模块,存储器读取控制器模块以及电源管理断开控制器模块
[14-15]。
本例目的在于传递数据至硬件解析,具体为上位机需要配置硬件外端口电压与数据速率,如果用传统的PIO方式,还需要相应的组件才能完成功能,然后实现控制命令发送到硬件板卡。由于电压电平配置过程需要在D MA发送数据之前,因此本例巧妙地利用了DMA传输前PCI-e配置过程将控制命令传输到板子,而不使用传统的PIO过程,这样极大的减少了芯片的开支。
具体过程为:上位机在获得采集卡配置信息的同时,将配置空间中的基址寄存器映射到上位机的内存中,为其开辟一块与基址寄存器大小相等的内存空间。本次设计中DMA控制寄存器被定义映射于PCI-e的基址寄存器BAR0空间中,类型为Memory,大小为256字节,
BAR0空间使用如下图5示:
图5 BAR0空间使用
Figur7 Space use
由此可见,控制寄存器剩余位都可作为命令位伴随配置过程发送到下位机,这里选取随意的四位作为传输位即可实现。
6 实验测试结果
6.1 实验环境搭建
为测试本上位机程序运行情况,系统测试环境搭建如下图6示:
本次设计采用NI公司的PXIe-6544数字波形发生器作为外部数据发送端。PXIe-6544数字波形发生器具有100 MHz最大时钟频率,可以准确的产生32通道的数据,首先保证了待采集数据的准确性。将PXIe-6544输出口与采集卡I/O口用数据线连接,用PXIe-6544循环发送一定有规律量数据,通过上位机显示界面配置DMA接收过程,接收数据并在显示界面观察数据与PXIe-6544发送数据是否一致。
图6 整体测试环境
Figur7 Overall test environment
6.2 测试结果
观察可得,不同速率与不同电平下,上位机显示数据与PXIe-6544发送数据一致,得到实验结果如下图7示:
图7 测试结果
Figur7 Test results
7 结束语
本次设计主要设计了基于PCI-e高速板卡接收数据上位机应用程序的设计,测试与实现。在Windows XP SP3操作系统下,上位机应用软件能够稳定工作,在PCI-e X1链路下,数据采集处理显示都可以满足高速数据传输的要求。同时,本次设计的上位机程序具有很强的可移植性,只需经过少许修改,就能够应用于其它PCI-e设备中,可以广泛使用于各种数据显示等实际应用中,具有较高的实用价值。
参考文献:
- 郭雅萌. LabWindows/CVI与PCI数据采集卡通信技术研究 [J]. 电子测量技术,2007,30(5): 78-80.
- 王 齐. PCI Express体系结构导读[M].北京:机械工业出版社,2010.
- 何 宾. Xilinx可编程逻辑器件设计技术详解[M]. 北京:清华大学出版社,2010.
- 朱中锐,蔡志明,郭 岩. 基于LabWindows/CVI数据采集系统[J]. 电子测量技术,2007,30(1): 105-106.
- 王建新,隋美丽. LabWindows/CVI虚拟仪器设计技术[M]. 北京,化学工业出版社,2013.
- 杨东升,王高峰.多线程技术在虚拟仪器开发软件LabWindows/CVI中的实现 [J]. 电测与仪器,2005,42(471): 39-41.
- 成凤敏.多线程技术在虚拟仪器软件开发中的应用[J] 测控技术,2004,34(2):48-50.
- 陈怀民.基于CVI的多通道串口板卡测试软件的设计与实现 [J].测控技术,2010,29(10):18-81.
- 王海涛,付 钧,鲜 勇,等. 基于LabWindows/CVI的数据采集系统软件设计[J]. 舰船电子工程,2010,30(5): 64-66
2/3 首页 上一页 1 2 3 下一页 尾页