Cpufreq应用程序在arm开发板端的交叉编译及实现
Written by leeming
leeming.cublog.cn 转载请说明出处
1.内核选项:
Linux 动态变频管理 cpufreq 提供了操作系统级别的变频功能,同时需要用户层来制定和执行策略。cpufreq后台进程cpufreqd 就是用来监测系统的运行状况,并根据不同的状况设定 CPU 的工作频率的。
要想在用户层使用后台进程cpufreqd,首先需要在配置linux内核编译选项时选择CPU Frequency scaling功能选项, 其内有一些子选项,包含governor的选择和是否Enable CPUfreq debugging。 cpufreq有五种governor(将在10.1.3中介绍),要使cpufreqd正常运行,至少需要选择performance governor;在测试阶段往往希望看到系统变频信息,那么需要Enable CPUfreq debugging。在Enable CPUfreq debugging的前提下,在u-boot的linux启动参数bootargs加上loglevel=8 cpufreq.debug=<value>,就可以看到cpufreq的相应级别的运行信息。 <value>的值可以是 1、2、4,也可以是它们的或(3、5、6、7),具体意义如下:
1 to activate CPUfreq core debugging,
2 to activate CPUfreq drivers debugging(这是和SEP4020相关的调试), and
4 to activate CPUfreq governor debugging
后台进程 cpufreqd 需要用到三个库,分别是cpufreqd-2.2.1、cpufrequtils-002和 sysfsutils-2.1.0,这三个库都是 GNU 免费开源软件,我们对 cpufreqd-2.2.1、cpufrequtils-002 进行了一些修改,由于编译这三个库还是蛮麻烦的,因此我在君正发布的cpufreqd的开发包上对arm平台进行二次编译,这样减少了不少工作(做事要站在巨人的肩膀上,呵呵)首先你可以君正的官方ftp上下载这个包。
下面将介绍cpufreqd 在arm上的交叉编译和安装过程以及在目标板上安装和运行方法。
2.交叉编译:
●编译 sysfsutils-2.1.0
进入sysfsutils-2.1.0目录:
执行:./configure –prefix=<你希望安装的目录> --host=arm-linux
Make
Make install
●编译 cpufrequtils-002
需要对Makefile 中的两个变量重新赋值:
sysfsuitls_install_dir = <sysfsuitls_install_dir>
DESTDIR = <cpufrequtils_destdir>
其中<sysfsuitls_install_dir>为上文所述 sysfsuitls 的安装路径,<cpufrequtils_destdir>为自定义的cpufrequtils库的安装路径的前缀,DESTDIR 可以为空,cpufrequtils 的安装路径为$(DESTDIR)/usr.
把CROSS一栏改成 = arm-linux-
执行下列命令开始编译和安装:
执行make && make install
make install的过程中会报错:
/usr/bin/install: cannot stat `.libs/libcpufreq.lai': No such file or directory
make: *** [install-lib] Error 1
解决方法是将 ./libs/libcpufreq.la 拷贝为./libs/libcpufreq.lai, 并将内部的 installed=no 改为 installed=yes,
然后再make install,这样就会在刚才你安装目录下生成一个usr目录,里面有一大堆东西。
● 编译 cpufreqd-2.2.1
使用configure-ingenic.sh 配置脚本对编译和安装过程进行配置,首先需要在该脚本中定义下面三个路径
变量:
cpufreqd_install_dir= #It's the directory where you want to install cpufreqd
cpufrequtils_destdir= #It's the same as the DESTDIR in Makefile of cpufrequtils-002
sysfsuitls_install_dir= #It's the directory where you installed sysfsutils
另外我们的运行脚本中是基于mips的处理器的,所以这里面要针对我们的arm平台做一些处理,也就是下面的config选项改成基于arm的:
./configure --prefix=$cpufreqd_install_dir --host=arm-linux /……
这里要注意的是它把arm的选项都disable了,但是我在给sep4020做低功耗的时候同时也实现了apm技术,所以这里要打开它。
然后运行该脚本:./configure-ingenic.sh
该脚本会生成 Makefile 和 config.h,需要修改生成的 config.h 中的路径,这些路径为 cpufreqd 在目标板上运行时所需要的相关文件的路径。默认路径的前缀为编译时所设的在主机上的安装路径,需要改为在目标板上的相应路径(以下所设路径仅供参考):
/* Define this to configuration dir location */
#define CPUFREQD_CONFDIR "/etc/"
/* Define this to plugins dir location */
#define CPUFREQD_LIBDIR "/lib
/* Define this to local state dir location */
#define CPUFREQD_STATEDIR "/var/"
执行:make &&make install即完成编译安装
3.开发板端的配置:
● 只需要安装 sysfsutils-2.1.0 和 cpufreqd-2.2.1。cpufrequtils-002 在交叉编译阶段已静态连接到cpufreqd-2.2.1。
a. 安装 sysfsutils-2.1.0.
将主机<sysfsuitls_install_dir>/lib/下的 libsysfs.so、libsysfs.so.2、libsysfs.so.2.0.1 三个文件拷贝到目标板的/lib/或/usr/lib/下。
b. 安装 cpufreqd-2.2.1.
主机 <cpufreqd_install_dir>/lib/ 下的 cpufreqd_cpu.so 、 cpufreqd_governor_parameters.so 、
cpufreqd_programs.so 三个文件拷贝到目标板上的CPUFREQD_LIBDIR(在 config.h 中定义)路径下;
将主机<cpufreqd_install_dir>/sbin/cpufreqd 拷贝到目标板的/sbin/或/usr/sbin/下;
将主机<cpufreqd_install_dir>/bin/下的cpufreqd-get 和cpufreqd-set拷贝到目标板的/bin/或/usr/bin/下;
将主机<cpufreqd_install_dir>/etc/cpufreqd.conf拷贝到目标板上的CPUFREQD_CONFDIR(在config.h中定义)路径下(即etc).
●在目标板上运行 cpufreqd
注意要保证开发板文件系统下存在/var/run文件夹,否则会运行不起来的。
运行cpufreqd即按照默认的conf文件进行运行,
如果想看到cpufreqd 的运行信息,那么可以加-V选项,共有 0到 7八个信息级别,0 的信息最少,7 的最多。比如要想打印出各个 Rule的得分,可以执行:
# cpufreqd –V 6
●目标开发板的配置
首先根据系统需要来修改cpufreqd 的配置文件cpufreqd.conf,该配置文件决定了 cpufreqd的行为。Cpufreqd 及内核中的cpufreq驱动是针对桌面电脑开发的,其中很多和桌面相关的接口比如 acpi、apm等我们没有用到(apm我暂时还没打开,在内核中针对4020已实现),下面针对我们使用到的功能来介绍 cpufreqd.conf 的写法。它的完整介绍可参看<cpufreqd_install_dir>/share/man/man5/cpufreqd.conf.5。
cpufreqd.conf 分三个部分:General、Profile 和 Rule。
[General]
pidfile=/var/run/cpufreqd.pid //因为cpufreq是后台执行,kill的时候需要这个id号
poll_interval=2 //poll_interval(单位是秒,可以设为小数)是 cpufreqd 读取系统状态的时间间隔,每一次读取状态后,都会根据当前状态来给各个Rule 打分得分最高的Rule对应的 Profile将被执行,关于rule下面会详细谈
suspend_interval=10 //名为 Powersave Low 的 Profile 的执行时间长达 suspend_interval(单位是秒,应该设为整数)时,系统将自动进入睡眠状态
verbosity=0 //verbosity 指示 syslogd 后台进程记录 cpufreqd 进程的运行信息等级
#enable_remote=1 //如果想手动选择 cpufreqd 执行的 Profile, 需要在 cpufreqd.conf 的 General 栏中设置enable_remote=1.并在cpufreqd 命令后加上-m 选项,即可。这样就可以通过命令 cpufreqd-get 打印出 cpufreqd.conf 中所有可用的Profile,通过命令 cpufreqd-set n, 来选择执行第n 条profile.
[/General]
[Profile] 可以有多个profile
name=Performance High
minfreq=100% // minfreq 和 maxfreq定义了该 Profile 允许的频率范围,可以用绝对频率表示,单位默认是 KHz,比如 minfreq=42000 表示最低频率为 42MHz;也可以用内核允许的最高频率(由 u-boot的启动频率决定)的百分比表示
maxfreq=100%
policy=performance。 //performance 会让系统运行在指定频率范围[minfreq, maxfreq]内的最高频率,powersave 会让系统运行在[minfreq, maxfreq]内的最低频率
[/Profile]
[Profile]
name=Powersave Low
minfreq=42000
maxfreq=42000
policy=performance //即使是powersave我们使用的内核策略还是performance,其实这里也可以使用powersave,只要主频一样,那本质还是一样的
[/Profile]
每个 Rule的满分由自身条件的个数决定,有 n个条件的 Rule的满分是(100+n)%,比如上面所列的名为“CPU not busy”的Rule满分为 101%,名为“Movie Watcher”的Rule 满分为 102%。如果存在两个 Rule都为满分时,分数较高的Movie Watcher将被执行。如果两个Rule 得分相同,那么位置靠前的优先执行。
#full score=101%
[Rule] 可以有多个rule
name=CPU not busy // name是该 Rule的名字
cpu_interval=0-15 // cpu 的占有率范围, 比如cpu_interval=0-15表示 cpu 占用率为 0%~15%,
profile=Powersave Low
[/Rule]
#full score=102%
[Rule]
name=Movie Watcher
programs=mplayer,madplay // 表示当前运行的程序有 mplayer 或madplay
cpu_interval=0-100
profile=Performance High
[/Rule]