Tôi cần ngăn bộ xử lý vào trạng thái không hoạt động (trạng thái không C0 C). Phải thừa nhận rằng tôi không biết nhiều về bộ vi xử lý C và P bang nên chịu với tôi. Chúng tôi sử dụng máy ảnh từ nhà cung cấp bên thứ ba, thỉnh thoảng cung cấp khung bị hỏng. Nhà cung cấp đã xác định rằng khi CPU đi vào trạng thái không hoạt động, nó can thiệp vào việc truyền khung hình qua firewire. Để xác nhận điều này, tôi đã sử dụng mã sau trên máy tính Windows 7 và thực sự, vô hiệu hóa trạng thái không hoạt động đã giải quyết được sự cố.Cố gắng vô hiệu hóa Trạng thái không hoạt động của bộ xử lý (trạng thái C) trên 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);
Nếu tôi chạy ứng dụng của tôi và mở Windows permon và thêm% C1 Time,% C2 Thời gian và thời gian% C3 Tôi thấy rằng họ là tất cả không khi tôi vô hiệu hóa những tình trạng này, khi tôi cho phép chúng tôi thấy khá một chút thời gian ở trạng thái C3 (đây là trên một máy tính lõi tứ Dell Precision T3500).
Tôi cũng cần thực hiện điều này trên XP tuy nhiên các cuộc gọi này không khả dụng trên XP. Vì vậy, tôi đã cố gắng làm như sau để vô hiệu hóa các trạng thái nhàn rỗi
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");
}
}
}
Tuy nhiên khi tôi chạy ứng dụng của tôi, tôi vẫn thấy rằng bộ vi xử lý được dành nhiều thời gian ở trong trạng thái C1 (bằng cách nhìn vào các quầy cùng trong perfmon). Và tôi vẫn nhận được vấn đề hình ảnh bị hỏng của tôi. Máy tính XP là một máy tính đơn lõi Dell Optiplex.
Có ai biết cách tôi có thể ngăn truy cập vào bất kỳ trạng thái C1-C3 nào trên XP không? Như tôi đã nói có vẻ như tôi đã thực hiện nó trên Windows 7.
Ồ, nghe có vẻ đau đớn. Tôi cho rằng nhà cung cấp chỉ cần cung cấp một trình điều khiển mà * hoạt động * là ra khỏi câu hỏi? – jalf
Bạn không chắc chắn nếu điều này là hoàn toàn có liên quan, nhưng sẽ không thiết lập 'Policy.ProcessorPolicyAc.DynamicThrottle' để' PO_THROTTLE_NONE' có thể giúp đỡ? – Hasturkun
Ha ... có vẻ như bây giờ là jalf. Chúng tôi đang làm việc để thay đổi nhà cung cấp nhưng hiện tại tôi đang bị kẹt. Thực sự đau đớn. – mash