我需要防止处理器进入空闲状态(非 C0 C 状态)。诚然,我对处理器 C 和 P 状态了解不多,所以请耐心等待。我们使用来自第三方供应商的相机,偶尔会提供损坏的帧。供应商已确定当 CPU 进入空闲状态时,它会干扰通过火线传输帧。为了确认这一点,我在 Windows 7 PC 上使用了以下代码,实际上,禁用空闲状态解决了这个问题。
//WIN7
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);
如果我运行我的应用程序并打开 Windows permon 并添加 %C1 时间、%C2 时间和 %C3 时间,当我禁用这些状态时,我发现它们都为零,当我启用它们时,我看到在C3 状态(这是在 Dell Precision T3500 四核 PC 上)。
我也需要在 XP 上执行此操作,但是这些调用在 XP 上不可用。所以我尝试执行以下操作来禁用空闲状态
unsigned int ActPwrSch;
DWORD currPolicy,newPolicy, curr1Policy,curr2Policy, new1Policy, new2Policy;
MACHINE_PROCESSOR_POWER_POLICY Policy;
if(GetActivePwrScheme(&ActPwrSch))
{
if(ReadProcessorPwrScheme(ActPwrSch,&Policy))
{
printf("Read Power Scheme:\n");
//if(Policy.ProcessorPolicyAc.DisableCStates!=0)
currPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
curr1Policy = Policy.ProcessorPolicyAc.Policy[1].AllowPromotion;
curr2Policy = Policy.ProcessorPolicyAc.Policy[2].AllowPromotion;
Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = 0;
Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = 0;
Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = 0;
newPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
if(WriteProcessorPwrScheme(ActPwrSch,&Policy))
{
printf("WriteProcessorPwrScheme succeed\n");
if(SetActivePwrScheme(ActPwrSch,0,0))
{
printf("SetActivePwrScheme succeed!!\n");
}
}
}
但是,当我运行我的应用程序时,我仍然看到处理器在 C1 状态下花费时间(通过查看 perfmon 中的相同计数器)。而且我仍然遇到损坏的图像问题。XP PC 是单核戴尔 optiplex PC。
有人知道我如何防止进入 XP 上的任何 C1-C3 状态吗?正如我所说,我似乎已经在 Windows 7 上完成了它。