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