【os】Lock cpu freq on Linux and Android

Overview

Sometimes, we need to lock the cpu freq, so that:

  • profile source code with timer functions
  • etc.

Precondition

Need super user permision.

  • Android
    • devices must be rooted first, or else you only have read-only permision to files in /sys/devices/system/cpu/cpu0/cpufreq/...
  • Linux
    • Check if you have files in /sys/devices/system/cpu/cpu0/cpufreq/...
    • You have to use super user.

How to lock

  • set scaling_governor to userspace
  • set scaling_setspeed to freq you want.

See more details here:

 1 #!/bin/sh
 2 
 3 cpucount=`cat /proc/cpuinfo|grep processor|wc -l`
 4 
 5 if [ "x$1" = "x-h" ]; then
 6     echo "There are ${cpucount} cpu on this device."
 7     echo "This script will lock one of the cpu to the lowest freq."
 8     echo "For example: '$ ./lock_to_lowest_freq.sh 0' will:"
 9     echo "    lock cpu0 to the lowest freq." 
10     echo "    The lowest freq is the smallest one in /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"
11     exit
12 fi
13 
14 if [ "x$1" = "x" ]; then
15     printf "You must enter a cpu number, which is 0~%d.
" $((cpucount-1))
16     echo "Use -h to see more details."
17     exit
18 fi
19 
20 if [ $1 -lt 0 -o $1 -ge $cpucount ]; then
21     printf "You must enter a cpu number, which is 0~%d.
" $((cpucount-1))
22     echo "Use -h to see more details."
23     exit
24 fi
25 
26 FLROOT=/sys/devices/system/cpu/cpu${1}/cpufreq/
27 
28 echo "Available frequencies are: c"
29 cat ${FLROOT}scaling_available_frequencies
30 
31 echo "Available governors are: c"
32 cat ${FLROOT}scaling_available_governors
33 
34 echo "Current cpu${1} governor is: c"
35 cat ${FLROOT}scaling_governor
36 
37 echo "Current cpu${1} freq is:  c"
38 cat ${FLROOT}cpuinfo_cur_freq
39 
40 target_freq=`cat ${FLROOT}scaling_available_frequencies | sed 's/ /
/g' | sort -n | sed '/^$/d' | head -n 1` # get min freq
41 echo "This script will set cpu${1} governor to 'userspace', and set its freq to ${target_freq}."
42 echo -n "Continue? [y(default)/n]: "
43 read in
44 if [ -n "$in" -a ! "$in" = "y" ] ; then
45     exit
46 fi
47 
48 echo userspace > ${FLROOT}scaling_governor
49 echo ${target_freq} > ${FLROOT}scaling_setspeed
50 
51 echo "Current cpu${1} freq is: c"
52 cat ${FLROOT}cpuinfo_cur_freq
lock_low_freq.sh

Exceptions

For Android, sometimes only CPU0 /sys/devices/system/cpu/cpu0 has a directory named cpufreq/. Other CPU only has symlink file, which refer to cpu0/cpufreq/. Or other CPUs don't have cpufreq directory at all. For this situation, we only lock CPU0's freq, and we assume that all other CPUs' freq is locked to the same freq. We haven't find any documents or website to prove this, but we highly guess it's true from our profiling results.

Ref

原文地址:https://www.cnblogs.com/xjsxjtu/p/4203462.html