Попытка отключить состояния простоя процессора (состояния C) на ПК с Windows

Мне нужно предотвратить переход процессора в состояние простоя (состояние, отличное от 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.

7
задан mash 15 March 2012 в 13:57
поделиться