Je dois empêcher le processeur d'entrer dans un état inactif (état autre que C0 C). Certes, je ne connais pas grand-chose à propos des états C et P du processeur, alors gardez-moi. Nous utilisons une caméra d'un fournisseur tiers qui fournit occasionnellement des trames corrompues. Le fournisseur a déterminé que lorsque la CPU entre dans un état inactif, elle interfère avec la transmission de la trame sur le firewire. Pour confirmer cela, j'ai utilisé le code suivant sur un PC Windows 7 et en effet, la désactivation des états inactifs a résolu le problème.Tentative de désactivation des états d'inactivité du processeur (états C) sous Windows 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);
Si je lance mon application et ouvrez Windows Permon et ajouter% Temps C1,% C2 Temps et% du temps C3 Je vois qu'ils sont tous nuls quand je désactiver ces états, quand je leur permettre, je vois tout à fait un peu de temps passé à l'état C3 (c'est sur un PC quadricœur Dell Precision T3500).
J'ai également besoin de faire cela sur XP mais ces appels ne sont pas disponibles sur XP. Donc, je tentais de faire ce qui suit pour désactiver les états de repos
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");
}
}
}
Cependant quand je lance mon application, je vois encore que le processeur est de passer du temps dans l'état C1 (en regardant les mêmes compteurs dans perfmon). Et j'ai toujours mon problème d'image corrompue. Le PC XP est un PC optiplex Dell à cœur unique.
Est-ce que quelqu'un sait comment je peux empêcher l'entrée dans l'un des états C1-C3 sous XP? Comme je l'ai dit, il semble que je l'ai fait sur Windows 7.
Wow, cela semble douloureux. Je suppose que convaincre le vendeur de livrer un pilote qui fonctionne * est hors de question? – jalf
Vous ne savez pas si cela est tout à fait pertinent, mais ne pas définir 'Policy.ProcessorPolicyAc.DynamicThrottle' sur' PO_THROTTLE_NONE' peut-être aider? – Hasturkun
Ha ... il semble que ce soit pour le moment jalf. Nous travaillons à changer de fournisseur mais pour l'instant je suis coincé. Douloureux en effet. – mash