从Windows exe调用Windows DLL导出的函数时的延迟或上下文转换时间

时间:2013-01-09 09:17:14

标签: windows windows-7 ftdi

我需要帮助。

当从Windows exe调用Windows DLL导出的函数时,我看到延迟或上下文转换时间。

如何得出结论,大多数情况下,DLL导出函数可以在1毫安以下完成。但有时候,从调用DLL函数到返回函数时的时间戳标记为600 mSecs。这是因为缓冲区溢出和从属端丢失数据。 实际上它是我正在使用的USB转SPI转换器。 DLL接收USB feed&在另一端发出SPI数据。因此,如果此函数需要600 mSecs返回,我会丢失SPI从器件上的数据。

在分析DLL的功能时,它们不会超过15 mSecs(尽管SPI读取和写入这个幅度也很多,考虑到SPI速度为15 MHz,我们读取4个字节)。

那是上下文转换时间吗?将DLL的代码合并到我的exe本身有帮助吗?我看到的唯一延迟只是在这个DLL的函数调用中。 有什么方法可以导致无抢占,所以我的应用程序在Win 7机器上获得更多的CPU时间。我正在使用Visual Studio。

请建议。感谢你的帮助。

谢谢, Sakul酒店

2 个答案:

答案 0 :(得分:0)

怀疑由于调用DLL而导致600ms。向我们展示DLL函数的代码,这可能有所帮助。这种延迟的可能性更大的原因之一就是其中之一。

  1. 你的DLL函数实际上正在做一些偶尔需要很长时间的事情。 I / O操作,日志记录,等待内核对象等等......你没有向我们展示任何代码,所以这只是猜测,但很有可能。

  2. 您的程序不是计算机上唯一运行的程序。如果你的应用程序占用了整个CPU核心(或整个处理器),当然它会被中断,以便系统上的其他线程可以运行。您是否致电SetThreadPrioritySetPriorityClass,看看是否有帮助?您还可以查看REALTIME_PRIORITY_CLASS

  3. 低内存和代码正在进入和退出。

  4. 您是否使用任何分析工具分析了您的DLL以了解为什么需要这么长时间?

答案 1 :(得分:0)

谢谢Selbie,我没有看到任何电子邮件说答案已经发布,所以不知道,你曾试图帮忙。感谢

我也偶然发现了“你有没有调用SetThreadPriority和SetPriorityClass来看看它是否有帮助?你还可以查看REALTIME_PRIORITY_CLASS。” 我仍然使用REALTIME_PRIORITY_CLASS,但也相信它应该有所帮助。 (目前我还看到-1作为有问题的线程的优先级,通过做

i8_priority = GetThreadPriority(     pDpc-> threadHandle);

            printf("\n 0 (threadHandle:0x%08X) i8_priority = %d \n ",  pDpc->threadHandle, i8_priority);

            SetThreadPriority(
pDpc->threadHandle,
2 );

) 无论是原创还是原创在执行SetThreadPriority后,仅给出-1。

不确定为什么?如果返回错误代码,则需要查看错误代码。

我们通过观察USB跟踪看到延迟的一个原因是设备有时无法从硬件中看到响应,因此需要600 mSecs甚至高达4秒。所以这是由FPGA小伙伴们研究的。这与你的DLL处理点的处理方式相同......?

我想尝试线程和类优先级的事情来看看它们有多大帮助,它们应该。

让我们看看我们走了多远。与此同时,请分享。

非常感谢, 问候, Sakul Gupta