Conoscere la frequenza delle CPU mediante le funzioni esterne del API di Libcpufreq

Da Gambas-it.org - Wikipedia.

La libreria Libcpufreq consente di gestire le funzionalità del subsistema cpufreq del kernel di Linux.
In particolare consente di verificare le caratteristiche della CPU in ordine alla sua frequenza.

Per poter fruire delle sue risorse è necessario richiamare nel codice Gambas la libreria condivisa: "libcpufreq:0.0.0 ".

Mostriamo un semplice esempio:

Library "libcpufreq:0.0.0"

Public Struct cpufreq_policy
  minS As Long
  maxS As Long
  governor As Pointer
End Struct

' int cpufreq_cpu_exists(unsigned int cpu)
' Returns 0 if the specified CPU is present.
Private Extern cpufreq_cpu_exists(cpu As Integer) As Integer

' struct cpufreq_affected_cpus * cpufreq_get_affected_cpus(unsigned int cpu)
' Determines affected CPUs.
Private Extern cpufreq_get_affected_cpus(cpu As Integer) As Pointer

' unsigned long cpufreq_get_freq_kernel(unsigned int cpu)
' Determines current CPU frequency _kernel variant means kernel's opinion of CPU frequency.
Private Extern cpufreq_get_freq_kernel(cpu As Integer) As Long

' int cpufreq_get_hardware_limits(unsigned int cpu, unsigned long *min, unsigned long *max)
' Determines hardware CPU frequency limits.
Private Extern cpufreq_get_hardware_limits(cpu As Integer, minP As Pointer, maxP As Pointer) As Integer

' char * cpufreq_get_driver(unsigned int cpu)
' Determine CPUfreq driver used.
Private Extern cpufreq_get_driver(cpu As Integer) As String

' struct cpufreq_available_governors * cpufreq_get_available_governors(unsigned int cpu)
' Determines CPUfreq governors currently available.
Private Extern cpufreq_get_available_governors(cpu As Integer) As Pointer

' struct cpufreq_available_frequencies * cpufreq_get_available_frequencies(unsigned int cpu)
' Determines CPU frequency states available.
Private Extern cpufreq_get_available_frequencies(cpu As Integer) As Pointer

' struct cpufreq_policy * cpufreq_get_policy(unsigned int cpu)
' Determines CPUfreq policy currently used.
Private Extern cpufreq_get_policy(cpu As Integer) As Cpufreq_policy


Public Sub Main()

 Dim cpu, p As Pointer
 Dim b As Byte
 Dim mn, mx As Long
 Dim pol As New Cpufreq_policy
 
 While cpufreq_cpu_exists(b) = 0
   Inc b
 Wend
 Print "Sono presenti num. "; b;; "CPU\n"
  
 b = 0
     
 While True 
   cpu = cpufreq_get_affected_cpus(b)
   If cpu == 0 Then Exit
   b = Int@(cpu)
     
   Print "== Analisi della CPU n. "; b;; "=="
   cpufreq_get_hardware_limits(b, VarPtr(mn), VarPtr(mx))
   Print "Limiti hardware della frequenza:"
   Print Space(33); "Max. "; mx / 1000;; "Mhz\n"; Space(33); "Min. "; mn / 1000;; "Mhz"
   Print "\nDriver usato:                    "; cpufreq_get_driver(b)
   Print "\nRegolatori di frequenza:"
     
   p = cpufreq_get_available_governors(b)
   If p == 0 Then Error.Raise("Errore !")
   While IsNull(p) = False
     Print Space(33); String@(Pointer@(p))
     p = p + 8
     p = Pointer@(p)
   Wend
   
   With pol = cpufreq_get_policy(b)
     Print "\nIl regolatore '"; String@(.governor); "' può impostare la frequenza fra "; .minS / 1000;; "Mhz e "; .maxS / 1000;; "Mhz"
   End With
    
   p = cpufreq_get_available_frequencies(b)
   If p == 0 Then Error.Raise("Errore !")
   Print "\nSalti di frequenze disponibili:"
   While p > 0
     Print Space(33); Long@(p) / 1000;; "Mhz"
     p = p + 8
     p = Pointer@(p)
   Wend
     
   cpu = cpu + 8
   cpu = Pointer@(cpu)
   
   Print "\nFrequenza attuale della CPU  =   "; cpufreq_get_freq_kernel(b) / 1000;; "Mhz"
   Print "----------\n"  
     
   Inc b
 Wend
 
End


Riferimenti