问题记录:关于WinDriver和CVI驱动PCI读写执行速度对比

平台:ise14.7,Win driver10.21,Visual Studio 2015,LabWindows CVI 2013

操作系统:Windows7

硬件设备:PCI板卡

最近在开发过程中,作为一个逻辑开发人员。需要在PCI总线上映射其他接口时序。在写入周期期间将PCI总线上的写入接入其他接口上,在读取期间将PCI总线上的读取时序接入其他接口上并添加初始化延迟16个周期。

在使用Windriver驱动开发,和CVI驱动开发测试硬件的读写时发现了一个现象。

在CVI中插入读写BAR1空间代码。

			///初始化操作如下///
			
			///

			for(int i=0;i<10000;i++)
			{
				viOut32(*vi, RAM_SPACE, 0x00, 0xaaaa);
				viIn32(*vi, RAM_SPACE, 0x00, &val32_1);
				viOut32(*vi, RAM_SPACE, 0x00, 0xaaaa);
				viIn32(*vi, RAM_SPACE, 0x00, &val32_1);
				if(val32_1 != 0xaaaa)
					printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n",i,val32_1,0xaaaa);
				viOut32(*vi, RAM_SPACE, 0x00, 0x5555);
				viIn32(*vi, RAM_SPACE, 0x00, &val32_1);
				if(val32_1 != 0x5555)
					printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n",i,val32_1,0x5555);
				
				
			}

下面说明一下读写这两个函数。

				viOut32(vi, SPACE, Offset, value);
				viIn32(vi, SPACE, Offset, value);

viOut32:向接口中写入32位单位数据。

viIn32:从接口中读取32位单位数据。

vi

SPACE

Offset

value

外部设备的句柄

外部设备上的BAR空间。

偏移地址

Write:写入值。

Read:读出值。

测试启动CVI,安装CVI的驱动文件。我直接在INF文件中修改PCI相关的参数。Vender ID与Device ID。

 如图中所示,这是CVI生成的驱动IN文件。这里我们之间查找替换,将设备ID替换为当前PCI设备ID号。

启动CVI读写后,并未出现读写不一致的情况(报错)

启动Windriver生成驱动文件,启动测试。

			for (int i = 0; i < 10; i++)
			{

				//read/write bar0
				/*
				WDC_WriteAddr32(hDev, dwAddrSpace, 0x00000000, 0x00005555);
				WDC_ReadAddr32(hDev, dwAddrSpace, 0x00000000, &u32Data);
				//printf(" from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x00005555);
				if (u32Data != 0x00005555)
					printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x00005555);
				WDC_WriteAddr32(hDev, dwAddrSpace, 0x00000000, 0x0000aaaa);
				WDC_ReadAddr32(hDev, dwAddrSpace, 0x00000000, &u32Data);
				if (u32Data != 0x0000aaaa)
					printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x0000aaaa);
				*/
				//read/write bar1
				
				WDC_WriteAddr32(hDev, 0x00000001, 0x00000000, 0x00005555);
				WDC_ReadAddr32(hDev, 0x00000001, 0x00000000, &u32Data);
				WDC_WriteAddr32(hDev, 0x00000001, 0x00000000, 0x00005555);
				WDC_ReadAddr32(hDev, 0x00000001, 0x00000000, &u32Data);
				WDC_WriteAddr32(hDev, 0x00000001, 0x00000000, 0x00005555);
				WDC_ReadAddr32(hDev, 0x00000001, 0x00000000, &u32Data);
				//if (u32Data != 0x00005555)
					//printf("diffenent from = %i read bar1 0x00 =%x write data is  =%x\n", i, u32Data, 0x00005555);
				
				WDC_WriteAddr32(hDev, 0x00000001, 0x00000000, 0x0000aaaa);
				WDC_ReadAddr32(hDev, 0x00000001, 0x00000000, &u32Data);
				if (u32Data != 0x0000aaaa)
					printf("diffenent from = %i read bar1 0x00 =%x write data is  =%x\n", i, u32Data, 0x0000aaaa);
				
			}

这里关于如何使用已经在上一篇文章中。

(646条消息) Windriver驱动开发工具使用快速入门_hy_520520的博客-CSDN博客

启动后,运行代码发现出现了如下错误。

在ISE中添加chipscope采集。

发现了问题所在。即CVI执行:

viOut32(vi, SPACE, Offset, value);
viIn32(vi, SPACE, Offset, value);

 读速度比wivdriver执行:

     WDC_ReadAddr32(hDev, dwAddrSpace, dwOffset, &u32Data) :
     WDC_WriteAddr32(hDev, dwAddrSpace, dwOffset, u32Data);

执行的速度要慢。

具体的信号采集情况如下。

首先是使用CVI执行viOut32viIn32。可以看到波形在执行了一次写入后,在执行下一个读出的时候大概使用了200个周期左右。

下面是使用WinDriver使用VS2015读写的采集情况。代码中我们使用了四次读写,可以看到使用WinDriver驱动WDC_ReadAddr32WDC_WriteAddr32的执行速度要比CVI的执行速度快很多。写入后读出的执行,在写入后五个周期就会进入读出阶段。在下一次写入读出之间间隔了100个周期左右。 

 分析可以知道,使用WinDriver生成的驱动代码执行速度更快,反应更接近硬件。而CVI的代码执行到硬件层后速度较慢。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wind River是一家领先的嵌入式系统开发公司,提供了丰富的解决方案和工具,帮助开发开发嵌入式软件和驱动程序。在开发PCI驱动时,我们可以借助Wind River提供的开发工具和支持来简化驱动开发的过程。 首先,我们可以使用Wind River提供的操作系统和开发工具来创建一个适用于PCI设备的驱动程序。Wind River提供了实时操作系统(RTOS)VxWorks和Linux等多种操作系统,可以根据项目需求选择合适的操作系统进行开发。同时,Wind River还提供了专用的驱动开发工具套件,如Wind River Workbench,用于创建、调试和测试驱动程序。 其次,Wind River还提供了丰富的PCI驱动开发支持。他们的技术团队可以提供专业的咨询和指导,帮助开发者解决在开发过程中遇到的问题。他们还提供了大量的开发文档、案例和示例代码,可以加快驱动开发的进度,提高开发效率。 此外,Wind River通过其庞大的合作伙伴网络,可以提供各种硬件设备的支持。无论是开发自己的PCI设备还是对已有的PCI设备进行驱动开发,我们可以通过Wind River的合作伙伴获取相关的硬件支持,确保驱动程序与硬件之间的兼容性和稳定性。 综上所述,使用Wind River开发PCI驱动可以帮助我们简化开发过程、提高开发效率,并保证与硬件设备的兼容性。作为一家专注于嵌入式系统开发的公司,Wind River凭借其作为行业领导者的地位和丰富的经验,是我们开发PCI驱动的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值