Мне нужно предотвратить переход процессора в состояние простоя (состояние, отличное от C0 C). По общему признанию, я мало знаю о состояниях C и P процессора, так что терпите меня. Мы используем камеру стороннего поставщика, которая иногда передает поврежденные кадры. Поставщик определил, что когда ЦП переходит в состояние ожидания, он мешает передаче кадра по FireWire. Чтобы подтвердить это, я использовал следующий код на ПК с Windows 7, и действительно, отключение состояний простоя решило проблему.
//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).
Мне также нужно сделать это в 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 — это одноядерный компьютер Dell Optiplex.
Кто-нибудь знает, как предотвратить вход в любое из состояний C1-C3 в XP? Как я уже сказал, кажется, что я сделал это в Windows 7.