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



我需要帮助。

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

一个结论是,大多数时候DLL导出函数被认为在1毫秒内完成。但是有时,从调用DLL函数到返回DLL函数的时间戳甚至需要600毫秒。这会导致从端缓冲区溢出和数据丢失。实际上,它是我正在使用的USB到SPI转换器。DLL接收USB馈送;在另一端发送SPI数据。因此,如果这个函数需要600毫秒才能返回,我就会丢失SPI从站上的数据。

在分析DLL的函数时,它们不需要超过15毫秒(尽管SPI读取&考虑到SPI速度为15 MHz,我们读取4字节,这个量级的写入也很多)。

它是上下文移位时间吗?将DLL的代码纳入我的exe本身有帮助吗?我看到的唯一延迟只是跨越这个DLL的函数调用。有没有什么方法可以让我的应用程序在win7机器上获得更多的CPU时间?我正在使用Visual studio。

请建议。谢谢你的帮助。

谢谢,Sakul

通过调用DLL产生600ms的时间值得怀疑。向我们展示DLL函数的代码可能会有所帮助。这种延迟的更可能的原因是这些事情之一。

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

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

  3. 内存不足,代码正在被调入和调出

您是否使用任何分析工具对DLL进行了分析,以了解为什么需要这么长时间?

我也偶然发现了"你有没有调用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毫秒,甚至高达4秒。所以FPGA的研究人员正在研究这个问题。这是相同的点IO处理已完成的DLL..?

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

最新更新