Necesito evitar que el procesador entre en un estado inactivo (estado no C0 C). Es cierto que no sé mucho acerca de los estados del procesador C y P, así que tengan paciencia conmigo. Utilizamos una cámara de un proveedor externo que ocasionalmente entrega marcos dañados. El vendedor ha determinado que cuando la CPU entra en estado inactivo interfiere con la transmisión del cuadro sobre el cable firewire. Para confirmar esto, utilicé el siguiente código en una PC con Windows 7 y, de hecho, deshabilitar los estados inactivos resolvió el problema.Intentando deshabilitar estados inactivos del procesador (estados C) en PC con Windows
//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 funciono mi solicitud y abra Windows Permon y añadir el% C1 Tiempo,% Tiempo C2 y hora% C3 veo que todos son cero cuando desactivo estos estados, cuando yo les permitan veo bastante un poco de tiempo en el estado C3 (esto es en una PC Dell Precision T3500 de cuatro núcleos).
También necesito hacer esto en XP pero estas llamadas no están disponibles en XP. Así que he tratado de hacer lo siguiente para desactivar los estados de inactividad
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");
}
}
}
Sin embargo, cuando ejecuto mi aplicación Todavía veo que el procesador está gastando tiempo en el estado C1 (mirando a los mismos contadores en Monitor de rendimiento). Y todavía tengo mi problema de imagen corrupto. La PC XP es una PC Dell Optiplex de un solo núcleo.
¿Alguien sabe cómo puedo evitar la entrada en cualquiera de los estados C1-C3 en XP? Como dije, parece que lo he hecho en Windows 7.
Guau, eso suena doloroso. Supongo que conseguir que el proveedor solo entregue un controlador que * funciona * está fuera de discusión. – jalf
No estoy seguro de si esto es del todo relevante, pero ¿no sería posible establecer 'Policy.ProcessorPolicyAc.DynamicThrottle' en' PO_THROTTLE_NONE' posiblemente? – Hasturkun
Ha ... parece ser por ahora jalf. Estamos trabajando para cambiar de proveedor, pero por ahora estoy atascado. Doloroso de hecho. – mash