0

我需要这方面的帮助。

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

得出的结论是,大多数情况下,DLL 导出函数可以在 1 毫秒内完成。但有时从调用 DLL 函数到它返回的时间点的时间戳甚至是 600 毫秒。这会导致从属端的缓冲区溢出和数据丢失。实际上它是我正在使用的 USB 到 SPI 转换器。DLL 接收 USB 馈送并在另一端发出 SPI 数据。所以如果这个函数需要 600 毫秒才能返回,我会丢失 SPI 从机上的数据。

在分析 DLL 的功能时,它们所用的时间不超过 15 毫秒(尽管考虑到 15 MHz 的 SPI 速度,我们读取 4 个字节,但这个量级的 SPI 读取和写入也很多)。

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

请建议。感谢您对此的帮助。

谢谢,萨库尔

4

2 回答 2

0

我也偶然发现了“您是否调用了 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 完成的。。?

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

于 2013-02-07T14:22:31.963 回答
0

令人怀疑的是,调用 DLL 会导致 600 毫秒。向我们展示 DLL 函数的代码,这可能会有所帮助。这种延迟更可能的原因是其中之一。

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

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

  3. 内存不足和代码被分页进出。

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

于 2013-01-09T09:37:30.000 回答