Share Pastebin
Guest
Public paste!

Martin

By: a guest | Aug 11th, 2009 | Syntax: Perl | Size: 2.05 KB | Hits: 148 | Expires: Never
Copy text to clipboard
  1. #!/usr/bin/perl -w
  2.  
  3. my $CPULEV="dev.cpu.0.freq_levels";
  4. my $CPUFREQ="dev.cpu.0.freq";
  5. my $CPUTEMP="hw.acpi.thermal.tz0.temperature";
  6.  
  7. my $CPUMAXTEMP=75;
  8.  
  9. my @levels=`sysctl $CPULEV`;
  10. $levels=$levels[0];
  11.  
  12. @levels=reverse (split ' ', $levels);
  13. pop @levels;
  14. foreach (@levels) {
  15.         s/\/.*//;
  16. }
  17.  
  18. print join ' ',@levels;
  19.  
  20. my @hist_temp=();
  21. my @hist_freq=();
  22.  
  23. my $curfreq=&getval($CPUFREQ);
  24. my $curtemp=&getval($CPUTEMP);
  25. my $lastfreq=$curfreq;
  26.  
  27. my $samplecount=10;
  28.  
  29. my $i;
  30. my $j;
  31. for ($i=0; $i<$samplecount; $i++) {
  32.         $hist_temp[$i]=$curtemp;
  33.         $hist_freq[$i]=$curfreq;
  34. }
  35.  
  36. while (1) {
  37.         $i=($i+1)%($samplecount);
  38.  
  39.         $hist_temp[$i]=&getval($CPUTEMP);
  40.         $hist_freq[$i]=$lastfreq;
  41.  
  42.         my $newfreq=0;
  43.         for ($j=0; $j<$samplecount; $j++) {
  44.                 $newfreq += $hist_freq[$j];
  45.         }
  46.         $newfreq = $newfreq / $samplecount;
  47.         print "Freq: $hist_freq[$i], temp: $hist_temp[$i] => want freq: $newfreq\n";
  48.  
  49.         my $sleeplength=5;
  50.         my $tfreq=$newfreq;
  51.         if ($hist_temp[$i]>$CPUMAXTEMP) {
  52.                 $sleeplength=1;
  53.                 for ($j=0; $j<scalar(@levels); $j++) {
  54.                         $newfreq = ($levels[$j]<$tfreq) ? $levels[$j] : $newfreq;
  55.                 }
  56.         } else {
  57.                 $j=0;
  58.                 while (($j<scalar(@levels)) && ($levels[$j]<=$tfreq)) {
  59.                         $j++;
  60.                 }
  61.                 $j=scalar(@levels)-1 if ($j>=scalar(@levels));
  62.                 $newfreq=$levels[$j];
  63.         }
  64.  
  65.         &setfreq($CPUFREQ, $newfreq);
  66.         sleep $sleeplength;
  67. }
  68.  
  69. sub getval {
  70.         my @pa=@_;
  71.  
  72.         my @res = `sysctl $pa[0]`;
  73.         $res=$res[0];
  74.         $res =~ s/.*: //;
  75.         $res =~ s/[A-Z]$//;
  76.  
  77.         return int($res);
  78. }
  79.  
  80. sub setfreq {
  81.         my @pa=@_;
  82.  
  83.         if ($lastfreq!=$pa[1]) {
  84.  
  85.                 $setfreq = "sysctl $pa[0]=$pa[1]";
  86.                 print "$setfreq\n";
  87.                 my $set=`$setfreq`;
  88.                 $lastfreq=$pa[1];
  89.         }
  90.         return 0;
  91. }