saber - ¿Cómo acceder a los sensores de calor de la CPU?
medir temperatura pc online (4)
Estoy trabajando en un software en el que necesito acceder a los sensores de temperatura de la CPU y controlarlos.
No sé mucho de interfaz de hardware; Sólo sé cómo interactuar con el ratón. He buscado mucho en Google pero no pude encontrar ninguna información relevante o pieza de código.
Realmente necesito agregar esto en mi software. Por favor guíeme cómo tener el control sobre los sensores usando C o C ++ o ASM.
Probablemente depende del sistema operativo. En GNU / Linux, está relacionado con ACPI. Y algunos hardware ni siquiera tienen los dispositivos físicos para medir la temperatura.
Puede leerlo desde el MSAcpi_ThermalZoneTemperature en WMI
El uso de WMI desde C ++ es un poco complicado, consulte la explicación de MSDN y ejemplos.
nota: se cambió la respuesta original, inútil
Sin un controlador de kernel específico, es difícil consultar la temperatura, excepto a través de WMI. Aquí hay un fragmento de código C que lo hace, basado en la clase MSAcpi_ThermalZoneTemperature de WMI:
HRESULT GetCpuTemperature(LPLONG pTemperature)
{
if (pTemperature == NULL)
return E_INVALIDARG;
*pTemperature = -1;
HRESULT ci = CoInitialize(NULL); // needs comdef.h
HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (SUCCEEDED(hr))
{
IWbemLocator *pLocator; // needs Wbemidl.h & Wbemuuid.lib
hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLocator);
if (SUCCEEDED(hr))
{
IWbemServices *pServices;
BSTR ns = SysAllocString(L"root//WMI");
hr = pLocator->ConnectServer(ns, NULL, NULL, NULL, 0, NULL, NULL, &pServices);
pLocator->Release();
SysFreeString(ns);
if (SUCCEEDED(hr))
{
BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature");
BSTR wql = SysAllocString(L"WQL");
IEnumWbemClassObject *pEnum;
hr = pServices->ExecQuery(wql, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
SysFreeString(wql);
SysFreeString(query);
pServices->Release();
if (SUCCEEDED(hr))
{
IWbemClassObject *pObject;
ULONG returned;
hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned);
pEnum->Release();
if (SUCCEEDED(hr))
{
BSTR temp = SysAllocString(L"CurrentTemperature");
VARIANT v;
VariantInit(&v);
hr = pObject->Get(temp, 0, &v, NULL, NULL);
pObject->Release();
SysFreeString(temp);
if (SUCCEEDED(hr))
{
*pTemperature = V_I4(&v);
}
VariantClear(&v);
}
}
}
if (ci == S_OK)
{
CoUninitialize();
}
}
}
return hr;
}
y algún código de prueba:
HRESULT GetCpuTemperature(LPLONG pTemperature);
int _tmain(int argc, _TCHAR* argv[])
{
LONG temp;
HRESULT hr = GetCpuTemperature(&temp);
printf("hr=0x%08x temp=%i/n", hr, temp);
}
Supongo que está interesado en una CPU IA-32 (Arquitectura Intel, 32 bits) y Microsoft Windows.
El Registro Específico del Modelo (MSR) IA32_THERM_STATUS
tiene 7 bits que codifican la "Lectura digital (bits 22:16, RO) - Lectura de temperatura digital en 1 grado Celsius relativa a la temperatura de activación TCC". (consulte "14.5.5.2 Lectura del sensor digital" en "Arquitecturas Intel® 64 e IA-32 - Manual del desarrollador de software - Volumen 3 (3A y 3B): Guía de programación del sistema" http://www.intel.com/Assets/PDF/manual/325384.pdf ).
Por IA32_THERM_STATUS
tanto, IA32_THERM_STATUS
no le dará la "temperatura de la CPU" sino algún proxy para ello.
Para leer el registro IA32_THERM_STATUS
usted usa la instrucción rdmsr
asm, ahora no se puede llamar a rdmsr
desde el código de espacio del usuario y, por lo tanto, necesita algún código de espacio del kernel (¿quizás un controlador de dispositivo?).
También puede usar el __readmsr
intrínseco (consulte http://msdn.microsoft.com/en-us/library/y55zyfdx(v=VS.100).aspx ) que tiene de todos modos la misma limitación: "Esta función solo está disponible en modo kernel ".
Cada núcleo de CPU tiene sus propios sensores térmicos digitales (DTS) y, por lo tanto, se necesita algo más de código para obtener todas las temperaturas (¿quizás con la máscara de afinidad? Vea Win32 API SetThreadAffinityMask
).
Hice algunas pruebas y en realidad encontré una correlación entre las lecturas IA32_THERM_STATUS
DTS y la prueba Prime95 "FFT grandes en el lugar (calor máximo, consumo de energía, algo de RAM probado)". Prime95 es ftp://mersenne.org/gimps/p95v266.zip
No encontré una fórmula para obtener la "temperatura de la CPU" (lo que sea que eso pueda significar) de la lectura DTS.
Editar:
Citando un interesante post de TJunction Max? #THERMTRIP? #PROCHOT? por "fgw" (diciembre de 2007):
no hay forma de encontrar tjmax de un determinado procesador en ningún registro. por lo tanto, ningún software puede leer este valor. lo que varios desarrolladores de software están haciendo es simplemente asumir una cierta función de un determinado procesador y mantener esta información en una tabla dentro del programa. además de eso, tjmax ni siquiera es el valor correcto que buscan. De hecho, están buscando un umbral de temperatura de activación TCC. Este umbral de temperatura se utiliza para calcular las correcientes absolutas actuales. teóricamente, puede decir: temperatura absoluta = umbral de temperatura de activación TCC - DTS, tuve que decir teóricamente porque, como se indicó anteriormente, este umbral de temperatura de activación TCC no puede ser leído por el software y debe ser asumido por el programador. en la mayoría de las situaciones (coretemp, everest, ...) asumen un valor de 85C o 100C según la familia de procesadores y la revisión. Como este umbral de temperatura de activación de TCC se calibra durante la fabricación individualmente por procesador, puede ser de 83C para un procesador pero puede ser de 87C para el otro. Teniendo en cuenta la forma en que esos programas calculan las corretemperaturas, puede determinar por sí mismo, ¡cuán precisas son las coretemperaturas absolutas! Ni tjmax ni el "más deseado" umbral de temperatura de activación TCC se pueden encontrar en ningún documento de inteligencia pública. Después de algunas discusiones sobre el foro de desarrolladores de Intel, Intel no muestra señales de hacer que esta información esté disponible.