IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[WinNT] [C/C++] Récupérer la température du processeur (et autres infos)


Sujet :

Windows

  1. #1
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut [WinNT] [C/C++] Récupérer la température du processeur (et autres infos)
    Bonjour à tous,

    J'ai un petit programme en C++ qui fonctionne sous WinNT et qui permet de récupérer la température dans le processeur et la vitesse du ventilateur.
    Le problème est que ce programme n'est utilisable que pour un chipset donné (ITE IT8705F) et je dois adapter les sources pour un autre (VIA VT 82C686B).

    Voici déjà l'essentiel du code source pour le chipset ITE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    long CChipsetMonitoringDlg::GetIteDatas()
    {	
    	HANDLE h;
    	//On load le driver giveio
        	h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,	OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    	if(h == INVALID_HANDLE_VALUE)//le driver n'est pas installé donc on envoie cette info : 0
    	{
            AfxMessageBox("Error while loading giveio");
    		return;
    	}
    
    	CloseHandle(h);
    
    	long divisor , revolution , div ;
    
    	_outp(0x290 + 0x05 , 0x2a);
    	m_lT1 = (signed char) _inp(0x290 + 0x06 );
    
    //	tf = 9*t/5 + 32 ;//Conversion Celsius -> Farenheit
    
    	_outp(0x290 + 0x05 , 0x2b);
    	m_lT2 = (signed char)_inp(0x290 + 0x06 );
    
    	_outp(0x290 + 0x05 , 0x0b);
    	divisor = _inp(0x290 + 0x06 );
    
    	_outp(0x290 + 0x05 , 0x0d);
    	revolution = _inp(0x290 + 0x06 );
    
    	divisor &= 0x07 ; // 0111 : les trois premiers bits
    
    	div = (long) pow(2.00,divisor);
    
    	m_lFanSpeed1 = (long )(1350000.00 / (div * revolution ) );
    
    	return 0;
    }
    J'ai compris que toutes les adresses données sont différentes d'un chipset à un autre. J'ai donc trouvé dans la doc du chipset ITE à quoi elle correspondent :
    0x2a TMPIN2 Temperature Reading Register
    0x2b TMPIN3 Temperature Reading Register
    0x0d Fan Tachometer 1 Reading Register
    0x0b Fan Tachometer Divider Register
    Adress register Base address + 0x05
    Data register Base address + 0x06

    Par contre, pas moyen de trouver d'où vient cette valeur pour Base Address : 0x290 :

    Dans la doc pour le chipset VIA je pense avoir trouvé les adresses correspondant aux températures et aux vitesses de ventilateur, mais je ne sait pas où trouver l'adresse de base (adresse du port ?).

    Je suis complétement débutant dans ce genre de programmation, est-ce que quelqu'un peut me donner des pistes ?

  2. #2
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Ce problème n'a pas l'air de déchaîner les passions

    Je vais quand même rajouter un truc que je viens de comprendre, si jamais quelqu'un qui a le même problème que moi tombe sur ce message.

    Le driver giveio n'est pas par défaut dans windows, il faut l'installer (on peut le trouver ICI).

    Ca ne règle pas mon problème mais ça fait avancer un petit peu le schmilblik.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Est-ce que tu as fait un tour du côté de WMI. Ca permet de connaître les différents composants de la machine. Peut-être que ça permet aussi de faire des modifs...

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par moldavi
    Est-ce que tu as fait un tour du côté de WMI. Ca permet de connaître les différents composants de la machine. Peut-être que ça permet aussi de faire des modifs...
    Une classe existe pour récupérer ces infos mais ne semble pas implémenté pour tous les Bios des CM du marché. Et ce type d'infos c'est Read Only.

  5. #5
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par moldavi
    Salut.

    Est-ce que tu as fait un tour du côté de WMI. Ca permet de connaître les différents composants de la machine. Peut-être que ça permet aussi de faire des modifs...
    Ca m'a l'air d'être une solution payante...

    Citation Envoyé par Laurent Dardenne
    Une classe existe pour récupérer ces infos mais ne semble pas implémenté pour tous les Bios des CM du marché. Et ce type d'infos c'est Read Only.
    Quelle est le nom de cette classe ? Je n'ai rien trouvé à propos de ça quand j'ai fait mes recherches (je rappelle que je cherche une solution sous WinNT)

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    WMI est gratuit mais pour NT il n'est pas natif.
    Sinon regarde ce post il traite du sujet avec de nombreux liens, à vérifier si tu peux en faire qq chose :
    http://www.developpez.net/forums/showthread.php?t=7770

  7. #7
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Merci pour le lien, je vais regarder tout ça.
    ...bizarre quand même que je ne l'ai pas trouvé en faisant une recherche sur le forum.

  8. #8
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai commencé à regarder les WMI et... je suis complétement paumé
    Il y a tellement d'info partout que je m'y perds.

    Déjà la plupart des exemples que j'ai pu trouver sont en VB ou en C#, le rare exemple trouvé en C++ sur CodeProject ne compile pas (manque wbemidl.h) et même si j'arrivais à le faire tourner je ne sais pas comment récupérer ma température.
    Des articles comme celui-ci restent pour moi relativement obscures.

    Est-ce que quelqu'un à un lien avec des exemples simples à me donner ?

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Le mieux est d'utiliser un script VBS pour vérifier si cela fonctionne avec ta CM avant de plonger dans les API.
    J'essaie de te trouver ça prochainement.
    Sinon les docs citées sur le BIOS ne sont pas exploitable ?

  10. #10
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai trouvé ici un script vb qui devrait me récupérerer la température.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    wscript.echo "Temperature, version 0.1"
    
    sub ShowServices(vClass)
      'Declare our needed variables...
      Dim objLocator, objService, objWEBMCol
      Dim objWEBM, objProp, propitem, objItem, str
    
      Set objLocator = _
         CreateObject("WbemScripting.SWbemLocator")
      Set objService = _
         objLocator.ConnectServer() ' Connect to local PC
    
      Set objWEBM = objService.get(vclass) 
      Set objWEBMCol = objWEBM.Instances_ 
      Set objProp = objWebm.properties_ 
    
    
      For Each propItem in objProp
        str = propItem.Name
    
        For Each objItem in objWEBMCol 
           str = str & ", " & Eval("objItem." & propItem.Name)
        Next
    
        wscript.echo str
      Next 
    end sub
    
    ShowServices "Win32_TemperatureProbe"
    Quand je l'exécute avec cscript j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Temperature, version 0.1
    Accuracy
    Availability
    Caption
    [...]
    UpperThresholdFatal
    UpperThresholdNonCritical
    Si ça peut aider...

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 69
    Points : 89
    Points
    89
    Par défaut
    pour réponde à la question d'origine, si tu cherche les ports correspondants à un composant spécifique il faut consulter la table SMBios présent en RAM, elle te donnera les I/O des composants. Et comme pour ton programme, on ne peut y avoir accés qu'en ring 0 (début de la ram).

    http://www.dmtf.org/standards/smbios/ (en fait WMI est basé dessus pour la partie hardware)

    Par contre rien ne t'assure (et c'est souvent le contraire) que pour des composants assurant la même fonctionnalitée que la méthode d'interrogation reste la même (mis à part pour les standards DMA, etc ...) c'est souvent la jungle.

    Si tu ne la trouve pas en table SMBios cela vaudra dire que le port est figé :
    - soit utilisé par tout les constructeurs pour cette fonctionnalité.
    - soit défini dans une plage réservé au fabriquant de CM (et là chacun fait sa propre popote le plus souvent lol)

  12. #12
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par DegubError
    pour réponde à la question d'origine, si tu cherche les ports correspondants à un composant spécifique il faut consulter la table SMBios présent en RAM, elle te donnera les I/O des composants. Et comme pour ton programme, on ne peut y avoir accés qu'en ring 0 (début de la ram).

    http://www.dmtf.org/standards/smbios/ (en fait WMI est basé dessus pour la partie hardware)
    Merci bien, je vais regarder ça.

    Citation Envoyé par DegubError
    Par contre rien ne t'assure (et c'est souvent le contraire) que pour des composants assurant la même fonctionnalitée que la méthode d'interrogation reste la même (mis à part pour les standards DMA, etc ...) c'est souvent la jungle.
    Ce point là n'est pas un problème, je souhaite juste que ça fonctionne pour une seule référence de carte mère.

Discussions similaires

  1. [Développement] récupérer la température du (des) processeur(s)
    Par d'Oursse dans le forum Apple
    Réponses: 1
    Dernier message: 20/05/2011, 08h46
  2. Récupérer la température du processeur en C
    Par swingNJava dans le forum Windows
    Réponses: 1
    Dernier message: 09/10/2008, 17h04
  3. Reprendre la température du processeur
    Par ehmppowa dans le forum C++
    Réponses: 2
    Dernier message: 23/12/2005, 10h07
  4. Température du processeur
    Par duplo dans le forum Assembleur
    Réponses: 2
    Dernier message: 04/11/2005, 21h44
  5. Récupérer la température du processeur (CPU)
    Par cyber_N dans le forum MFC
    Réponses: 4
    Dernier message: 05/09/2005, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo