Windows:从内核模式驱动程序禁用CPU空闲C状态

Windows:从内核模式驱动程序禁用CPU空闲C状态,c,windows,device-driver,cpu-speed,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, &G

我正在编写一个音频设备驱动程序,它需要实时处理设备中断。当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-状态。(参考号:)

有没有办法做到这一点

=====

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

最初的问题是除了C1空闲状态之外的所有延迟中断,所以我需要禁用C2、C3和更深的空闲状态。禁用所有空闲C状态,包括C1(如示例代码PowerWriteACValueIndex(NULL、scheme和GUID\u PROCESSOR\u SETTINGS\u SUBGROUP和GUID\u PROCESSOR\u idle\u DISABLE、DISABLED)中所示)的问题是CPU使用率报告为100%,并且一些应用程序(DAW)会混淆

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


也许我会创建一个服务,它将使用PowerWriteAppalueIndex/PowerWriteDCValueIndex API来实现这一点