Windows:从内核模式驱动程序

时间:2018-01-24 10:33:55

标签: c windows device-driver cpu-speed

我正在编写一个音频设备驱动程序,需要实时处理设备中断。当CPU进入C3状态时,中断会延迟,从而导致驱动程序出现问题。有没有办法让驱动程序告诉操作系统不要进入空闲的C状态?

我发现可以从用户空间禁用空闲C状态:

const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);

但是,它是一个全局设置,可以被用户或其他应用程序覆盖(例如,当用户更改电源计划时)。

我需要的是像PoRegisterSystemState,但不是S和P状态,而是C状态。 (参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/preventing-system-power-state-changes

有没有办法实现这个目标?

=====

事实证明,没有一种支持的方法可以从内核空间禁用空闲C状态,并且用户空间中没有服务提供通用API来执行此操作。 控制C状态的方法来自“更改高级电源设置”对话框中的“处理器电源管理”,通过注册表或通过C API PowerWriteACValueIndex / PowerWriteDCValueIndex。

最初的问题是除了C1空闲状态之外的所有延迟中断,所以我需要禁用C2,C3和更深的空闲状态。禁用所有空闲C状态的问题,包括C1(如示例代码PowerWriteACValueIndex(NULL,scheme,& GUID_PROCESSOR_SETTINGS_SUBGROUP,& GUID_PROCESSOR_IDLE_DISABLE,DISABLED)所示)是CPU使用率报告为100%,以及一些应用程序(DAWs)感到困惑。

我的问题的解决方案是禁用除C1空闲状态之外的所有状态,这可以通过在处理器电源管理中设置以下值来完成:   - 处理器空闲阈值缩放 - >禁用缩放;   - 处理器空闲促进阈值 - > 100%;   - 处理器空闲降级阈值 - > 100%。

也许我会创建一个只使用PowerWriteACValueIndex / PowerWriteDCValueIndex API的服务。

0 个答案:

没有答案
相关问题